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.请随时寻求帮助