lstm实现minist手写字符识别

import torch
from torch import nn
import torchvision.datasets as dsets
import torchvision.transforms as transforms
from torch.autograd import Variable
import matplotlib.pyplot as plt
import numpy as np
torch.manual_seed(1)    # reproducible

# Hyper Parameters
EPOCH = 1           # 训练整批数据多少次, 为了节约时间, 我们只训练一次
BATCH_SIZE = 64
TIME_STEP = 28      # rnn 时间步数 / 图片高度
INPUT_SIZE = 28     # rnn 每步输入值 / 图片每行像素
LR = 0.01           # learning rate
# DOWNLOAD_MNIST = False  # 如果你已经下载好了mnist数据就写上 Fasle
class RNN(nn.Module):
    def __init__(self):
        super(RNN, self).__init__()

        self.rnn = nn.LSTM(     # LSTM 效果要比 nn.RNN() 好多了
            input_size=28,      # 图片每行的数据28像素点
            hidden_size=64,     # rnn hidden unit
            num_layers=1,       # 有几层 RNN layers
            batch_first=True,   # input & output 会是以 batch size 为第一维度的特征集 e.g. (batch, time_step, input_size)
        )

        self.out = nn.Linear(64, 10)    # 输出层

    def forward(self, x):
        # x shape (batch, time_step, input_size)
        # r_out shape (batch, time_step, output_size)
        # h_n shape (n_layers, batch, hidden_size)   LSTM 有两个 hidden states, h_n 是分线, h_c 是主线
        # h_c shape (n_layers, batch, hidden_size)
        r_out, (h_n, h_c) = self.rnn(x, None)   # None 表示 hidden state 会用全0的 state


        # 选取最后一个时间点的 r_out 输出
        # 这里 r_out[:, -1, :] 的值也是 h_n 的值
        out = self.out(r_out[:, -1, :])
        return out
rnn = RNN()
print(rnn)
optimizer = torch.optim.Adam(rnn.parameters(), lr=LR)   # optimize all parameters
loss_func = nn.CrossEntropyLoss()   # the target label is not one-hotted
#以下是读测试数据:+++++++++++++++++++++++++++++++++++++++++++++++++++++
data_file = open("C:/Users/蟋蟀/Desktop/CNN-master/mnist_test.csv", 'r')
wude_data = data_file.readlines()
data_file.close()
ahh_data=[]
ahh_data0=[]
for i in range(2000):
  zhongjian_data = wude_data[i].split(',')
  zhongjian_data0 = zhongjian_data[0]
  zhongjian_data = np.asfarray(zhongjian_data[1:])/255
  zhongjian_data = zhongjian_data.tolist()
  ahh_data.append(zhongjian_data)
  ahh_data0.append(zhongjian_data0)
# print("zhongjian_data:")
# print(ahh_data)
ahh_data = np.array(ahh_data).reshape((2000,1,28,28))
ahh_data0 =np.asfarray(ahh_data0)
# print("after zhongjian_data:")
# print(ahh_data)
ahh_data=torch.Tensor(ahh_data)
print("读测试数据完成!")
data_file = open("C:/Users/蟋蟀/Desktop/CNN-master/mnist_train.csv", 'r')
try_train_data = data_file.readlines()
data_file.close()
train_x=[]
train_y=[]
for i in range(60000):
    zhongjian_data = try_train_data[i].split(',')
    zhongjian_data0 = zhongjian_data[0]
    zhongjian_data = np.asfarray(zhongjian_data[1:]) / 255
    zhongjian_data = zhongjian_data.tolist()
    train_x.append(zhongjian_data)
    train_y.append(zhongjian_data0)
train_x = np.array(train_x).reshape((-1,60,28,28))
train_y =np.asfarray(train_y)
train_y=train_y.reshape((-1,60))
train_x=torch.Tensor(train_x)
train_y=torch.tensor(train_y,dtype=torch.long)
print("读训练数据完成!")
print("进入训练:")
loss_print=[]
for i in range(1000) :
    x=train_x[i].view(-1,28,28)
    y=train_y[i]
    output = rnn(x)
    loss = loss_func(output, y)  # cross entropy loss
    optimizer.zero_grad()  # clear gradients for this training step
    loss.backward()  # backpropagation, compute gradients
    optimizer.step()
    if i%100==0:
       loss_print.append(loss.data)
plt.plot(loss_print)
plt.show()
test_output = rnn(ahh_data[10:20].view(-1, 28, 28))
pred_y = torch.max(test_output, 1)[1].data.numpy().squeeze()
print(pred_y, 'prediction number')
print(ahh_data0[10:20], 'real number')
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个基于python编写的基于MNIST数据集利用LSTM模型实现手写字符识别的代码样例,仅供参考: ``` import keras from keras.models import Sequential from keras.layers import Dense, Dropout, LSTM from keras.datasets import mnist from keras.callbacks import TensorBoard from keras.utils import to_categorical batch_size = 128 num_classes = 10 epochs = 5 hidden_size = 128 # 输入图片维度 img_rows, img_cols = 28, 28 # 加载mnist数据集 (x_train, y_train), (x_test, y_test) = mnist.load_data() # 改变形状,以适配LSTM模型 x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols) x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols) input_shape = (img_rows, img_cols) # 将数据转换为浮点类型,并转换为0到1之间的浮点数 x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 # 将标签转换为独热编码 y_train = to_categorical(y_train, num_classes) y_test = to_categorical(y_test, num_classes) # 创建LSTM模型 model = Sequential() model.add(LSTM(hidden_size, input_shape=input_shape, dropout=0.2)) model.add(Dense(num_classes, activation='softmax')) # 编译并训练模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) tb_callback = TensorBoard(log_dir='./logs', write_graph=True) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test), callbacks=[tb_callback]) # 评估模型 score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) ``` 希望这个代码样例能够对您有所帮助。如果您有任何其他问题,可以继续向我提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值