Python 连接张量列表时的Keras错误
我正在复制两个版本的代码,我相信它们是相同的,但其中一个有效,另一个无效:Python 连接张量列表时的Keras错误,python,tensorflow,keras,Python,Tensorflow,Keras,我正在复制两个版本的代码,我相信它们是相同的,但其中一个有效,另一个无效: from tensorflow.keras.layers import Dense, Input, Lambda, concatenate from tensorflow.keras.models import Model inp = Input(shape=(9,)) # Version 1 (works) out_1 = Dense(1)(Lambda(lambda x: x[:,0:4])(inp)) out
from tensorflow.keras.layers import Dense, Input, Lambda, concatenate
from tensorflow.keras.models import Model
inp = Input(shape=(9,))
# Version 1 (works)
out_1 = Dense(1)(Lambda(lambda x: x[:,0:4])(inp))
out_2 = Dense(1)(Lambda(lambda x: x[:,4:9])(inp))
out = concatenate([out_1, out_2])
model = Model(inp, out)
model.compile(...)
model.fit(...) ✓
# Version 2 (doesn't work)
out = concatenate([Dense(1)(Lambda(lambda x: x[:,i:j])(inp)) for i, j in [(0, 4), (4, 9)]]) # concatenating with a list comprehension
model = Model(inp, out)
model.compile(...)
model.fit(...) ✗
错误消息是:
ValueError: Input 0 of layer dense_2 is incompatible with the layer: expected axis -1 of input shape to have value 4 but received input with shape (None, 5)
我不确定这是代码中的错误还是错误,但在使用列表理解时,连接似乎是在混合张量。感谢您:)
需要说明的是,compile
和fit
函数对于这两种情况都是相同的:
import numpy as np
X = np.random.uniform(0, 1, (100, 9))
Y = np.random.uniform(0, 1, (100, 2))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y)
ValueError:layer density_2的输入0与层不兼容:输入形状的轴-1应具有值4,但接收到带形状的输入(无,5)
我已经清楚地告诉你,你正在使用的连接是在错误的轴上。必须使其在第一个轴(0)而不是第二个轴上连接。
值4
表示它正在查找第二个轴,即[0:4],而您正在连接[4:9](即5)。尝试更改轴参数,一切都会好起来
>
Model: "model_3"
__________________________________________________________________________________________________
Layer (type) Output Shape Param # Connected to
==================================================================================================
input_2 (InputLayer) [(None, 9)] 0
__________________________________________________________________________________________________
lambda_6 (Lambda) (None, 4) 0 input_2[0][0]
__________________________________________________________________________________________________
lambda_7 (Lambda) (None, 5) 0 input_2[0][0]
__________________________________________________________________________________________________
dense_6 (Dense) (None, 1) 5 lambda_6[0][0]
__________________________________________________________________________________________________
dense_7 (Dense) (None, 1) 6 lambda_7[0][0]
__________________________________________________________________________________________________
concatenate_3 (Concatenate) (None, 2) 0 dense_6[0][0]
dense_7[0][0]
==================================================================================================
Total params: 11
Trainable params: 11
Non-trainable params: 0
__________________________________________________________________________________________________
WARNING:tensorflow:From /home/dtlam26/.local/lib/python3.7/site-packages/tensorflow_core/python/ops/math_grad.py:1424: where (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
Train on 100 samples
100/100 [==============================] - 1s 10ms/sample - loss: 4.1017 - acc: 0.0000e+00
第一个版本将在两个层上连接,因此默认情况下不会错误地通过轴=-1连接。我认为您的失败在于
计算
或拟合
函数,而不是列表组件,两个模型都有相同的摘要compile
和fit
对于这两种情况都是完全相同的shmm…那么我认为您需要更新您的keras版本,因为我无法重现您的错误您在tensorflow和keras中使用的是哪一个版本,@Kenan?我在tensorflow 2.0.0tried串联([…],axis=0)
,同样的错误。还有axis=1
和axis=-1
您使用的是哪种版本的keras?我只是在1.15上进行测试,一切看起来都很好,1.15似乎是当今最稳定的版本:D.请随时寻求帮助