[PyTorch] RNN, LSTM, GRU中输入输出维度

本文中的RNN泛指LSTM,GRU等等
CNNRNNbatch_size的默认位置是不同的。

  • CNN中:batch_size的位置是position 0.
  • RNN中:batch_size的位置是position 1.

1. 在RNN中输入数据格式:

对于最简单的RNN,我们可以使用两种方式来调用 torch.nn.RNNCell()。它只接受序列中的单步输入,必须显式的传入隐藏状态torch.nn.RNN()可以接受一个序列的输入,默认会传入一个全0的隐藏状态,也可以自己申明隐藏状态传入。

1.1 输入大小是三维tensor[seq_len,batch_size,input_dim]

  • input_dim是输入的维度,比如是128。
  • batch_size是一次往RNN输入句子的数目,比如是5
  • seq_len是一个句子的最大长度,比如15。

所以千万注意,RNN输入的是序列,一次把批次的所有句子都输入了,得到的ouptuthidden都是这个批次的所有的输出和隐藏状态,维度也是三维。

可以理解为现在一共有batch_size个独立的RNN组件,RNN的输入维度是input_dim,总共输入seq_len个时间步,则每个时间步输入到这个整个RNN模块的维度是[batch_size,input_dim]

# 构造RNN网络,x的维度5 (embedding_size or input_dim),
# 隐层的维度10 (hidden_size or output_dim), 网络的层数2
rnn_seq = nn.RNN(5, 10, 2)  
# 构造一个输入序列,句长为 6,batch 是 3, 每个单词使用长度是 5的向量表示
x = torch.randn(6, 3, 5)
# out, ht = rnn_seq(x, h0) 
out, ht = rnn_seq(x) #h0可以指定或者不指定

问题1:这里outhtsize是多少呢?
回答out:6 * 3 * 10, ht: 2 * 3 * 10,out的输出维度[seq_len,batch_size,output_dim],ht的维度[num_layers * num_directions, batch_size, hidden_size],如果是单向单层的RNN那么一个句子只有一个hidden,即,ht的维度为[batch_size, hidden_size]
问题2out[-1]ht[-1]是否相等?
回答:相等,每个时间步的输出其实就是那个时间步在网络最后一层的隐藏单元。

1.2 RNN的其他参数

RNN(input_dim ,hidden_dim ,num_layers ,…)
– input_dim 表示输入的特征维度
– hidden_dim 表示输出的特征维度,如果没有特殊变化,相当于out
– num_layers 表示网络的层数
– nonlinearity 表示选用的非线性激活函数,默认是 ‘tanh’
– bias 表示是否使用偏置,默认使用
– batch_first 表示输入数据的形式,默认是 False,就是这样形式,(seq, batch, feature),也就是将序列长度放在第一位,batch 放在第二位
– dropout 表示是否在输出层应用 dropout
– bidirectional 表示是否使用双向的 rnn,默认是 False

2. LSTM的输出多了一个memory单元

# 输入维度 50,隐层100维,两层
lstm_seq = nn.LSTM(50, 100, num_layers=2)
# 输入序列seq= 10,batch =3,输入维度=50
lstm_input = torch.randn(10, 3, 50)
out, (h, c) = lstm_seq(lstm_input) # 使用默认的全 0 隐藏状态

问题1out(h,c)的size各是多少?
回答out:(10 * 3 * 100),(h,c):都是(2 * 3 * 100)
问题2out[-1,:,:]h[-1,:,:]相等吗?
回答: 相等

3. GRU比较像传统的RNN

gru_seq = nn.GRU(10, 20, 2) # x_dim,h_dim,layer_num
gru_input = torch.randn(3, 32, 10) # seq,batch,x_dim
out, h = gru_seq(gru_input)

同样,out的输出维度[seq_len,batch_size,output_dim],h的维度[num_layers * num_directions, batch_size, hidden_size]。

  • 11
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个用于深度学习的开源框架,其RNN循环神经网络)模块可以用于多输入变量回归任务。多输入变量回归是一种通过多个输入变量来预测一个连续值的任务。 在PyTorch,可以使用torch.nn.RNN类来构建RNN模型。要实现多输入变量回归,首先需要将输入的多个变量进行堆叠或拼接,形成一个输入序列来喂给模型。可以使用torch.cat()函数将输入变量按列进行拼接。 然后,可以定义RNN模型的参数,如隐藏层的大小、RNN层的类型(如GRULSTM)等。可以使用torch.nn.GRU或torch.nn.LSTM类来定义RNN层。 在前向传播过程,可以通过调用RNN模型的forward()方法来计算输出。输出结果可以通过添加全连接层,将RNN的输出转换为所需的预测结果。需要注意的是,在RNN模型的前向传播过程,需要将输入序列作为参数传递给模型。 在训练过程,可以定义损失函数和优化器,通过最小化损失函数来更新模型的参数。常用的损失函数包括均方误差(MSE)和平均绝对误差(MAE)等。 最后,在训练和测试阶段,可以循环遍历数据集,并将输入序列和对应的目标值喂给模型,然后计算损失并进行反向传播。可以通过调用optimizer.step()方法来更新模型的参数。 综上所述,PyTorchRNN模块可以用于多输入变量回归任务。通过适当的数据处理、设置模型参数、定义损失函数和优化器,可以实现对多输入变量的连续值预测。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值