gpt4 book ai didi

machine-learning - 带有 Keras 的词级 Seq2Seq

转载 作者:行者123 更新时间:2023-12-02 11:21:33 24 4
gpt4 key购买 nike

我在关注 Keras Seq2Seq tutorial ,并且机智工作正常。但是,这是一个字符级模型,我想将其用于单词级模型。作者甚至包含了一个需要更改的段落,但我目前的所有尝试都导致了有关拧尺寸的错误。

如果遵循字符级模型,则输入数据为 3 个维度:#sequences , #max_seq_len , #num_char因为每个字符都是单热编码的。当我绘制教程中使用的模型摘要时,我得到:

Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_1 (InputLayer) (None, None, 71) 0
_____________________________________________________________________________ __________________
input_2 (InputLayer) (None, None, 94) 0
__________________________________________________________________________________________________
lstm_1 (LSTM) [(None, 256), (None, 335872 input_1[0][0]
__________________________________________________________________________________________________
lstm_2 (LSTM) [(None, None, 256), 359424 input_2[0][0]
lstm_1[0][1]
lstm_1[0][2]
__________________________________________________________________________________________________
dense_1 (Dense) (None, None, 94) 24158 lstm_2[0][0]
==================================================================================================

这可以很好地编译和训练。

现在本教程有部分“如果我想使用带有整数序列的词级模型怎么办?”我已经尝试跟随这些变化。首先,我使用单词索引对所有序列进行编码。因此,输入和目标数据现在是 2 个维度: #sequences , #max_seq_len因为我不再是单热编码而是现在使用嵌入层。
encoder_input_data_train.shape   =>  (90000, 9)
decoder_input_data_train.shape => (90000, 16)
decoder_target_data_train.shape => (90000, 16)

例如,一个序列可能如下所示:
[ 826.  288. 2961. 3127. 1260. 2108.    0.    0.    0.]

当我使用列出的代码时:
# encoder
encoder_inputs = Input(shape=(None, ))
x = Embedding(num_encoder_tokens, latent_dim)(encoder_inputs)
x, state_h, state_c = LSTM(latent_dim, return_state=True)(x)
encoder_states = [state_h, state_c]

# decoder
decoder_inputs = Input(shape=(None,))
x = Embedding(num_decoder_tokens, latent_dim)(decoder_inputs)
x = LSTM(latent_dim, return_sequences=True)(x, initial_state=encoder_states)
decoder_outputs = Dense(num_decoder_tokens, activation='softmax')(x)

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

模型编译后如下所示:
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_35 (InputLayer) (None, None) 0
__________________________________________________________________________________________________
input_36 (InputLayer) (None, None) 0
__________________________________________________________________________________________________
embedding_32 (Embedding) (None, None, 256) 914432 input_35[0][0]
__________________________________________________________________________________________________
embedding_33 (Embedding) (None, None, 256) 914432 input_36[0][0]
__________________________________________________________________________________________________
lstm_32 (LSTM) [(None, 256), (None, 525312 embedding_32[0][0]
__________________________________________________________________________________________________
lstm_33 (LSTM) (None, None, 256) 525312 embedding_33[0][0]
lstm_32[0][1]
lstm_32[0][2]
__________________________________________________________________________________________________
dense_21 (Dense) (None, None, 3572) 918004 lstm_33[0][0]

在编译工作时,训练
model.fit([encoder_input_data, decoder_input_data], decoder_target_data, batch_size=32, epochs=1, validation_split=0.2)

失败并出现以下错误: ValueError: Error when checking target: expected dense_21 to have 3 dimensions, but got array with shape (90000, 16)后者是解码器输入/目标的形状。为什么 Dense分层解码器输入数据的形状数组?

我尝试过的事情:
  • 我觉得有点奇怪,解码器 LSTM 有一个 return_sequences=True因为我认为我不能给 Dense 一个序列层(原始字符级模型的解码器没有说明这一点)。但是,只需删除或设置 return_sequences=False没有帮助。当然,Dense图层现在的输出形状为 (None, 3572) .
  • 我不太需要 Input层。我已将它们设置为 shape=(max_input_seq_len, )shape=(max_target_seq_len, )分别以使摘要不显示 (None, None)但各自的值,例如,(None, 16) .没变。
  • Keras Docs我读过嵌入层应该与 input_length 一起使用, 否则为 Dense上游层无法计算其输出。但同样,当我设置 input_length 时仍然出错因此。

  • 我有点陷入僵局吧?我是在正确的轨道上还是我错过了更根本的东西。我的数据的形状是错误的吗?为什么最后 Dense层获取具有形状的数组 (90000, 16) ?这似乎有点不对劲。

    更新:我发现问题似乎是 decoder_target_data当前形状为 (#sample, max_seq_len) ,例如, (90000, 16) .但我假设我需要针对词汇表对目标输出进行单热编码: (#sample, max_seq_len, vocab_size) ,例如, (90000, 16, 3572) .

    不幸的是,这会抛出 Memory错误。但是,当我出于调试目的进行调试时,即假设词汇量大小为 10:
    decoder_target_data = np.zeros((len(input_sequences), max_target_seq_len, 10), dtype='float32')

    后来在解码器模型中:
    x = Dense(10, activation='softmax')(x)

    然后模型训练没有错误。如果这确实是我的问题,我必须手动生成批次来训练模型,这样我就可以保持词汇量大小但减少 #samples ,例如,每个形状为 90 个批次 (1000, 16, 3572) .我在正确的轨道上吗?

    最佳答案

    最近我也面临这个问题。没有其他解决方案然后创建小批量说 batch_size=64generator然后代替 model.fitmodel.fit_generator .我附上了我的 generate_batch代码如下:

    def generate_batch(X, y, batch_size=64):
    ''' Generate a batch of data '''
    while True:
    for j in range(0, len(X), batch_size):
    encoder_input_data = np.zeros((batch_size, max_encoder_seq_length),dtype='float32')
    decoder_input_data = np.zeros((batch_size, max_decoder_seq_length+2),dtype='float32')
    decoder_target_data = np.zeros((batch_size, max_decoder_seq_length+2, num_decoder_tokens),dtype='float32')

    for i, (input_text_seq, target_text_seq) in enumerate(zip(X[j:j+batch_size], y[j:j+batch_size])):
    for t, word_index in enumerate(input_text_seq):
    encoder_input_data[i, t] = word_index # encoder input seq

    for t, word_index in enumerate(target_text_seq):
    decoder_input_data[i, t] = word_index
    if (t>0)&(word_index<=num_decoder_tokens):
    decoder_target_data[i, t-1, word_index-1] = 1.

    yield([encoder_input_data, decoder_input_data], decoder_target_data)

    然后像这样训练:
    batch_size = 64
    epochs = 2

    # Run training
    model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

    model.fit_generator(
    generator=generate_batch(X=X_train_sequences, y=y_train_sequences, batch_size=batch_size),
    steps_per_epoch=math.ceil(len(X_train_sequences)/batch_size),
    epochs=epochs,
    verbose=1,
    validation_data=generate_batch(X=X_val_sequences, y=y_val_sequences, batch_size=batch_size),
    validation_steps=math.ceil(len(X_val_sequences)/batch_size),
    workers=1,
    )
    X_train_sequences是列表列表,如 [[23,34,56], [2, 33544, 6, 10]] .
    其他的也一样。

    也从这个博客中得到了帮助 - word-level-english-to-marathi-nmt

    关于machine-learning - 带有 Keras 的词级 Seq2Seq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48728099/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com