python pytorch 实战篇:a+b数字模型

部署运行你感兴趣的模型镜像


前言

看之前必须得去看我的理论篇,不然跟不上:python pytorch 从入门到精通 通俗易懂
实战篇终于出来啦!!!数字版a+b模型!
全部整体代码结尾自取

构思

输入两个数字 a , b ,输出他们的和

定义模型

我们就是输入两个数,输出一个数,那么我们就可以定义成:
2 (输入层) -> 4 (隐藏层) -> 1 (输出层)
所以我们可以得出

# define.py

import torch
import torch.nn as nn
import torch.nn.functional as F

class Adder(nn.Module):
    def __init__(self):
        super(Adder,self).__init__()
        
        self.layer = nn.Sequential(
            nn.Linear(2, 4),
            nn.ReLU(),
            nn.Linear(4, 1)
        )

    def forward(self, x):
        # 确保输入是二维张量
        x = x.unsqueeze(0).float()
        out = self.layer(x)
        # 将输出张量降维为一维张量
        return out.squeeze(0)
  • x.unsqueeze(0)unsqueeze(0) 方法的作用是在输入张量 x 的第 0 个维度插入一个新的维度。若输入 x 是一维张量 (input_features),那么 x.unsqueeze(0) 之后就会变成二维张量 (1, input_features),这里的 1 代表批量大小为 1。
  • out.squeeze(0)squeeze(0) 方法与 unsqueeze(0) 相反,它会移除张量中维度大小为 1 的第 0 个维度。由于网络输出是二维张量 (1, output_features),经过 squeeze(0) 后就会变回一维张量 (output_features)

定义数据集

我们可以把数据信息定义成这样:
((a,b,add [a,b的和]), ...)
我们就可以轻松地写出:

# define.py

class Dataset:
    def __init__(self, data):
        self.inp = torch.tensor(
            [[a, b] for a, b, _ in data],
            dtype=torch.int
        )

        self.out = torch.tensor(
            [[add] for _, _, add in data],
            dtype=torch.int
        )

    def __len__(self):
        return len(self.inp)
    
    def __getitem__(self, index):
        return self.inp[index], self.out[index]
  • __init__:定义输入输出列表
  • __len__:获取长度
  • __getitem__:获取搜引,这得要看你后面怎么写来定义

训练

我们的任务归属于回归任务所以我们使用
损失器:MSELoss
优化器:Adam

# train.py

from define import *

import torch
import torch.nn as nn
import torch.functional as F
import torch.optim as optim

import os

import random

# 超参数
EPOCHS = 1000
LR = 0.001

model = Adder() # 模型

# 转移设备
torch.device("cuda" if torch.cuda.is_available() else "cpu")

# 损失函数
loss_fn = nn.MSELoss()

# 优化器
optimizer = optim.Adam(model.parameters(), lr=LR)

# 数据
data = [(1,2,3),(4,5,9),(6,7,13)]
for _ in range(1000):
    a = random.randint(0, 100)
    b = random.randint(0, 100)
    add = a + b
    data.append((a, b, add))
dataset = Dataset(data)

# 训练
for epochin range(EPOCHS):
    for x, y in dataset:
        # 前向传播
        y_pred = model(x)

        # 计算损失
        loss = loss_fn(y_pred, y.float())

        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

	# 每 10 步 输出误差
    if epoch % 10 == 0:
        print(loss.item())

# 保存
torch.save(model, 'adder.pth')

优化(选看)

我们假如像要在原有的继续训练,我们可以加上一个判断:

# 模型
if os.path.exists('adder.pth'):
    model = torch.load('adder.pth', weights_only=False)
else:
    model = Adder()

训练时Ctrl+C退出自动保存

try:
    for epoch in range(EPOCHS):
    
    ... # 训练过程
    
except KeyboardInterrupt:
    pass
torch.save(model, 'adder.pth')
print("save")

运行

我们输入两个数字,然后输出他们的推理结果

from define import *

import torch

# 创建模型实例
model = Adder()
model = torch.load('adder.pth', weights_only=False)

while True:
    with torch.no_grad():  # 关闭梯度计算加速推理
        a = input("a:")
        b = input("b:")

        # 确保输入为浮点数
        input_tensor = torch.tensor([[int(a), int(b)]], dtype=torch.int)    # 输入必须是张量
        prediction = model(input_tensor)             # 输出也是张量
        print(round(prediction.item()))    # 输出
  • round四舍五入:因为输出的数字会有一点点的偏差,例如 0.00几 的,我们可以使用四舍五入来取整数

完成

好!现在完成了!!!
其实 人工智能 并不是那么复杂,只是一个模拟人脑的东西,只要训练数据、批次够多,什么都可以做

最终代码(含优化)

define.py

这是定义代码

import torch
import torch.nn as nn
import torch.nn.functional as F

class Adder(nn.Module):
    def __init__(self):
        super(Adder,self).__init__()
        
        self.layer = nn.Sequential(
            nn.Linear(2, 4),
            nn.ReLU(),
            nn.Linear(4, 1)
        )

    def forward(self, x):
        # 确保输入是二维张量
        x = x.unsqueeze(0).float()
        out = self.layer(x)
        # 将输出张量降维为一维张量
        return out.squeeze(0)

# 数据: ((a,b,a+b), ...)

class Dataset:
    def __init__(self, data):
        self.inp = torch.tensor(
            [[a, b] for a, b, _ in data],
            dtype=torch.int
        )

        self.out = torch.tensor(
            [[add] for _, _, add in data],
            dtype=torch.int
        )

    def __len__(self):
        return len(self.inp)
    
    def __getitem__(self, index):
        return self.inp[index], self.out[index]

train.py

训练代码

from define import *

import torch
import torch.nn as nn
import torch.functional as F
import torch.optim as optim

import os

import random

# 超参数
EPOCHS = 1000
LR = 0.001

# 模型
if os.path.exists('adder.pth'):
    model = torch.load('adder.pth', weights_only=False)
else:
    model = Adder()

torch.device("cuda" if torch.cuda.is_available() else "cpu")
print("run on",("cuda" if torch.cuda.is_available() else "cpu"))

# 损失函数
loss_fn = nn.MSELoss()

# 优化器
optimizer = optim.Adam(model.parameters(), lr=LR)

# 数据
data = [(1,2,3),(4,5,9),(6,7,13)]
for _ in range(1000):
    a = random.randint(0, 100)
    b = random.randint(0, 100)
    add = a + b
    data.append((a, b, add))

dataset = Dataset(data)

# 训练
try:
    for epoch in range(EPOCHS):
        for x, y in dataset:
            # 前向传播,只传入 x
            y_pred = model(x)

            # 计算损失
            loss = loss_fn(y_pred, y.float())

            # 反向传播
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()

        # if (loss.item()==0):
        #     print("end!! 0.0!!!")
        #     break
        # 打印损失
        if epoch % 10 == 0:
            print(loss.item())
except KeyboardInterrupt:
    pass

torch.save(model, 'adder.pth')
print("saving")

run.py

运行模型代码

from define import *

import torch
# import torch.nn as nn
# import torch.functional as F

# 创建模型实例
model = Adder()
model = torch.load('adder.pth', weights_only=False)

while True:
    with torch.no_grad():  # 关闭梯度计算加速推理
        a = input("a:")
        b = input("b:")

        # 确保输入为浮点数
        input_tensor = torch.tensor([[int(a), int(b)]], dtype=torch.int)    # 输入必须是张量
        prediction = model(input_tensor)             # 输出也是张量
        print(round(prediction.item()))    # 输出

adder.pth

到时候我再看看怎么上传吧(肯定是付费的,还是劝大家自己训练吧)
我有一个训练过很多次的模型,和一个。。。loss为0.0的模型(?!)

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think> 嗯,用户要求查找基于YOLOV11、pytorch、Flask、SpringBoot、Vue和MySQL的安全帽头盔检测系统的开发资料。这个需求很明确,用户可能是个开发者或者学生,正在做类似的项目。 从引用内容看,这个系统是个完整方案,包含前后端和深度学习模型。用户特意提到YOLOV11,说明需要最新的技术方案。考虑到YOLO系列更新快(v5到v11差异大),得注意版本兼容性问题。 准备分四个部分回复:首先是核心模型资料,因为YOLOV11是检测的关键;然后是前后端框架整合,这部分用户明确要求了Flask+SpringBoot+Vue;接着是数据库设计,MySQL的表结构设计很重要;最后是部署方案,用户可能关心实际落地。 关于YOLOV11部分:需要包含官方GitHub链接,因为Ultralytics维护得不错。还要提醒用户注意权重文件的选择,安全帽检测用预训练模型会更快。数据增强部分特别重要,工地场景的光照变化大。 前后端交互是难点:得说明清楚Flask怎么封装YOLO模型,SpringBoot如何提供REST API,Vue前端怎么调摄像头。用户可能对实时视频流处理感兴趣,所以补充了Gunicorn部署方案。 数据库设计方面:用户权限管理是刚需,参考内容里提到分管理员和普通用户。检测记录需要存图片路径和结果,MySQL的BLOB字段不适合大图,要提醒用OSS存储。 部署方案了两种:本地测试用Docker-compose最方便,生产环境用Nginx反向代理。GPU加速对YOLOV11很重要,但用户可能没有显卡,所以补充了CPU优化的提示。 安全问题不能忘:JWT token是标配,但很多人会忽略图片上传漏洞,特意提醒了后缀名检查。模型文件最好加密,不过这个属于进阶内容。 最后补了些实用建议:YOLOv11在PyTorch 2.0以上可能有兼容问题,element-plus的图标库有现成的安全帽图标可以用。用户如果做毕设,数据集建议扩充电力场景。 相关问题设计成递进的:从基础(模型训练)到优化(轻量化),再到扩展(多目标检测)。第三个问题特意提了摩托车头盔,因为交规最近严查这个。 </think> 基于YOLOV11 + PyTorch + Flask + SpringBoot + Vue + MySQL 的安全帽头盔检测系统开发资料整理如下,涵盖核心模块和关键技术点: --- ### **一、核心开发资料** 1. **YOLOV11 模型实现** - **官方资源**: - [Ultralytics YOLO GitHub](https://github.com/ultralytics/ultralytics)(YOLOV11 代码库) - 预训练权重下载:`yolov11s.pt`(小模型)、`yolov11m.pt`(中模型) - **安全帽检测适配**: ```python from ultralytics import YOLO model = YOLO('yolov11s.pt') # 加载预训练模型 results = model.train(data='helmet_dataset.yaml', epochs=100, imgsz=640) # 自定义数据集训练 ``` - **数据集标注要求**: - 类别标签:`helmet`(安全帽)、`person`(人)、`no_helmet`(未戴安全帽) - 建议格式:COCO 或 YOLO 格式 2. **前后端交互架构** ```mermaid graph LR A[Vue前端] -- HTTP请求 --> B(SpringBoot后端) B -- 调用API --> C[Flask深度学习服务] C -- 返回检测结果 --> B B -- 存储记录 --> D[(MySQL数据库)] ``` 3. **技术栈整合关键点** - **Flask 模型服务**(Python): ```python from flask import Flask, request, jsonify import cv2 import numpy as np app = Flask(__name__) model = YOLO('best.pt') # 加载训练好的权重 @app.route('/detect', methods=['POST']) def detect(): img = cv2.imdecode(np.frombuffer(request.files['image'].read(), np.uint8), cv2.IMREAD_COLOR) results = model(img)[0] return jsonify(results.boxes.cls.tolist()) # 返回检测类别 ``` - **SpringBoot 接口**(Java): ```java @RestController @RequestMapping("/api/detect") public class DetectionController { @PostMapping public ResponseEntity<Result> detectHelmet(@RequestParam MultipartFile image) { String flaskUrl = "http://localhost:5000/detect"; // 转发图片到Flask服务 Result result = restTemplate.postForObject(flaskUrl, image, Result.class); helmetRecordService.save(result); // 存储到数据库 return ResponseEntity.ok(result); } } ``` --- ### **二、数据库设计(MySQL)** | 表名 | 字段 | 说明 | |---------------|-----------------------|--------------------------| | `user` | id, username, role | 用户表(区分管理员/普通用户) | | `detection_record` | id, user_id, image_path, result, time | 检测记录表(关联用户) | --- ### **三、部署方案** 1. **服务拆分**: - **前端**:Vue3 + TypeScript + Element Plus,部署于 Nginx - **后端**:SpringBoot + MyBatis-Plus,打包为 Jar 运行 - **AI服务**:Flask + Gunicorn(WSGI 服务器) - **数据库**:MySQL 8.0 2. **Docker 部署示例**: ```dockerfile # Flask 服务 FROM python:3.9 RUN pip install torch flask gunicorn ultralytics COPY ./app /app CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"] ``` --- ### **四、扩展功能实现** 1. **摄像头实时检测(Vue 示例)**: ```vue <template> <video ref="video" autoplay></video> <button @click="capture">检测</button> </template> <script setup> import { ref } from 'vue'; const video = ref(null); const capture = async () => { const canvas = document.createElement('canvas'); canvas.getContext('2d').drawImage(video.value, 0, 0); const blob = await fetch(canvas.toDataURL('image/jpeg')).then(res => res.blob()); const formData = new FormData(); formData.append('image', blob, 'frame.jpg'); // 发送到SpringBoot接口 }; </script> ``` 2. **安全优化**: - **JWT 鉴权**:Spring Security 管理接口权限 - **图片校验**:限制上传文件类型(JPG/PNG) - **模型加密**:使用 PyTorch 的 `torch.jit.trace` 导出加密模型 --- ### **五、学习资源推荐** 1. [YOLOV11 官方文档](https://docs.ultralytics.com/) 2. [SpringBoot 整合 Flask 示例](https://github.com/spring-projects/spring-boot/tree/main/spring-boot-samples) 3. [Vue3 + TypeScript 实战教程](https://vuejs.org/guide/typescript/composition-api.html) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值