Python 试图在GRU字符RNN中过度匹配
我有一个GRU网络,它是手动构建的(即noPython 试图在GRU字符RNN中过度匹配,python,pytorch,recurrent-neural-network,Python,Pytorch,Recurrent Neural Network,我有一个GRU网络,它是手动构建的(即nonn.GRU),有2个垂直层,128个隐藏层,序列长度为64个字符 我想把莎士比亚的一小段文集放得太满了: 我进行了500多个时期的训练,每25个时期后,我只给出第一个字母“B”,生成一个温度非常低的样本。起初它是胡言乱语,但最后它确实接近实际文本。第一个版本是: 这没有在批之间传递隐藏状态。我想这可能是我的问题,所以我在批次之间传递隐藏状态,分离。但我仍然没有得到完美的过度健康,而且它实际上似乎使它恶化: 下面是我如何实现GRU的: for i
nn.GRU
),有2个垂直层,128个隐藏层,序列长度为64个字符
我想把莎士比亚的一小段文集放得太满了:
我进行了500多个时期的训练,每25个时期后,我只给出第一个字母“B”,生成一个温度非常低的样本。起初它是胡言乱语,但最后它确实接近实际文本。第一个版本是:
这没有在批之间传递隐藏状态。我想这可能是我的问题,所以我在批次之间传递隐藏状态,分离。但我仍然没有得到完美的过度健康,而且它实际上似乎使它恶化:
下面是我如何实现GRU的:
for i in range(self.n_layers):
layer_input = layer_middle
layer_middle = torch.zeros((batch_size, seq_len, self.h_dim))
params = self.layer_params[i]
for j in range(seq_len):
x = layer_input[:, j, :].to(torch.device('cuda'))
z = F.sigmoid(params['W1'](x) + params['W2'](layer_states[i]))
r = F.sigmoid(params['W3'](x) + params['W4'](layer_states[i]))
g = F.tanh(params['W5'](x) + params['W6'](r*layer_states[i]))
layer_states[i] = z*layer_states[i] + (1-z)*g
layer_middle[:, j, :] = layer_states[i]
layer_middle = nn.Dropout(self.dropout)(layer_middle)
layer_output = torch.zeros((batch_size, seq_len, self.out_dim))
for j in range(seq_len):
x = layer_middle[:, j, :].to(torch.device('cuda'))
layer_output[:, j, :] = self.layer_params[-1]['W7'](x)
参数为nn.线性
,形状正确
你知道什么可以防止我过度拟合这个小小的语料库吗?所以问题似乎是我在不同的时代之间传递了隐藏向量,这很糟糕。它搞砸了训练。而且还使其达到100%,而生成器虽然没有获得隐藏状态,但从零开始,却无法获得相同的字符串。因此,问题似乎是我在两个纪元之间传递了隐藏向量,这很糟糕。它搞砸了训练。而且还使其达到100%,而生成器虽然没有获得隐藏状态,但从零开始,却无法获得相同的字符串。