《深度学习之Pytorch实战计算机视觉》阅读笔记 第10章:循环神经网络
1. 循环神经网络
- 主要用于处理序列相关问题
- 可以随意控制输入数据及输出数据的数量
- 简化模型
- 展开模型
是最初输入的隐藏层,在一般情况下该隐藏层使用零进行初始化,即全部参数都是零
- RNN展开
W表示权重参数,tanh是使用的激活函数
计算公式如下:%0A#card=math&code=H%7Bt%2B1%7D%3Dtanh%28H_t%5Ctimes%20W%7BHH%7D%2BX%7Bt%2B1%7D%5Ctimes%20W%7BXH%7D%29%0A&height=20&id=ujlY1)
则输出结果为:RNN能够很好的对输入的序列数据进行处理,但是不能长期记忆。如果近期输入的数据发生了变化,则会对当前的输出结果产生重大影响。
2. 手写数字识别
RNN模型 RNN定义中的一些参数:
class RNN(torch.nn.Module):
def __init__(self):
super(RNN,self).__init__()
self.rnn=torch.nn.RNN(
input_size=28,
hidden_size=128,
num_layers=1,
batch_first=True
)
self.output=torch.nn.Linear(128,10)
def forward(self,input):
output,_=self.rnn(input,None)
output=self.output(output[:,-1,:])
return output
- input_size:用于指定输入数据的特征数
- hidden_size:指定最后隐藏层的输出特征数
- num_layers:RNN循环层的堆叠数量,default=1
- bias:偏置,default=True
- batch_fist:在RNN模型的输入层和输出层用到的数据默认维度是(seq,batch,feature),如果指定参数为True,输入层和输出层的数据维度对应为(batch,seq,feature)
数据加载
transform =transforms.Compose([
transforms.ToTensor(),
# 灰度图通道数是1
transforms.Normalize([0.5],[0.5])
])
dataset_train=datasets.MNIST(
root='../data',
transform=transform,
train=True,
download=True
)
dataset_test=datasets.MNIST(
root="../data",
transform=transform,
train=False
)
train_load=torch.utils.data.DataLoader(
dataset=dataset_train,
batch_size=64,
shuffle=True
)
test_load=torch.utils.data.DataLoader(
dataset=dataset_test,
batch_size=64,
shuffle=True
)
训练
输出结果:epoch_n=10
for epoch in range(epoch_n):
running_loss=0.0
running_correct=0
testing_correct=0
print("Epoch {}/{}".format(epoch,epoch_n))
print("*"*20)
for data in train_load:
x_train,y_train=data
x_train=x_train.view(-1,28,28)
x_train,y_train=Variable(x_train),Variable(y_train)
y_pred=model(x_train)
loss=loss_f(y_pred,y_train)
_,pred=torch.max(y_pred.data,1)
optimizer.zero_grad()
loss.backward()
optimizer.step()
running_loss+=loss.item()
running_correct+=torch.sum(pred==y_train.data)
for data in test_load:
x_test,y_test=data
x_test=x_test.view(-1,28,28)
x_test,y_test=Variable(x_test),Variable(y_test)
outputs=model(x_test)
_,pred=torch.max(outputs.data,1)
testing_correct+=torch.sum(pred==y_test.data)
print("Loss is {:.4f},Train Accuracy is {:.4f}%,Test Accuracy is {:.4f}%".\
format(running_loss/len(dataset_train),100*running_correct/len(dataset_train),100*testing_correct/len(dataset_test)))