pytorchlstm的一个简单例子:实现mnist图片分类

Picassooo Picassooo     2022-12-24     725

关键词:

上一篇博客中,我们实现了用LSTM对单词进行词性判断,本篇博客我们将实现用LSTM对MNIST图片分类。MNIST图片的大小为28*28,我们将其看成长度为28的序列,序列中的每个数据的维度是28,这样我们就可以把它变成一个序列数据了。代码如下,代码中的模型搭建参考了文末的参考资料[1],其余部分参考了文末的参考资料[2]。

\'\'\'
本程序实现用LSTM对MNIST进行图片分类
\'\'\'

import torch
import numpy as np
import torch.nn as nn
import torch.utils.data as Data
import torchvision
import matplotlib.pyplot as plt


# Hyper parameter
EPOCH = 1
LR = 0.001    # learning rate
BATCH_SIZE = 50

# Mnist digit dataset
train_data = torchvision.datasets.MNIST(
    root=\'/Users/wangpeng/Desktop/all/CS/Courses/Deep Learning/mofan_PyTorch/mnist/\',    # mnist has been downloaded before, use it directly
    train=True,    # this is training data
    transform=torchvision.transforms.ToTensor(),    # Converts a PIL.Image or numpy.ndarray to
                                                    # torch.FloatTensor of shape (C x H x W) and normalize in the range [0.0, 1.0]
    download=False,
)

# print(train_data.data.size())       # (60000, 28, 28)
# print(train_data.targets.size())    # (60000)
# plot one image
# plt.imshow(train_data.data[0].numpy(), cmap=\'gray\')
# plt.title(\':d\'.format(train_data.targets[0]))
# plt.show()

# Data Loader for easy mini-batch return in training, the image batch shape will be (50, 1, 28, 28)
train_loader = Data.DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)

test_data = torchvision.datasets.MNIST(
    root=\'/Users/wangpeng/Desktop/all/CS/Courses/Deep Learning/mofan_PyTorch/mnist/\',
    train=False,  # this is training data
)
# print(test_data.data.size())       # (10000, 28, 28)
# print(test_data.targets.size())    # (10000)
# pick 2000 samples to speed up testing
test_x = test_data.data.type(torch.FloatTensor)[:2000]/255    # shape (2000, 28, 28), value in range(0,1)
test_y = test_data.targets[:2000]


class LSTMnet(nn.Module):
    def __init__(self, in_dim, hidden_dim, n_layer, n_class):
        super(LSTMnet, self).__init__()
        self.n_layer = n_layer
        self.hidden_dim = hidden_dim
        self.lstm = nn.LSTM(in_dim, hidden_dim, n_layer, batch_first=True)
        self.linear = nn.Linear(hidden_dim, n_class)

    def forward(self, x):                  # x\'s shape (batch_size, 序列长度, 序列中每个数据的长度)
        out, _ = self.lstm(x)              # out\'s shape (batch_size, 序列长度, hidden_dim)
        out = out[:, -1, :]                # 中间的序列长度取-1,表示取序列中的最后一个数据,这个数据长度为hidden_dim,
                                           # 得到的out的shape为(batch_size, hidden_dim)
        out = self.linear(out)             # 经过线性层后,out的shape为(batch_size, n_class)
        return out


model = LSTMnet(28, 64, 2, 10)             # 图片大小28*28,lstm的每个隐藏层64个节点,2层隐藏层
if torch.cuda.is_available():
    model = model.cuda()

optimizer = torch.optim.Adam(model.parameters(), lr=LR)
criterion = nn.CrossEntropyLoss()

# training and testing
for epoch in range(EPOCH):
    for iteration, (train_x, train_y) in enumerate(train_loader):    # train_x\'s shape (BATCH_SIZE,1,28,28)
        train_x = train_x.squeeze()        # after squeeze, train_x\'s shape (BATCH_SIZE,28,28),
                                           # 第一个28是序列长度,第二个28是序列中每个数据的长度。
        output = model(train_x)
        loss = criterion(output, train_y)  # cross entropy loss
        optimizer.zero_grad()              # clear gradients for this training step
        loss.backward()                    # backpropagation, compute gradients
        optimizer.step()                   # apply gradients

        if iteration % 100 == 0:
            test_output = model(test_x)
            predict_y = torch.max(test_output, 1)[1].numpy()
            accuracy = float((predict_y == test_y.numpy()).astype(int).sum()) / float(test_y.size(0))
            print(\'epoch::<2d | iteration::<4d | loss::<6.4f | accuracy::<4.2f\'.format(epoch, iteration, loss, accuracy))


# print 10 predictions from test data
test_out = model(test_x[:10])
pred_y = torch.max(test_out, dim=1)[1].data.numpy()
print(\'The predict number is:\')
print(pred_y)
print(\'The real number is:\')
print(test_y[:10].numpy())

结果如下:

下图为本文的神经网络处理单张图片的过程:

 

参考资料:

[1] 10分钟快速入门PyTorch (6)

[2] 莫烦PyTorch教程系列:CNN卷积神经网络

使用java实现快速排序的一个简单例子

publicstaticvoidmain(String[]args) //测试排序 Randomr=newRandom(); intarr[]=newint[10]; for(inti=0;i<10;i++) arr[i]=r.nextInt(100); System.out.println("beforesort"); for(inti:arr) S 查看详情

pytorchlstm实现中文单词预测(附完整训练代码)(代码片段)

PytorchLSTM实现中文单词预测(附完整训练代码)目录Pytorch LSTM实现中文单词预测(词语预测附完整训练代码)1、项目介绍2、中文单词预测方法(N-Gram模型)3、训练词嵌入word2vec(可选)4、文本预处理(1&... 查看详情

pytorchlstm词性判断

首先,我们定义好一个LSTM网络,然后给出一个句子,每个句子都有很多个词构成,每个词可以用一个词向量表示,这样一句话就可以形成一个序列,我们将这个序列依次传入LSTM,然后就可以得到与序列等长的输出,每个输出都... 查看详情

logistic回归与手写识别例子的实现

本文主要介绍logistic回归相关知识点和一个手写识别的例子实现一、logistic回归介绍:logistic回归算法很简单,这里简单介绍一下:1、和线性回归做一个简单的对比下图就是一个简单的线性回归实例,简单一点就是一个线性方程... 查看详情

pytorchlstm实现中文单词预测(附完整训练代码)(代码片段)

PytorchLSTM实现中文单词预测(附完整训练代码)目录Pytorch LSTM实现中文单词预测(词语预测附完整训练代码)1、项目介绍2、中文单词预测方法(N-Gram模型)3、训练词嵌入word2vec(可选)4、文本预处理(1&... 查看详情

pytorchlstm实现中文单词预测(附完整训练代码)(代码片段)

PytorchLSTM实现中文单词预测(附完整训练代码)目录Pytorch LSTM实现中文单词预测(词语预测附完整训练代码)1、项目介绍2、中文单词预测方法(N-Gram模型)3、训练词嵌入word2vec(可选)4、文本预处理(1&... 查看详情

用socket.io实现websocket的一个简单例子

http://biyeah.iteye.com/blog/1295196 socket.io的介绍http://www.cnblogs.com/mazg/p/5467960.html  websocket在线测试http://www.blue-zero.com/WebSocket/ 查看详情

tensorflow实现一个简单线性回归的例子(代码片段)

1__author__="WSX"2importtensorflowastf3importnumpyasnp4importmatplotlib.pyplotasplt56x_data=np.linspace(-0.5,0.5,200)[:,np.newaxis]#-0.5--0.5之间产生200个点存到后面的2维中7noise=np.random.normal(0,0.02,x_data.shap 查看详情

pythondjangotdd实现一个带简单注册的记事本例子

1.新建django应用  NotPad2.新建项目note3.新建功能测试          mkdirfunction_test        touchfunction_test/__init_ 查看详情

jbpm工作流——实现一个简单的工作流例子

...,它是覆盖了业务流程管理、工作流、服务协作等领域的一个开源的、灵活的、易扩展的可执行流程语言框架。二、为什么用JBPM 业务分析师和开发人员使用的是同一种语言来交谈,大大降低了开发的风险,如果要开发一个... 查看详情

求一个c#最简单的tcp传输信息例子(实现聊天和传送文件,再简单点实现聊天也行)

就是在服务器端与客户端可以发送或者接收信息的那种。。。小弟邮箱:408926373@qq.com谢谢!给你点建议吧,服务器端负责保存你所有好友的IP及端口信息,即套接字信息,你双击你的好友(任意)时,你需要连接服务器给你的套接字,成... 查看详情

抽象工厂类--一个简单的例子

一:利用抽象工厂建造一个加减乘除运算器:下面是具体的代码实现:Cal抽象方法:packagecom.hbc.factory;publicabstractclassCal{publicabstractintgetResult(inta,intb);}Add:packagecom.hbc.factory;publicclassAddextendsCal{@OverridepublicintgetRes 查看详情

一个简单的弹出alv窗口例子

利用SALV可以简单的实现一个alv弹出窗口,代码如下: 123456789101112131415161718192021222324252627282930313233REPORTztest_salv_popup.DATAgo_alvTYPEREFTOcl_salv_table.DATA:git_alvTYPESTANDARDTABLEOFekko.DATA:lr_functions 查看详情

go语言实现一个简单的登录注册web小程序

...员,所以对web更感兴趣。根据《goweb编程》中的例子改编一个更简单的例子,供新手参考,废话不多说,上菜:    这个例子使用到了beego框架和beedb框架,如果是go新手beego和beedb得自己去google下载安装。  目... 查看详情

luence简单实现1

...,仅供小白路过参考。如有错误,欢迎指正批评。 建一个简单工程,并且加入这几个小奶瓶,如下图:注:版本不同,可能对jdk的需求是不同的,这个需要注意,我在尝试的6.1.0的时候,在jdk1.7下会报错,在java8下就没问题... 查看详情

js排列组合的一个简单例子

最近工作项目需要用到js排列组合,于是就写了一个简单的demo。前几天在网上找到一个写全排列A(n,n)的code感觉还可以,于是贴出来了,排列的实现方式: 全排列主要用到的是递归和数组的插入 比如12的全排列,首先把1拿... 查看详情

多线程使用线程池实现一个简单线程池(代码片段)

@TOC为什么要引入线程池我们知道我们每次创建启动销毁一个线程的消耗是较大的所以引入线程池的最大的好处就是减少每次启动销毁线程的损耗那么他是如何实现减少的?简单举个例子:为什么线程池子比系统申请释放快?为了... 查看详情

javascript设计模式--简单工厂模式例子---xhr工厂

第一步,Ajax操作接口(目的是起一个接口检测作用)  (1)引入接口文件//定义一个静态方法来实现接口与实现类的直接检验//静态方法不要写出Interface.prototype,因为这是写到接口的原型链上的//我们要把静态的函数直接... 查看详情