手写数字识别的LSTM神经网络实现-pytorch

LSTM神经网络的实现参考课程【RNN 循环神经网络】

训练数据获取

def dataLoader():
    # 获取Mnist手写数字数据集
    train_data = torchvision.datasets.MNIST(
        root='./mnist',         #保存或者提取位置
        train=True,             #如果为True则为训练集,如果为False则为测试集
        transform=torchvision.transforms.ToTensor(),    #将图片转化成取值[0,1]的Tensor用于网络处理
        download=False           #是否下载数据集
    )
    # plt.imshow(train_data.train_data[0].numpy(),cmap='gray')
    # plt.title('%i'%train_data.train_labels[0])
    # plt.show()
    loader = Data.DataLoader(
        dataset=train_data,
        batch_size=50,      #最小训练批量
        shuffle=True,       #是否对数据进行随机打乱
        num_workers=2,      #多线程来读数据
    )
    return loader

测试数据获取

def dataTest():
    #获取测试数据
    test_data = torchvision.datasets.MNIST(root='./mnist/', train=False)
    #测试前2000个数据
    test_x = torch.unsqueeze(test_data.test_data, dim=1).type(torch.FloatTensor)[:2000]/255.   # shape from (2000, 28, 28) to (2000, 1, 28, 28), value in range(0,1)
    test_y = test_data.test_labels[:2000]
    return test_x,test_y

网络搭建

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        #LSTM层
        self.rnn=nn.LSTM(
            input_size=28,                  #图片每行的像素点
            hidden_size=64,                 #隐藏层神经元个数
            num_layers=1,                   #RNN layers数量
            batch_first=True                #以批量为第一维度:(batch, time_step, input_size)
        )
        #全连接层
        self.out=nn.Linear(64,10)           #输出特征维度为10,:0-9的数字分类

    def forward(self, x):
        output,(h_n,h_c)=self.rnn(x,None)   #  # None 表示 hidden state 会用全0的 state
        #output维度:(batch, time_step, output_size),time_step表示rnn的时间步数或者图片高度
        #h_n维度:(n_layers, batch, hidden_size), LSTM的分线
        #h_c维度:(n_layers, batch, hidden_size), LSTM的主线

        #由于输出为时间序列,因而最终目标应该是最后时间点time_step的输出值
        output = self.out(output[:,-1,:])
        return output

手写数字识别的LSTM神经网络实现-pytorch_第1张图片

训练过程

if __name__=="__main__":
    #模拟数据
    loader=dataLoader()
    test_x,test_y=dataTest()
    net=Net()
    print(net)
    #定义优化器
    optimizer = torch.optim.Adam(net.parameters(), lr=0.01)
    #定义误差函数
    loss_fun=nn.CrossEntropyLoss()

    #迭代训练
    for epoch in range(1):
        for step, (batch_x, batch_y) in enumerate(loader):
            #预测
            batch_x=batch_x.view(-1,28,28)
            prediction=net(batch_x)
            #计算误差
            loss=loss_fun(prediction,batch_y)
            #梯度降为0
            optimizer.zero_grad()
            #反向传递
            loss.backward()
            #优化梯度
            optimizer.step()

训练结果

在这里插入图片描述

====================================
今天到此为止,后续记录其他神经网络技术的学习过程。
以上学习笔记,如有侵犯,请立即联系并删除!

你可能感兴趣的:(神经网络-pytorch,lstm,神经网络,pytorch)