如何在Keras的LSTM解码器的第一步中正确初始化隐藏状态

时间:2019-05-01 11:49:49

标签: keras lstm language-model

我目前正在实现Dong等人在此paper中描述的attr2seq模型。 (2018)在Keras中,我完全陷入了使用编码的属性矢量$ a $(在“ 3.2序列解码器”部分的最后一段)在LSTM解码器的第一步初始化隐藏矢量的问题。因此,我想找到一种解决方案,以解决如何在序列LSTM解码器的变化的第一时间步使用编码属性向量正确初始化隐藏向量的问题。

我一直在测试建议的here的第一种方法,其中一种方法使LSTM层变为有状态,然后在模型成功编译后指定隐藏状态(并确保shuffle = False以及在拟合模型时)。但是,这种方法的一个问题是,您必须指定特定的批处理大小,并且如果您有许多不能被该批处理大小整除的数据样本,程序将退出并显示错误(即Exception: In a stateful network, you should only pass inputs with a number of samples that can be divided by the batch size.。另外,在拟合模型时,仅训练LSTM层,而在训练过程中不考虑属性编码器,从而导致训练未经训练的属性向量,也许我完全误解了它们的用法,所以如果我说什么错。

我测试过的另一种方法是通过为Keras的循环层中的initial_state方法中包含的call(…)分配值来象征性地设置初始隐藏状态。但是,我从源代码here中意识到,必须提供权重矩阵来提供LSTM层的某些自定义初始状态,尽管我认为这种初始化是,但我对如何做到这一点一无所知。想要但在第一时间步(即t=0)隐藏的向量,而不是第一时间步的权重。也许有人可以做到这一点,但是我不这样做,因为我不那么习惯Keras(或对此事进行深度学习)。

代码大致说明了模型的外观。在程序中运行代码时,收到错误消息ValueError: An initial_state was passed that is not compatible with cell.state_size. Received state_spec=[InputSpec(shape=(None, 514), ndim=2)]; however cell.state_size is (514, 514),这使我意识到initial_state需要权重矩阵,而不是每个单个数据点的任意状态。

    x_drug = Input(shape=(onehotted_drugs.shape[1],))
    x_cond = Input(shape=(onehotted_conds.shape[1],))
    x_rating = Input(shape=(onehotted_ratings.shape[1],))

    g_drug = Dense(self.attr_size)(x_drug)
    g_cond = Dense(self.attr_size)(x_cond)
    g_rating = Dense(self.attr_size)(x_rating)
    g_concatenated = Concatenate()([g_drug, g_cond, g_rating])
    a = Dense(self.num_layers * self.hidden_size, activation = "tanh")(g_concatenated)
    hidden_vectors = [Lambda(lambda l: slice(l, (0, self.hidden_size*i), (-1, self.hidden_size*(i+1))))(a) for i in range(self.num_layers)]

    x_prev_words = Input(shape = (self.num_tokens,))
    ground_zero = Dense(self.hidden_size, use_bias = False)(x_prev_words)
    lstm_layers = [LSTM(self.hidden_size, input_shape = (self.max_sequence_length - 1, self.hidden_size), return_sequences = True)(RepeatVector(self.max_sequence_length - 1)(ground_zero), initial_state = hidden_vectors[0])]
    for i in range(1, self.num_layers):
      lstm_layers.append(LSTM(self.hidden_size, return_sequences = False if i==self.num_layers-1 else True)(lstm_layers[-1], initial_state = hidden_vectors[i]))

    next_word_dist = Dense(self.num_tokens, activation = "softmax")(lstm_layers[-1])    
    self.dong = Model(inputs=[x_drug, x_cond, x_rating, x_prev_words], outputs=[next_word_dist])
    self.dong.compile(loss = "categorical_crossentropy", optimizer = "rmsprop")

如果您需要更多信息或更多检查代码,请随时告诉我。谢谢大家为我提供的所有帮助!

0 个答案:

没有答案