pyqt5手写板+pytorch卷积神经网络,实现手写数字识别软件

卷积神经网络的结构

#定义网络结构
#不是le-net5的结构
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        # Sequential表示在搭建网络模型中要执行的一系列的步骤
        # Dropout中,p=0.5表示50%的神经元不工作
        # layer3:输出层 一般输出层中不需要加Dropout
        # Conv2d Conv:卷积 2d:表示2维的卷积
        # nn.Conv2d的几个参数
        # 1:输入通道数:1表示黑白的图片 彩色的话就是3
        # 32:输出通道数:表示要生成多少个特征图
        # 5:是卷积核的大小,(5,5)表示是5*5的窗口。可以只写一个5
        # 1表示步长。步长默认值就是1
        # 2表示在padding外面填2圈0 这个相当于samepadding
        # nn.MaxPool2d的几个参数
        # 第一个2是池化的窗口的大小是2*2 第二个2表示步长为2
        self.conv1 = nn.Sequential(nn.Conv2d(1,32,5,1,2),nn.ReLU(),nn.MaxPool2d(2,2))
        self.conv2 = nn.Sequential(nn.Conv2d(32,64,5,1,2),nn.ReLU(),nn.MaxPool2d(2,2))
        self.fc1 = nn.Sequential(nn.Linear(64*7*7,1000),nn.Dropout(p=0.5),nn.ReLU())
        self.fc2 = nn.Sequential(nn.Linear(1000,10),nn.Softmax(dim=1))
        # dim=1代表对第一个维度,计算概率值
        # 因为batch = 64
        # 所以fc1输出的是(64,10)
        # 所以dim=1,表示对第二个维度进行softmax求值
    def forward(self,x):
        # ([64,1,28,28])变成2维的数据->(64,784) 全连接层做计算,必须是2维的数据
        # x = x.view(x.size()[0],-1)
        # 但是卷积只能对四维的数据进行计算 ([64,1,28,28])
        # 64表示批次的数量,1表示通道数 28表示长宽
        x = self.conv1(x)
        x = self.conv2(x)

        #将原来x四维的数据,改变为2维的数据
        # (64,64,7,7)
        x = x.view(x.size()[0],-1)

        x = self.fc1(x)
        x = self.fc2(x)
        return x

代价函数是交叉熵,优化器是Adam,基于mnist数据集训练,30轮。

手写板的一部分代码,是借鉴的网络上的,然后我又将其魔改一番,最终形成了一个界面。运行好的效果,如下图所示。

识别结果是自动识别的,点击清空画板,画板就会清空,然后识别结果会变成99999。写下数字之后,便会自动识别。几乎是0延迟,预测结果非常的快! 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
要在PyQt5中显示卷积神经网络的训练过程,可以使用QChart组件和QLineSeries组件。QChart是一个图表组件,可以显示折线图、柱状图等;QLineSeries是一个QChart的子组件,用于绘制折线图。以下是一个简单的实现步骤: 1. 导入必要的模块: ```python from PyQt5.QtChart import QChart, QChartView, QLineSeries from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QMainWindow ``` 2. 创建一个QLineSeries实例,并将其添加到QChart中: ```python series = QLineSeries() chart = QChart() chart.addSeries(series) ``` 3. 创建一个QChartView实例,并将其设置为主窗口的中心窗口: ```python chart_view = QChartView(chart) self.setCentralWidget(chart_view) ``` 4. 在训练过程中,将每个epoch的损失值添加到QLineSeries中,并在每次添加后调用repaint()方法刷新窗口: ```python for epoch in range(num_epochs): # 训练代码 loss = train_model(...) series.append(epoch, loss) chart.createDefaultAxes() chart.axisX().setRange(0, num_epochs) chart.axisY().setRange(min_loss, max_loss) chart.legend().hide() chart_view.repaint() ``` 完整代码示例: ```python from PyQt5.QtChart import QChart, QChartView, QLineSeries from PyQt5.QtGui import QPainter from PyQt5.QtWidgets import QMainWindow class MainWindow(QMainWindow): def __init__(self, parent=None): super().__init__(parent) # 创建QLineSeries和QChart self.series = QLineSeries() self.chart = QChart() self.chart.addSeries(self.series) # 创建QChartView并设置为中心窗口 self.chart_view = QChartView(self.chart) self.setCentralWidget(self.chart_view) # 定义x轴和y轴范围 self.min_loss = 0 self.max_loss = 1 # 显示窗口 self.show() def train_model(self, num_epochs): for epoch in range(num_epochs): # 训练代码 loss = train_model(...) # 将损失值添加到QLineSeries中 self.series.append(epoch, loss) # 设置x轴和y轴范围 self.chart.createDefaultAxes() self.chart.axisX().setRange(0, num_epochs) self.chart.axisY().setRange(self.min_loss, self.max_loss) # 隐藏图例 self.chart.legend().hide() # 刷新窗口 self.chart_view.repaint() ```
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值