【问题标题】:In Keras(Deep learning library), RepeatVector + TimeDistributed = Error?在 Keras(深度学习库)中,RepeatVector + TimeDistributed = Error?
【发布时间】:2016-12-23 13:59:36
【问题描述】:

大家好,我是 keras 初学者。

我正在制作一些模型。

step 1. 输入批次和单词列表,(BATCH_SIZE, WORD_INDEX_LIST) step 2. 获取每个词的词嵌入(BATCH_SIZE、WORD_LENGTH、EMBEDDING_SIZE) 步骤 3. 平均每个批次中的每个单词嵌入。 (BATCH_SIZE, EMBEDDING_SIZE) 步骤 4. 重复向量 N, (BATCH_SIZE, N, EMBEDDING_SIZE) step 5. 每个时间步都应用 Dense Layer

所以,我写代码。

MAX_LEN = 20 ( = WORD_INDEX_LIST)

 step 1
layer_target_input = Input(shape=(MAX_LEN,), dtype="int32", name="layer_target_input")


# step2
layer_embedding = Embedding(input_dim = n_symbols+1, output_dim=vector_dim,input_length=MAX_LEN, 
                                                 name="embedding", weights= [embedding_weights],trainable = False)
encoded_target = layer_embedding(layer_target_input)


# step 3
encoded_target_agg = KL.core.Lambda( lambda x: K.sum(x, axis=1) )(encoded_target)


#step 4
encoded_target_agg_repeat = KL.RepeatVector( MAX_LEN)(encoded_target_agg)



# step 5
layer_annotated_tahn = KL.Dense(output_dim=50, name="layer_tahn") 
layer_annotated_tahn_td = KL.TimeDistributed(layer_annotated_tahn) (encoded_target_agg_repeat)

model = KM.Model(input=[layer_target_input], output=[ layer_annotated_tahn_td])

r = model.predict({ "layer_target_input":dev_targ}) # dev_targ = (2, 20, 300)

但是,当我运行这段代码时, 结果如下。

Traceback (most recent call last):
  File "Main.py", line 127, in <module>
    r = model.predict({ "layer_target_input":dev_targ})
  File "/usr/local/anaconda/lib/python2.7/site-packages/Keras-1.0.7-py2.7.egg/keras/engine/training.py", line 1180, in predict
    batch_size=batch_size, verbose=verbose)
  File "/usr/local/anaconda/lib/python2.7/site-packages/Keras-1.0.7-py2.7.egg/keras/engine/training.py", line 888, in _predict_loop
    outs[i][batch_start:batch_end] = batch_out
ValueError: could not broadcast input array from shape (30,20,50) into shape (2,20,50)

为什么要更改批量大小? 我有什么问题?

【问题讨论】:

    标签: deep-learning keras


    【解决方案1】:

    问题出在Lambda 运算符上。在您的情况下,它需要一个形状为 (batch_size, max_len, embedding_size) 的张量,并且预计会产生一个形状为 (batch_size, embedding_size) 的张量。但是,Lambda op 不知道您在内部应用了什么转换,因此在图形编译期间错误地假设形状没有改变,因此假设输出形状为(batch_size, max_len, embedding_size)。后面的RepeastVector 期望输入是二维的,但从不断言它是这种情况。它产生预期形状的方式是(batch_size, num_repetitions, in_shape[1])。由于Lambda 错误地将其形状报告为(batch_size, max_len, embedding_size)RepeatVector 现在将其形状报告为(batch_size, num_repetitions, max_len),而不是预期的(batch_size, num_repetitions, embedding_size)num_repetitions 在您的情况下与 max_len 相同,因此 RepeastVector 将其形状报告为 (batch_size, max_len, max_len)TimeDistributed(Dense) 的工作方式是:

    Reshape((-1, input_shape[2]))
    Dense()
    Reshape((-1, input_shape[1], num_outputs))
    

    现在input_shape[2] 被错误地假定为max_len 而不是embedding_size,但给出的实际张量具有(batch_size, max_len, embedding_size) 的正确形状,所以最终发生的情况是:

    Reshape((batch_size * embedding_size, max_len))
    Dense()
    Reshape((batch_size * embedding_size / max_len, max_len, num_outputs))
    

    在您的情况下,batch_size * embedding_size / max_len 恰好是 2 * 300 / 20 = 30,这就是您错误形状的来源。

    要修复它,您需要明确告诉Lambda 您希望它生成的形状:

    encoded_target_agg = KL.core.Lambda( lambda x: K.sum(x, axis=1), output_shape=(vector_dim,))(encoded_target)
    

    【讨论】:

    • 这是一个完美的解释和答案。它可以帮助解决我的问题。非常感谢!!
    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 2021-04-08
    • 2017-06-15
    • 1970-01-01
    • 2019-02-05
    • 2021-04-04
    • 2015-03-14
    • 2017-01-03
    相关资源
    最近更新 更多