基于pytorch的MNIST数据集cnn手写识别,新手范例

基于pytorch的MNIST数据集cnn手写识别,新手范例

import torch as t
from torch.autograd import Variable as V
from torch.utils.data import DataLoader
import matplotlib.pyplot as plt
from torchvision import transforms
from torchvision.datasets import MNIST
from torch import optim
import torch.nn as nn

定义卷积神经网络结构

class Conv_net(nn.Module):
def init(self):
nn.Module.init(self)
# 定义卷积层
self.features = nn.Sequential(
# nn.BatchNorm2d(1),
nn.Conv2d(1,5,2,2,1),
nn.ReLU(),
nn.MaxPool2d(2,2),
nn.Conv2d(5,10,2,1,1),
nn.ReLU(),
nn.MaxPool2d(2,2)
)
# 定义全连接层
self.classifier = nn.Sequential(
nn.Linear(160,80),
nn.LeakyReLU(0.2),
nn.Linear(80,40),
nn.LeakyReLU(0.2),
nn.Linear(40,20),
nn.LeakyReLU(0.2),
nn.Linear(20,10),
nn.Softmax(1)
)
# 定义前向传播方法
def forward(self,x):
x = self.features(x)
z = x.view(-1,160)
y = self.classifier(z)
return y

网络实例化

net = Conv_net()
class train():
def init(self):
self.train_data_number = 5000
self.test_data_number = 1000
self.batch_size = 32
def get_data(self):
# 提取数据
dataset = MNIST(root=’./mnist/’, train=True, transform=transforms, target_transform=None, download=True)
ima_data = dataset.train_data
lab_data = dataset.train_labels
# 将图片数据添加通道数
ima_data = ima_data.view(-1,1,28,28)
# 随机选取训练集和测试集样本
idem = t.randint(low=0,high=ima_data.shape[0],size=[self.train_data_number])
idem_test = t.randint(low=0,high=ima_data.shape[0],size=[self.test_data_number])
# 从数据集中选取训练样本,将训练图像数据变为浮点数才能进行autograd
X_train = ima_data[idem].float()
train_lab = lab_data[idem]
# 从数据集中选取测试样本
X_test = ima_data[idem_test].float()
test_lab = lab_data[idem_test]
# 给标签扩展一维,才能进行one-hot
test_lab = test_lab.view(-1,1)
train_lab = train_lab.view(-1,1)
# 将标签转化成one-hot
Y_train = t.zeros(train_lab.shape[0],10).scatter_(1, train_lab, 1).long()
Y_test= t.zeros(test_lab.shape[0],10).scatter_(1, test_lab, 1).long()
# 批量化处理
m = t.randint(low=0, high=X_train.shape[0], size=[self.batch_size])
n = t.randint(low=0, high=X_test.shape[0], size=[self.batch_size])
train_img =X_train[m]
train_lab =Y_train[m]
test_img =X_test[n]
test_lab =Y_test[n]
return train_img,train_lab,test_img,test_lab
# 定义训练模块
def train(self,epoach):
batch_size = 32
# 定义优化器,使用Adam
optimizer = optim.Adam(net.parameters(),lr=0.0001)
# 定义损失函数
criterion = nn.MultiLabelSoftMarginLoss()
loss_list=[]
test_loss_list=[]
# 定义训练和测试过程
for i in range(epoach):
trainimg,trainlab,X_test,Y_test = self.get_data()
output = net(trainimg)
loss = criterion(output,trainlab)
# 将导数清零
optimizer.zero_grad()
# 反向传播
loss.backward()
# 更新参数
optimizer.step()
# 计算测试集损失
predict = net(X_test)
test_loss = criterion(predict,Y_test)
print(‘epoach:%5d,train_loss:%.4f,test_loss:%.4f’ % (i,loss,test_loss))
if i %100==0:
loss_list.append(loss.data)
test_loss_list.append(test_loss.data)
return(loss_list,test_loss_list)
demo = train()
epoach = 10000
loss_list=[]
test_loss_list =[]
loss_list,test_loss_list=demo.train(epoach)

画图

plt.plot(t.arange(0,epoach,100),loss_list,‘b’,label=‘train loss’)
plt.plot(t.arange(0,epoach,100),test_loss_list,‘r’,label=‘valid loss’)
plt.legend()
plt.xlabel(‘epoachs’)
plt.ylabel(‘loss’)
plt.show()在这里插入代码片`)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值