我正在使用生成器训练模型,并且从Tensorflow收到此警告,尽管我可以正确地训练模型,但我想解决这个问题,或者至少了解它为什么会发生。
我来自生成器的数据具有以下形状:
for x, y in model_generator(): # x[0] and x[1] are the inputs, y is the output
print(x[0].shape, x[1].shape, y.shape)
# (20,)(20,)(20,17772)
# 17772 --> Number of unique words in my datatset
# 20 --> Number of words per example (per sentence)
这是我的模特
Model: "functional_1"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_1 (InputLayer) [(None, 20)] 0
__________________________________________________________________________________________________
input_2 (InputLayer) [(None, 20)] 0
__________________________________________________________________________________________________
embedding (Embedding) (None, 20, 50) 890850 input_1[0][0]
__________________________________________________________________________________________________
embedding_1 (Embedding) (None, 20, 50) 890850 input_2[0][0]
__________________________________________________________________________________________________
lstm (LSTM) [(None, 64), (None, 29440 embedding[0][0]
__________________________________________________________________________________________________
lstm_1 (LSTM) (None, 20, 64) 29440 embedding_1[0][0]
lstm[0][1]
lstm[0][2]
__________________________________________________________________________________________________
time_distributed (TimeDistribut (None, 20, 17772) 1155180 lstm_1[0][0]
==================================================================================================
Total params: 2,995,760
Trainable params: 1,214,060
Non-trainable params: 1,781,700
__________________________________________________________________________________________________
None
这是我在运行模型时收到的警告:
WARNING:tensorflow:Model was constructed with shape (None, 20) for input Tensor("input_1:0", shape=(None, 20), dtype=float32), but it was called on an input with incompatible shape (None, 1).
WARNING:tensorflow:Model was constructed with shape (None, 20) for input Tensor("input_2:0", shape=(None, 20), dtype=float32), but it was called on an input with incompatible shape (None, 1).
WARNING:tensorflow:Model was constructed with shape (None, 20) for input Tensor("input_1:0", shape=(None, 20), dtype=float32), but it was called on an input with incompatible shape (None, 1).
WARNING:tensorflow:Model was constructed with shape (None, 20) for input Tensor("input_2:0", shape=(None, 20), dtype=float32), but it was called on an input with incompatible shape (None, 1).
我不明白为什么会这样,输入的形状是(20,),所以应该正确,有任何建议吗?
编辑
生成器:
def model_generator():
for index, output in enumerate(training_decoder_output):
for i in range(size):
yield ([training_encoder_input[size*index+i], training_decoder_input[size*index+i]], output[i])
# Generator, returns inputs and ouput one by one when calling
# (I saved the outputs in chunks on disk so that's why I iterate over it in that way)
致电model.fit()
:
model.fit(model_generator(), epochs=5)
training_encoder_input
的示例:
print(training_encoder_input[:5])
[[ 3 1516 10 3355 2798 1 9105 1 9106 4 162 1 411 1
9107 3356 612 1 9108 1]
[ 0 0 0 0 0 0 0 0 0 0 0 2 9109 2799
5632 29 1187 2 157 275]
[ 0 54 5633 5634 1 412 4199 12 9110 5633 5634 27 443 134
1516 7 6 4200 1280 1]
[ 23 9112 816 11 9113 33 184 9114 816 1 9115 42 3 2
57 5 2120 3 185 1]
[ 0 0 0 0 0 0 15 301 9116 3 3357 1 9117 1
67 5635 4 110 5635 1]]
答案 0 :(得分:3)
您输入的形状应为:
x[0].shape => (1,20,) # where 1 is batch size.
在模型None
中为批次大小,因此此特定尺寸也应出现在您的x
数据中。因此,您需要将生成的更新为:
def model_generator():
for index, output in enumerate(training_decoder_output):
for i in range(size):
yield ([np.expand_dims(training_encoder_input[size*index+i], axis=0), np.expand_dims(training_decoder_input[size*index+i]], axis=0), np.expand_dims(output[i], axis=0))
如果批处理大小超过一个,则创建一个元素列表/数组,形式为(bs,20,)
,其中bs
是批处理大小。