手写字识别

import numpy as np
import torch
from torchvision.datasets import mnist #导入pytorch内置的mnist数据
from torch import nn
from torch.autograd import Variable

下载数据集

train_set=mnist.MNIST('./data',train=True,download=True)
test_set=mnist.MNIST('./data',train=False,download=True)

a_data,a_lable=train_set[0] #将第一个数据展示出来

a_data

a_lable

 #前面读入的数据是pil库中的割视,将其转换为numpy array

a_data=np.array(a_data,dtype='float32')       
print(a_data.shape) 

print(a_data) 

def data_tf(x):
    x=np.array(x,dtype='float32')/255
    x=(x-0.5)/0.5
    x=x.reshape((-1,))
    x=torch.from_numpy(x)
    return x
train_set=mnist.MNIST('./data',train=True,transform=data_tf,download=True)
test_set=mnist.MNIST('./data',train=False,transform=data_tf,download=True)

a,a_lable=train_set[0]
print(a.shape)
print(a_lable)

 

from torch.utils.data import DataLoader
train_data=DataLoader(train_set,batch_size=64,shuffle=True)
test_data=DataLoader(test_set,batch_size=128,shuffle=False)

a,a_lable=next(iter(train_data))#用iter将数组转化为lterator,next会不断返回下一个元素

print(a.shape)
print(a_lable.shape)

 

#使用Sequential定义4层神经网络
net=nn.Sequential(
    nn.Linear(784,400),
    nn.ReLU(),
    nn.Linear(400,200),
    nn.ReLU(),
    nn.Linear(200,100),
    nn.ReLU(),
    nn.Linear(100,10)
)

criterion=nn.CrossEntropyLoss()
optimizer=torch.optim.SGD(net.parameters(),1e-1)

losses=[]
acces=[]
eval_losses=[]
eval_acces=[]
for e in range(20):
    train_loss=0
    train_acc=0
    net.train()
    for im,lable in train_data:
        im=Variable(im)
        lable=Variable(lable)
        out=net(im)
        loss=criterion(out,lable)
        optimizer.zero_grad()
        loss.backward()
        train_loss+=loss.item()
        _,pred=out.max(1)
        num_correct=(pred==lable).sum().item()  #统计标签与标签的正确性
        acc=num_correct/im.shape[0]
       
        train_acc+=acc
    losses.append(train_loss/len(train_data))
    acces.append(train_acc/len(train_data))
    eval_loss=0
    eval_acc=0
    net.eval()
    for im, lable in test_data:
        im=Variable(im)
        lable=Variable(lable)
        out=net(im)
        loss=criterion(out,lable)
        eval_loss+=loss.item()
        _,pred=out.max(1)
        num_correct=(pred==lable).sum().item()
        acc=num_correct/im.shape[0]
        eval_acc+=acc
    eval_losses.append(eval_loss/len(test_data))
    eval_acces.append(eval_acc/len(test_data))
    print('epoch: {}, Train Loss: {:.6f}, Train Acc: {:.6f}, Eval Loss: {:.6f}, EvalAcc: {:.6f}'.format(e, train_loss / len(train_data), train_acc / len(train_data),
eval_loss / len(test_data), eval_acc / len(test_data)))

 

我们可以画出train loss,train acc,test loss,test acc的图

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值