循环神经网络是一类专门处理序列数据的神经网络循环神经网络的每个神经元具有两个输入一个当前时间步的输入和一个前一时刻的隐藏状态通过这两个输入产生当前时刻的隐藏状态。RNN的核心优势在于可以处理变长序列参数共享和具备记忆能力。1、RNN参数详解import torch from torch import nn torch.nn.RNN(input_size,hidden_size,num_layers,nonlinerity,bias,batch_first,dropout,didirectional)1、input_size每个时间步的输入向量维度即单个输入大小2、hidden_size隐藏状态维度即RNN中神经元的个数3、num_layersRNN堆叠层数4、nonlineraity计算隐藏状态的激活函数tanh或relutiona5、bias是否使用偏置6、batch_first输入是否为batch,time_step,input_size)7、dropout是否使用丢弃学习8、bidirectional是否使用双向RNN2、示例代码import torch from torch import nn from torchvision import transforms,datasets import torch.utils.data as Data torch.cuda.empty_cache() devicetorch.device(cuda:0 if torch.cuda.is_available() else cpu) BATCH_SIZE50 TIME_SIZE50 INPUT_SIZE50 transformtransforms.Compose([ transforms.Resize((50,50)), transforms.ToTensor(), transforms.Normalize((0.1307,),( 0.3081,)) ]) train_datadatasets.MNIST( rootD:/mypython/MNISTdataset, trainTrue, downloadTrue, transformtransform ) train_loaderData.DataLoader(datasettrain_data,batch_sizeBATCH_SIZE,shuffleTrue) traintest,labeltestnext(iter(train_loader)) #print(traintest.shape) #print(labeltest.shape) test_datadatasets.MNIST( rootD:/mypython/MNISTdataset, trainFalse, transformtransform ) test_loaderData.DataLoader(datasettest_data,batch_size50,shuffleFalse) test_x,test_ynext(iter(test_loader)) #print(test_x.size()) #print(test_y.size()) class RNN(nn.Module): def __init__(self): super(RNN,self).__init__() self.rnnnn.GRU( input_sizeINPUT_SIZE, hidden_size50, num_layers1, batch_firstTrue, bidirectionalTrue ) self.outnn.Linear(5000,10) def forward(self,x): r_out,(h_n,h_c)self.rnn(x,None) r_outr_out.reshape(r_out.size(0),-1) outputself.out(r_out) return output modelRNN() modelmodel.to(devicedevice) optimizertorch.optim.Adam(model.parameters(),lr0.01) loss_funcnn.CrossEntropyLoss() for step,(x,y) in enumerate(train_loader): xx.squeeze(1) b_xx.to(devicedevice) b_yy.to(devicedevice) outputmodel(b_x) lossloss_func(output,b_y) optimizer.zero_grad() loss.backward() optimizer.step() if step%1000: test_xtest_x.squeeze(1) t_xtest_x.to(devicedevice) t_ytest_y.to(devicedevice) test_outputmodel(t_x) pred_ytorch.max(test_output,1)[1].data.squeeze() accuracy(pred_yt_y).sum().item()/float(test_y.size(0)) print(train loss%.4f %loss.data,|test accuracy:%.2f %accuracy)