嗨,我是初学者keras。
我在做模特。
步骤1.输入批处理和单词列表,(BATCH_SIZE,WORD_INDEX_LIST)步骤2.获得每个单词的单词嵌入(BATCH_SIZE,WORD_LENGTH,EMBEDDING_SIZE)步骤3.对每个批次中每个单词的平均嵌入。(BATCH_SIZE,EMBEDDING_SIZE)步骤4。重复向量N,(BATCH_SIZE,N,EMBEDDING_SIZE)步骤5。每个步骤都应用密集层
所以,我写代码。
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)
为什么批量大小改变了?我错了吗?
问题出在Lambda
运算符中。在您的情况下,它需要一个张量的形状(batch_size, max_len, embedding_size)
,并期望产生一个张量的形状(batch_size, embedding_size)
。但是,Lambda
运算符不知道您在内部应用了哪种转换,因此在图形编译期间错误地假定形状不变,因此假定输出形状为(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)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句