Pytorch:RNN、LSTM、GRU

日萌社

人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新)


#模型中最后一层隐藏层的最后一个时间步(节点)的输出output可作为预测值,然后通过softmax把output输出转换为概率值
#for循环遍历出来的input可以是字符,也可以是单词,那么模型可以是字符输入版本,也可以是单词输入版本
for input in range(lines):
	output, hidden = RNN实例对象(input, hidden)
	output, hidden = GRU实例对象(input, hidden)
	output, (hidden, cn) = LSTM实例对象(input, (hidden, cn)) 
	encoder_output, encoder_hidden = encoder(encoder_input, encoder_hidden)
	decoder_output, decoder_hidden, decoder_attention = decoder(decoder_input, decoder_hidden, encoder_outputs)

# nn.RNN(输入数据的词嵌入维度input_size, 隐藏层中神经元数量hidden_size, 隐藏层层数num_layers)
rnn = nn.RNN(5, 6, 2)
gru = nn.GRU(5, 6, 2)
lstm = nn.LSTM(5, 6, 2)
	input_size: 每一个时步(time_step)输入到RNN/GRU/LSTM单元的维度,实际输入的数据shape为(当前批次的样本个数, 当前样本的序列长度(单词个数), 词嵌入维度)
	hidden_size: 确定了隐含状态hidden_state的维度,可以简单的看成构造了一个可学习输入隐藏权重的形状(hidden_size, input_size)

weight_ih: 
    可学习输入隐藏权重的形状(hidden_size, input_size)
    每个单词 的嵌入维度的 向量 作为 一个时间步 输入到 一个 RNN 节点,
    然后 会和 神经元数量维度的 向量 构成一个 可学习输入隐藏权重 这样的 形状 (hidden_size, input_size),
    就是 (神经元数量, 单词嵌入维度)。
    比如input输入数据为(当前批次的样本个数, 当前样本的序列长度(单词个数), 词嵌入维度),
    那么input_size即为input输入数据的最后一个维度即词嵌入维度,
    那么每个时间步的输入维度input_size(一个单词的词嵌入维度embedding_dim) 都要作用于 隐藏层的所有隐藏神经元hidden_size, 
    那么便会构建一个(hidden_size, input_size)形状的可学习输入隐藏权重。
    
def __init__(self, mode, input_size, hidden_size, 
                    num_layers=1, bias=True, batch_first=False, dropout=0., 
                    bidirectional=False):
    #默认值bidirectional=False:那么“2 if False else 1”返回1,“2 if True else 1”返回2。
    #如果RNN是双向的,num_directions应该是2,否则应该是1。
    num_directions = 2 if bidirectional else 1                    
        
========================================================================
# nn.RNN(输入数据的词嵌入维度, 隐藏层中神经元数量, 隐藏层层数)
rnn = nn.RNN(5, 6, 2)
gru = nn.GRU(5, 6, 2)
lstm = nn.LSTM(5, 6, 2)

# input of shape (seq_len, batch, input_size):(当前批次的样本个数, 当前样本的序列长度(单词个数), 词嵌入维度)
# input输入数据,torch.randn(当前批次的样本个数, 当前样本的序列长度(单词个数), 词嵌入维度)
input = torch.randn(4, 3, 5)

# h_0 of shape (num_layers * num_directions, batch, hidden_size):
#	RNN是单向:(隐藏层层数 * 1, 一个句子单词个数, 隐藏层中神经元数量)	
#	RNN是双向:(隐藏层层数 * 2, 一个句子单词个数, 隐藏层中神经元数量)	
# hn隐藏层数据,torch.randn(隐藏层层数, 当前样本的序列长度(单词个数), 隐藏层中神经元数量)
h0 = torch.randn(2, 3, 6)

# c_0 of shape (num_layers * num_directions, batch, hidden_size) 
#	RNN是单向:(隐藏层层数 * 1, 一个句子单词个数, 隐藏层中神经元数量)	
#	RNN是双向:(隐藏层层数 * 2, 一个句子单词个数, 隐藏层中神经元数量)	
c0 = torch.randn(2, 3, 6)

output, hn = rnn(input, h0)
output, (hn, cn) = rnn(input, (h0, c0))

# output of shape (seq_len, batch, num_directions * hidden_size):
#	RNN是单向:(当前批次的样本个数, 当前样本的序列长度(单词个数), 隐藏层中神经元数量 * 1)	
#	RNN是双向:(当前批次的样本个数, 当前样本的序列长度(单词个数), 隐藏层中神经元数量 * 2)		
output.shape #torch.Size([4, 3, 6])

# h_n of shape (num_layers * num_directions, batch, hidden_size)
#	RNN是单向:(隐藏层层数 * 1, 一个句子单词个数, 隐藏层中神经元数量)	
#	RNN是双向:(隐藏层层数 * 2, 一个句子单词个数, 隐藏层中神经元数量)	
hn.shape #torch.Size([2, 3, 6])

# c_n of shape (num_layers * num_directions, batch, hidden_size)
#	RNN是单向:(隐藏层层数 * 1, 一个句子单词个数, 隐藏层中神经元数量)	
#	RNN是双向:(隐藏层层数 * 2, 一个句子单词个数, 隐藏层中神经元数量)
hn.shape #torch.Size([2, 3, 6])
 

Examples::
    #nn.LSTM(输入数据的词嵌入维度 10, 隐藏层中神经元数量 20, 隐藏层层数 2)
    >>> rnn = nn.LSTM(10, 20, 2)
    #input输入数据,torch.randn(当前批次的样本个数 5, 当前样本的序列长度(单词个数) 3, 词嵌入维度 10)
    >>> input = torch.randn(5, 3, 10)
    #h0/hn隐藏层数据,torch.randn(隐藏层层数 2, 当前样本的序列长度(单词个数) 3, 隐藏层中神经元数量 20)
    >>> h0 = torch.randn(2, 3, 20)
    #c0/cn细胞状态数据,torch.randn(隐藏层层数 2, 当前样本的序列长度(单词个数) 3, 隐藏层中神经元数量 20)
    >>> c0 = torch.randn(2, 3, 20)
    >>> output, (hn, cn) = rnn(input, (h0, c0))

LSTM输出API为:output,(h_n,c_n)=self.rnn(x)
	1.output: 如果num_layer为3,则output只记录最后一层(即第三层)的输出
		对应图中向上的各个time_step的ht,也即output。
		(seq_len, batch, num_directions * hidden_size):
			RNN是单向:(当前批次的样本个数, 当前样本的序列长度(单词个数), 隐藏层中神经元数量 * 1)	
			RNN是双向:(当前批次的样本个数, 当前样本的序列长度(单词个数), 隐藏层中神经元数量 * 2)		
 
	2.h_n: 各个层的最后一个时步的隐含状态h
		shape为[num_layers, batch_size, hidden_size]。
		(num_layers * num_directions, batch, hidden_size)
			RNN是单向:(隐藏层层数 * 1, 一个句子单词个数, 隐藏层中神经元数量)	
			RNN是双向:(隐藏层层数 * 2, 一个句子单词个数, 隐藏层中神经元数量)
 
	3.c_n: 各个层的最后一个时步的隐含状态C
		c_n可以看成另一个隐含状态,其shape和h_n的shape相同。
 		(num_layers * num_directions, batch, hidden_size)
			RNN是单向:(隐藏层层数 * 1, 一个句子单词个数, 隐藏层中神经元数量)	
			RNN是双向:(隐藏层层数 * 2, 一个句子单词个数, 隐藏层中神经元数量)

RNN

weight_ih: 
    可学习输入隐藏权重的形状(hidden_size, input_size)
    每个单词 的嵌入维度的 向量 作为 一个时间步 输入到 一个 RNN 节点,
    然后 会和 神经元数量维度的 向量 构成一个 可学习输入隐藏权重 这样的 形状 (hidden_size, input_size),
    就是 (神经元数量, 单词嵌入维度)。

nn.RNN(输入数据的词嵌入维度, 隐藏层中神经元数量, 隐藏层层数)
Xt:输入数据,shape为(当前批次的样本个数, 当前样本的序列长度(单词个数), 词嵌入维度影),比如[1,3,5]。
h0:隐藏层数据,shape为(隐藏层层数, 当前样本的序列长度(单词个数), 隐藏层中神经元数量),比如[1,3,6]。
[Xt,ht-1]:通过concat(Xt,ht-1)把[1,3,5]和[1,3,6]进行列维度(最后一个维度)的拼接变成[1,3,11]。
Wt[Xt,ht-1]:concat拼接后的[1,3,11]乘以Wt的[11,6]变成[1,3,6]。
output是hn隐藏层中的最后一层输出,比如:
	当隐藏层只有一层时,rnn的输出output和隐藏层数据hn 两者完全相同,shape均为[1,3,6]。
	当隐藏层有多层时,rnn的输出output为隐藏层数据hn中的最后一个二维矩阵,比如hn为[2,3,6],output的数据实际为hn中最后一个二维矩阵[1,3,6]。


LSTM

1.激活函数sigmiod的作用:用于帮助调节流经网络的值, sigmoid函数将值压缩在0和1之间的小数值(相当于一个百分比值)。
  只要是sigmiod输出的百分比值(比如ft/it/ot) 都可作为控制阈值(保留信息比例值),用于控制流经的数据保留多少。
2.比如此处的遗忘门中的通过sigmiod输出的ft便是一个0和1之间的小数值,ft用作在“细胞状态更新公式”中的ft*Ct-1,
  因为ft本身就是一个0和1之间的小数值(相当于一个百分比值),那么ft*Ct-1表示使用ft这个百分值保留多少Ct-1的值。

1.激活函数sigmiod的作用:用于帮助调节流经网络的值, sigmoid函数将值压缩在0和1之间的小数值(相当于一个百分比值)。
  只要是sigmiod输出的百分比值(比如ft/it/ot) 都可作为控制阈值(保留信息比例值),用于控制流经的数据保留多少。
2.比如此处输入门中的通过sigmiod输出的it便是一个0和1之间的小数值,it用作在“细胞状态更新公式”中的it*Ct~,
  因为it本身就是一个0和1之间的小数值(相当于一个百分比值),那么it*Ct~表示使用it这个百分值保留多少Ct~的值。

1.激活函数sigmiod的作用:用于帮助调节流经网络的值, sigmoid函数将值压缩在0和1之间的小数值(相当于一个百分比值)。
  只要是sigmiod输出的百分比值(比如ft/it/ot) 都可作为控制阈值(保留信息比例值),用于控制流经的数据保留多少。
2.比如输入门中的通过sigmiod输出的it便是一个0和1之间的小数值,it用作在“细胞状态更新公式”中的it*Ct~,
  因为it本身就是一个0和1之间的小数值(相当于一个百分比值),那么it*Ct~表示使用it这个百分值保留多少Ct~的值。
3.比如遗忘门中的通过sigmiod输出的ft便是一个0和1之间的小数值,ft用作在“细胞状态更新公式”中的ft*Ct-1,
  因为ft本身就是一个0和1之间的小数值(相当于一个百分比值),那么ft*Ct-1表示使用ft这个百分值保留多少Ct-1的值。

1.激活函数sigmiod的作用:用于帮助调节流经网络的值, sigmoid函数将值压缩在0和1之间的小数值(相当于一个百分比值)。
  只要是sigmiod输出的百分比值(比如ft/it/ot) 都可作为控制阈值(保留信息比例值),用于控制流经的数据保留多少。
2.比如此处输出门中的通过sigmiod输出的ot便是一个0和1之间的小数值,ot用作在“输出门更新公式”中的ot*tanh(Ct),
  因为ot本身就是一个0和1之间的小数值(相当于一个百分比值),那么ot*tanh(Ct)表示使用ot这个百分值保留多少tanh(Ct)的值。


GRU

  

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用PyTorch实现RNN模型,你可以按照以下步骤进行操作: 1. 准备数据:首先,你需要获取股票数据,并将其转换为PyTorch需要的格式。你可以使用Quandl API获取股票数据,并将其保存为CSV文件。然后,读取CSV文件,并选择股票收盘价列。最后,对数据进行归一化处理,并将其转换为PyTorch的tensor格式。 2. 定义RNN模型:在PyTorch中,你可以使用nn.RNN类来定义RNN模型。你需要指定输入大小、隐藏层大小和是否使用偏置项等参数。另外,你也可以使用nn.RNNCell类来定义RNN模型的单个单元。 3. 训练模型:使用定义好的RNN模型,你可以使用MSE损失函数和Adam优化器来训练模型。你可以定义一个训练函数,该函数会迭代训练集中的每个序列,并在每个epoch结束时保存模型。 4. 保存模型:在训练结束后,你可以使用torch.save函数将训练好的模型保存到文件中。 5. 加载模型并生成交易信号:使用torch.load函数加载保存的模型文件。然后,使用加载的模型生成交易信号。你可以使用torch.no_grad()上下文管理器来禁用梯度计算,以提高推理速度。在循环中,你可以将输入数据传递给加载的模型,并获取输出结果。最后,将生成的交易信号保存为Series对象。 综上所述,你可以按照上述步骤使用PyTorch实现RNN模型。\[2\] #### 引用[.reference_title] - *1* *2* [用pytorch实现RNN模型做股票量化交易](https://blog.csdn.net/qq_24250441/article/details/130885802)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [Pytorch实现RNNLSTMGRU等经典循环网络模型,简直不能再简单。](https://blog.csdn.net/weixin_39490300/article/details/123167335)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

あずにゃん

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值