RuntimeError: Expected hidden size (2, 24, 50), got (2, 30, 50)
Posted
技术标签:
【中文标题】RuntimeError: Expected hidden size (2, 24, 50), got (2, 30, 50)【英文标题】: 【发布时间】:2019-11-30 13:59:15 【问题描述】:我正在尝试建立一个模型,用于学习数据集中某些句子的分配分数(实数)。为此,我使用 RNN(在 PyTorch 中)。 我已经定义了一个模型:
class RNNModel1(nn.Module):
def forward(self, input ,hidden_0):
embedded = self.embedding(input)
output, hidden = self.rnn(embedded, hidden_0)
output=self.linear(hidden)
return output , hidden
训练功能如下:
def train(model,optimizer,criterion,BATCH_SIZE,train_loader,clip):
model.train(True)
total_loss = 0
hidden = model._init_hidden(BATCH_SIZE)
for i, (batch_of_data, batch_of_labels) in enumerate(train_loader, 1):
hidden=hidden.detach()
model.zero_grad()
output,hidden= model(batch_of_data,hidden)
loss = criterion(output, sorted_batch_target_scores)
total_loss += loss.item()
loss.backward()
torch.nn.utils.clip_grad_norm(model.parameters(), clip)
optimizer.step()
return total_loss/len(train_loader.dataset)
当我运行代码时收到此错误:
批量大小=30,隐藏大小=50,层数=1,双向=真。
我在最后一批数据中收到了该错误。 我检查了 PyTorch 中对 RNN 的描述来解决这个问题。 PyTorch 中的 RNN 有两个输入参数和两个输出参数。输入参数是 input 和 h_0。 h_0 是一个张量,包括批量大小(num_layers*num_directions, batch, hidden size)中每个元素的初始隐藏状态。 输出参数是 output 和 h_n。 h_n 是一个张量,包括大小为 t=seq_len 的隐藏状态(num_layers*num_directions, batch, hidden size)。
在所有批次(最后一批除外)中,h_0 和 h_n 的大小相同。但在最后一批中,元素数量可能小于批量大小。因此 h_n 的大小是 (num_layersnum_directions,tained_elements_in_last_batch, hidden size) 但 h_0 的大小仍然是 (num_layersnum_directions, batch_size, hidden size)。
所以我在最后一批数据中收到了那个错误。
如何解决这个问题并处理h_0和h_n大小不同的情况?
提前致谢。
【问题讨论】:
你需要最后一批吗?你可以忽略它。你也可以垫它。或者您可以更改您的 RNN 以使用不同的大小。 非常好的建议。我应该检查忽略最后一批是否不会对性能产生太大影响。如何更改 RNN 以使用不同的大小? 【参考方案1】:当数据集中的样本数量不是批次大小的倍数时会发生此错误。忽略最后一批可以解决问题。要识别最后一批,请检查每批中的元素数量。如果小于 BATCH_SIZE,那么它是数据集中的最后一批。
if(len(batch_of_data)==BATCH_SIZE):
output,hidden= model(batch_of_data,hidden)
【讨论】:
以上是关于RuntimeError: Expected hidden size (2, 24, 50), got (2, 30, 50)的主要内容,如果未能解决你的问题,请参考以下文章
RuntimeError:Expected to have finished reduction in the prior iteration
RuntimeError: Expected hidden[0] size (1, 1, 512), got (1, 128, 512) for LSTM pytorch
RuntimeError: Expected a ‘cuda‘ device type for generator but found ‘cpu‘
RuntimeError: Expected object of type torch.cuda.FloatTensor but found type torch.FloatTensor for ar
RuntimeError: Expected all tensors to be on the same device, but found at least two devices
RuntimeError: Expected all tensors to be on the same device,但发现至少有两个设备,cpu和cuda:0!使用我的模型进行预测时