Keras `Input` 层返回层 [(None, 32)] 而不是 (None, 32) 总结

Keras `Input` Layer is returning layer [(None, 32)] rather than (None, 32) in summary

Keras 版本 2.4.3

我正在创建一个简单的 Image-Caption 模型,它有两个输入和一个输出。

模型定义代码如下:

# Image feat part
imginp = Input(shape=(512,))
imglay1 = Dropout(0.5)(imginp)
imglay2 = Dense(EMBED_SIZE, activation=act)(imglay1)
# LSTM Part
textinp = Input(shape=(39,))
textlay1 = Embedding(VOCAB_SIZE, EMBED_SIZE, mask_zero=True)(textinp) 
textlay2 = Dropout(0.5)(textlay1)
textlay3 = LSTM(EMBED_SIZE)(textlay2)
# # Decoder part that combines both
declay1 = Add()([imglay2, textlay3])
declay2 = Dense(EMBED_SIZE, activation=act)(declay1)
output = Dense(VOCAB_SIZE, activation="softmax")(declay2)
# Creating keras model
model = tf.keras.models.Model(inputs=[imginp,textinp],outputs=output)
model.summary()

然而,该模型在 model.fit() 上给出了一个错误,我注意到输入层给出了一个奇怪的输出,我认为这是导致错误的原因。 summary 的片段如下所示:

__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
input_82 (InputLayer)           [(None, 39)]         0                                            
__________________________________________________________________________________________________
input_81 (InputLayer)           [(None, 512)]        0                                            
__________________________________________________________________________________________________
embedding_31 (Embedding)        (None, 39, 300)      511800      input_82[0][0]                   
__________________________________________________________________________________________________
dropout_79 (Dropout)            (None, 512)          0           input_81[0][0]                   

如您所见,输入层的输出形状需要 (None, 512)(None, 39),但它们似乎是一个列表。因此,尽管我确实测试了 python data-generator,但我得到了 ValueError: no grad available for the variables。我相信这个 Input 层 api 导致了一些奇怪的错误。

有什么想法吗?

我在 keras 2.4.0 中测试过。我有相同的 model.summary() 和 [(None, 32)].

但是你的代码(keras 2.4.0)我没有发现任何错误:

import tensorflow as tf
from tensorflow.keras.layers import Input, LSTM, Dense, Dropout, Embedding, Add
from tensorflow.keras import Model, Sequential

EMBED_SIZE = 512
VOCAB_SIZE = 100
# Image feat part
imginp = Input(shape=(512,))
imglay1 = Dropout(0.5)(imginp)
imglay2 = Dense(EMBED_SIZE)(imglay1)
# LSTM Part
textinp = Input(shape=(39,))
textlay1 = Embedding(VOCAB_SIZE, EMBED_SIZE, mask_zero=True)(textinp) 
textlay2 = Dropout(0.5)(textlay1)
textlay3 = LSTM(EMBED_SIZE)(textlay2)
# # Decoder part that combines both
declay1 = Add()([imglay2, textlay3])
declay2 = Dense(EMBED_SIZE)(declay1)
output = Dense(VOCAB_SIZE, activation="softmax")(declay2)
# Creating keras model
model = tf.keras.models.Model(inputs=[imginp,textinp],outputs=output)
model.summary()

img = tf.random.uniform([10, 512], dtype=tf.float32)
txt = tf.random.uniform([10, 39], 0, VOCAB_SIZE, dtype=tf.int32)
labels = tf.random.uniform([10], 0, VOCAB_SIZE, dtype=tf.int32)
#pred = model((img, txt))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.fit((img, txt), labels)

我想指出导致这种差异的两件事 -

(1) 运行本地代码与 GoogleCollab 上的代码会导致差异,如果代码块在 Collab 上 运行,它会在这个实例中抛出一个错误,表示梯度无法传播.所以,这似乎是 Collab 的问题。

(2) 此外,Collab 中的另一个怪癖是,如果在 py 文件中编写的函数被导入到 Collab env 中,然后从笔记本中作为 api 调用,则会弹出此错误。它与 Keras 版本无关,但与我无法调试的 Collab 运行tine 的基本行为有关。

很高兴我能弄清楚并测试它。更多详情请评论,我会尽力解答。