Sta*_*ack 4 python keras tensorflow
我正在用生成器训练一个模型,我从 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)
Run Code Online (Sandbox Code Playgroud)
这是我的模型:
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
Run Code Online (Sandbox Code Playgroud)
这是我在运行模型时收到的警告:
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).
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我得到这个,输入的形状是 (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)
Run Code Online (Sandbox Code Playgroud)
致电model.fit():
model.fit(model_generator(), epochs=5)
Run Code Online (Sandbox Code Playgroud)
样品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]]
Run Code Online (Sandbox Code Playgroud)
您输入的形状应如下所示:
x[0].shape => (1,20,) # where 1 is batch size.
Run Code Online (Sandbox Code Playgroud)
在模型中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))
Run Code Online (Sandbox Code Playgroud)
如果你有一个以上的批量大小,创建元素列表/阵列(bs,20,),其中bs为批量大小。
| 归档时间: |
|
| 查看次数: |
4821 次 |
| 最近记录: |