Pytorch中所有模型分为构造参数和输入和输出构造参数两种类型。

  •  模型构造参数主要限定了网络的结构,如对循环网络,则包括输入维度、隐层\输出维度、层数;对卷积网络,无论卷积层还是池化层,都不关心输入维度,其构造方法只涉及卷积核大小\步长等。这里的参数决定了模型持久化后的大小.
  •  输入和输出的构造参数一般和模型训练相关,都需指定batch大小,seq大小(循环网络)\chanel大小(卷积网络),以及输入\输出维度,如果是RNN还需涉及h0和c0的初始化等。这里的参数决定了模型训练效果。

 

Liner

  • Liner(x_dim,y_dim)
    – 输入x,程序输入(batch,x)
    – 输出y, 程序输出(batch,y)
import torch
import torch.nn as nn
from torch.autograd import Variable as V
line =  nn.Linear(2, 4)  # 输入2维,输出4维
print(line)
print(line.weight) # 参数是随机初始化的,维度为out_dim * in_dim

[深度学习]Pytorch中RNN模型小结

 

x = V(torch.randn(5,2)) # batch为5,即一次输入10个x
print(x)
line(x)  # 输出为batch*4

[深度学习]Pytorch中RNN模型小结

 

RNN

首先介绍一下什么是rnn,rnn特别擅长处理序列类型的数据,因为他是一个循环的结构

[深度学习]Pytorch中RNN模型小结

一个序列的数据依次进入网络A,网络A循环的往后传递。

这里输入X一般是一个sequence, 如[我 爱 上海 小笼包] x1="我"

 

 

这就是RNN的基本结构类型。而最早的RNN模型,序列依次进入网络中,之前进入序列的数据会保存信息而对后面的数据产生影响,所以RNN有着记忆的特性,而同时越前面的数据进入序列的时间越早,所以对后面的数据的影响也就越弱,简而言之就是一个数据会更大程度受到其临近数据的影响。但是我们很有可能需要更长时间之前的信息,而这个能力传统的RNN特别弱,于是有了LSTM这个变体。

LSTM

[深度学习]Pytorch中RNN模型小结

 

这就是LSTM的模型结构,也是一个向后传递的链式模型,而现在广泛使用的RNN其实就是LSTM,序列中每个数据传入LSTM可以得到两个输出,而这两个输出和序列中下一个数据一起又作为传入LSTM的输入,然后不断地循环向后,直到序列结束。

下面结合pytorch一步一步来看数据传入LSTM是怎么运算的

首先需要定义好LSTM网络,需要nn.LSTM(),首先介绍一下这个函数里面的参数

input_size 表示的是输入的数据维数

hidden_size 表示的是输出维数

num_layers 表示堆叠几层的LSTM,默认是1

bias True 或者 False,决定是否使用bias

batch_first True 或者 False,因为nn.lstm()接受的数据输入是(序列长度,batch,输入维数),这和我们cnn输入的方式不太一致,所以使用batch_first,我们可以将输入变成(batch,序列长度,输入维数)

dropout 表示除了最后一层之外都引入一个dropout

bidirectional 表示双向LSTM,也就是序列从左往右算一次,从右往左又算一次,这样就可以两倍的输出

[深度学习]Pytorch中RNN模型小结


是网络的输出维数,比如M,因为输出的维度是M,权重w的维数就是(M, M)和(M, K),b的维数就是(M, 1)和(M, 1),最后经过sigmoid**函数,得到的f的维数是(M, 1)。

对于第一个数据,需要定义初始的h_0和c_0,所以nn.lstm()的输入Inputs:input, (h_0, c_0),表示输入的数据以及h_0和c_0,这个可以自己定义,如果不定义,默认就是0

[深度学习]Pytorch中RNN模型小结

 

第二步也是差不多的操作,只不多是另外两个权重加上不同的**函数,一个使用的是sigmoid,一个使用的是tanh,得到的输出[深度学习]Pytorch中RNN模型小结[深度学习]Pytorch中RNN模型小结都是(M, 1)。

[深度学习]Pytorch中RNN模型小结

 

接着这个乘法是矩阵每个位置对应相乘,然后将两个矩阵加起来,得到的输出[深度学习]Pytorch中RNN模型小结是(M, 1)。

[深度学习]Pytorch中RNN模型小结

 

最后一步得到的[深度学习]Pytorch中RNN模型小结也是(M, 1),然后[深度学习]Pytorch中RNN模型小结经过**函数tanh,再和[深度学习]Pytorch中RNN模型小结每个位置相乘,得到的输出[深度学习]Pytorch中RNN模型小结也是(M, 1)。

最后得到的输出就是[深度学习]Pytorch中RNN模型小结[深度学习]Pytorch中RNN模型小结,维数分别都是(M, 1),而输入[深度学习]Pytorch中RNN模型小结维数都是(K, 1)。

lstm = nn.LSTM(10, 30, batch_first=True)

可以通过这样定义一个一层的LSTM输入是10,输出是30

lstm.weight_hh_l0.size()
lstm.weight_ih_l0.size()
lstm.bias_hh_l0.size()
lstm.bias__ih_l0.size()

可以分别得到权重的维数,注意之前我们定义的4个weights被整合到了一起,比如这个lstm,输入是10维,输出是30维,相对应的weight就是30x10,这样的权重有4个,然后pytorch将这4个组合在了一起,方便表示,也就是lstm.weight_ih_l0,所以它的维数就是120x10

我们定义一个输入

x = Variable(torch.randn((50, 100, 10)))
h0 = Variable(torch.randn(1, 50, 30))
c0 = Variable(torch.randn(1, 50 ,30))

x的三个数字分别表示batch_size为50,序列长度为100,每个数据维数为10

h0的第二个参数表示batch_size为50,输出维数为30,第一个参数取决于网络层数和是否是双向的,如果双向需要乘2,如果是多层,就需要乘以网络层数

c0的三个参数和h0是一致的

out, (h_out, c_out) = lstm(x, (h0, c0))

这样就可以得到网络的输出了,和上面讲的一致,另外如果不传入h0和c0,默认的会传入相同维数的0矩阵

这就是我们如何在pytorch上使用RNN的基本操作了,了解完最基本的参数我们才能够使用其来做应用。

 

更多的RNN的应用可以看这个资源

 

相关文章:

  • 2021-11-05
  • 2021-11-03
  • 2021-08-12
  • 2021-12-24
  • 2021-12-01
  • 2021-09-02
猜你喜欢
  • 2022-02-08
  • 2021-05-05
  • 2022-01-06
  • 2023-02-23
  • 2021-04-06
  • 2022-12-23
相关资源
相似解决方案