Deep learning 在Keras(深度学习库)中,RepeatVector+;时间分布=错误?

Deep learning 在Keras(深度学习库)中,RepeatVector+;时间分布=错误?,deep-learning,keras,Deep Learning,Keras,嗨,我是初学者凯拉斯 我在做模型 第一步。输入批次和单词列表(批次大小、单词索引列表) 第二步。获取每个单词的单词嵌入(批量大小、单词长度、嵌入大小) 第三步。平均每批中嵌入的每个单词。(批量大小、嵌入大小) 第四步。重复向量N,(批量大小,N,嵌入大小) 第五步。每一步都涂上致密层 所以,我写代码 MAX_LEN = 20 ( = WORD_INDEX_LIST) step 1 layer_target_input = Input(shape=(MAX_LEN,), dtype="int3

嗨,我是初学者凯拉斯

我在做模型

第一步。输入批次和单词列表(批次大小、单词索引列表) 第二步。获取每个单词的单词嵌入(批量大小、单词长度、嵌入大小) 第三步。平均每批中嵌入的每个单词。(批量大小、嵌入大小) 第四步。重复向量N,(批量大小,N,嵌入大小) 第五步。每一步都涂上致密层

所以,我写代码

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)
回溯(最近一次呼叫最后一次):
文件“Main.py”,第127行,在
r=model.predict({“layer\u target\u input”:dev\u targ})
文件“/usr/local/anaconda/lib/python2.7/site packages/Keras-1.0.7-py2.7.egg/Keras/engine/training.py”,第1180行
批次大小=批次大小,详细=详细)
文件“/usr/local/anaconda/lib/python2.7/site packages/Keras-1.0.7-py2.7.egg/Keras/engine/training.py”,第888行,循环中
outs[i][batch_start:batch_end]=batch_out
ValueError:无法将输入数组从形状(30,20,50)广播到形状(2,20,50)
为什么批量大小会改变?
我怎么了?

问题出在
Lambda
操作符中。在您的例子中,它采用形状张量
(批大小,最大长度,嵌入大小)
,并预期产生形状张量
(批大小,嵌入大小)
。但是,
Lambda
op不知道您在内部应用了什么转换,因此在图形编译期间错误地假设形状没有改变,因此假设输出形状是
(批处理大小、最大长度、嵌入大小)
。接下来的
RepeastVector
期望输入是二维的,但从未断言是二维的。它生成预期形状的方式是
(批量大小、重复次数、形状[1])
。由于
Lambda
错误地将其形状报告为
(批大小、最大长度、嵌入大小)
RepeatVector
现在将其形状报告为
(批大小、重复次数、最大长度)
,而不是预期的
(批大小、重复次数、嵌入大小)
num\u repetitions
在您的例子中与
max\u len
相同,因此
RepeastVector
将其形状报告为
(批大小、max\u len、max\u len)
时间分布(密集)
的工作方式是:

Reshape((-1, input_shape[2]))
Dense()
Reshape((-1, input_shape[1], num_outputs))
现在,
input\u shape[2]
被错误地假定为
max\u len
,而不是
embedded\u size
,但是给出的实际张量具有正确的
(批大小,max\u len,embedded\u size)
,因此最终发生的情况是:

Reshape((batch_size * embedding_size, max_len))
Dense()
Reshape((batch_size * embedding_size / max_len, max_len, num_outputs))
在您的情况下,
batch\u size*embedding\u size/max\u 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)

这是一个完美的解释和答案。这可能有助于解决我的问题。非常感谢!!