网站内页做友情链接,买卖交易平台,wordpress js加载慢,h5网站建设公司使用RNN对MNIST手写数字进行分类。RNN和LSTM模型结构
pytorch中的LSTM的使用让人有点头晕#xff0c;这里讲述的是LSTM的模型参数的意义。 1、加载数据集
import torch
import torchvision
import torch.nn as nn
import torchvision.transforms as transforms
import torc…使用RNN对MNIST手写数字进行分类。RNN和LSTM模型结构
pytorch中的LSTM的使用让人有点头晕这里讲述的是LSTM的模型参数的意义。 1、加载数据集
import torch
import torchvision
import torch.nn as nn
import torchvision.transforms as transforms
import torch.utils.data as Data device torch.device(cuda if torch.cuda.is_available() else cpu)sequence_length 28
input_size 28
hidden_size 128
num_layers 2
num_classes 10
batch_size 128
num_epochs 2
learning_rate 0.01 train_dataset torchvision.datasets.MNIST(root./data/,trainTrue,transformtransforms.ToTensor(),downloadTrue)
test_dataset torchvision.datasets.MNIST(root./data/,trainFalse,transformtransforms.ToTensor())train_loader Data.DataLoader(datasettrain_dataset,batch_sizebatch_size,shuffleTrue)
test_loader Data.DataLoader(datasettest_dataset,batch_sizebatch_size) 2、构建RNN模型 input_size – 输入的特征维度 hidden_size – 隐状态的特征维度 num_layers – 层数和时序展开要区分开 bias – 如果为False那么LSTM将不会使用默认为True。 batch_first – 如果为True那么输入和输出Tensor的形状为(batch, seq, feature) dropout – 如果非零的话将会在RNN的输出上加个dropout最后一层除外。 bidirectional – 如果为True将会变成一个双向RNN默认为False 1、上面的参数来自于文档最基本的参数是input_size, hidden_size, num_layer三个。input_size输入数据向量维度在这里为28hidden_size隐藏层特征维度也是输出的特征维度这里是128num_layerslstm模块个数这里是2。 2、h0和c0的初始化维度为num_layerbatch_size, hidden_size 3、lstm的输出有out和hncn其中out.shape torch.Size([128, 28, 128])对应batch_size时序数隐藏特征维度也就是保存了28个时序的输出特征因为做的分类所以只需要最后的输出特征。所以取出最后的输出特征进行全连接计算全连接计算的输出维度为1010分类。 4、batch_first这个参数比较特殊如果为true那么输入数据的维度为batch, seq, feature否则为seq, batch, feature 5、num_layerslstm模块个数如果有两个那么第一个模块的输出会变成第二个模块的输入。 总结构建一个LSTM模型要用到的参数输入数据的特征维度隐藏层的特征维度lstm模块个数时序的个数体现在X中, X.shape (batch_size, 时序长度 数据向量维度)。 可以理解为LSTM可以根据我们的输入来实现自动的时序匹配从而达到输入长短不同的功能。
class RNN(nn.Module):def __init__(self, input_size,hidden_size,num_layers, num_classes):super(RNN, self).__init__()self.hidden_size hidden_sizeself.num_layers num_layers#input_size - 输入特征维度#hidden_size - 隐藏状态特征维度#num_layers - 层数和时序展开要区分开lstm模块的个数#batch_first为true输入和输出的形状为batch, seq, featuretrue意为将batch_size放在第一维度否则放在第二维度self.lstm nn.LSTM(input_size,hidden_size,num_layers,batch_first True) self.fc nn.Linear(hidden_size, num_classes)def forward(self,x):#参数LSTM单元个数 batch_size 隐藏层单元个数 h0 torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device) #h0.shape (2, 128, 128)c0 torch.zeros(self.num_layers, x.size(0), self.hidden_size).to(device)#输出output : (seq_len, batch, hidden_size * num_directions)#h_n, c_n:最后一个时间步的隐藏状态和细胞状态#对out的理解维度batch, eq_len, hidden_size其中保存着每个时序对应的输出所以全连接部分只取最后一个时序的#out第一维batch_size第二维时序的个数第三维隐藏层个数所以和lstm单元的个数是无关的out,_ self.lstm(x, (h0, c0)) #shape torch.Size([128, 28, 128])out self.fc(out[:,-1,:]) #因为batch_first true所以维度顺序batch, eq_len, hidden_sizereturn out 训练部分
model RNN(input_size,hidden_size, num_layers, num_classes).to(device)
print(model)#RNN(
# (lstm): LSTM(28, 128, num_layers2, batch_firstTrue)
# (fc): Linear(in_features128, out_features10, biasTrue)
#)criterion nn.CrossEntropyLoss()
optimizer torch.optim.Adam(model.parameters(), lrlearning_rate)total_step len(train_loader)
for epoch in range(num_epochs):for i,(images, labels) in enumerate(train_loader):#batch_size -1, 序列长度 28 数据向量维度 28images images.reshape(-1, sequence_length, input_size).to(device)labels labels.to(device)# Forward passoutputs model(images)loss criterion(outputs, labels)# Backward and optimizeoptimizer.zero_grad()loss.backward() optimizer.step()if (i1) % 100 0:print(outputs.shape)print (Epoch [{}/{}], Step [{}/{}], Loss: {:.4f} .format(epoch1, num_epochs, i1, total_step, loss.item())) # Test the model
with torch.no_grad():correct 0total 0for images, labels in test_loader:images images.reshape(-1, sequence_length, input_size).to(device)labels labels.to(device)outputs model(images)_, predicted torch.max(outputs.data, 1)total labels.size(0)correct (predicted labels).sum().item()print(Test Accuracy of the model on the 10000 test images: {} %.format(100 * correct / total))