Tensorflow 运行Model.summary()时尚未生成模型,即使定义了输入层

Tensorflow 运行Model.summary()时尚未生成模型,即使定义了输入层,tensorflow,keras,lstm,cnn,Tensorflow,Keras,Lstm,Cnn,我对ml比较陌生,正在为视频分类构建CNN+LSTM模型,但在尝试运行Model.summary()时遇到错误 模型本身的一些背景:我正在使用ImageDataGenerator以15的批量传递(48,48,1)灰度图像。它是二元分类(a或b) 我在model.summary()中遇到了一个错误,在尝试修复此错误时,遇到了更多错误 以下是我的模型的代码: from tensorflow.keras import Sequential from tensorflow.keras.layers im

我对ml比较陌生,正在为视频分类构建CNN+LSTM模型,但在尝试运行Model.summary()时遇到错误

模型本身的一些背景:我正在使用ImageDataGenerator以15的批量传递(48,48,1)灰度图像。它是二元分类(a或b)

我在model.summary()中遇到了一个错误,在尝试修复此错误时,遇到了更多错误

以下是我的模型的代码:

from tensorflow.keras import Sequential
from tensorflow.keras.layers import *

cnn = Sequential()

num_timesteps = 2

# 1st conv layer
cnn.add(Conv2D(64,(3,3), padding='same'))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Dropout(0.5))

# 2nd conv layer
cnn.add(Conv2D(128,(5,5), padding='same'))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Dropout(0.5))

# 3rd conv layer
cnn.add(Conv2D(512,(3,3), padding='same'))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Dropout(0.5))

# 4th conv layer
cnn.add(Conv2D(512,(3,3), padding='same'))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(MaxPooling2D(pool_size=(2, 2)))
cnn.add(Dropout(0.5))

# flatten
cnn.add(Flatten())

# fully connected 1
cnn.add(Dense(256))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(Dropout(0.5))

#fully connected 2
cnn.add(Dense(512))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(Dropout(0.5))


model = Sequential()

model.add(Reshape((1, 48, 48, 1)))
model.add(TimeDistributed(cnn, input_shape=(num_timesteps, 48, 48, 1)))
model.add(LSTM(num_timesteps, return_sequences=True))
model.add(Dropout(0.5))
model.add(Dense(1, activation='softmax'))

#model.build(input_shape)

model.summary()

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])
我收到的错误是:

这个模型还没有建成。首先通过调用
Build()
或使用一些数据调用
fit()
来构建模型,或者在第一层中指定一个
input\u shape
参数以进行自动构建

我已经为模型指定了输入,所以我不明白为什么会出现这个错误

我已尝试通过执行以下操作来修复此错误:

我添加了model.build(),但这只会在稍后尝试运行model.predict()时带来后续错误。它声明“警告:tensorflow:未传递到第一层的
输入形状
的顺序模型无法重新加载其优化器状态。因此,您的模型正在使用新初始化的优化器启动”,然后出现以下错误:

TypeError:传递给参数“input”的值的数据类型uint8不在允许值列表中:float16、bfloat16、float32、float64、int32

我还尝试删除了修复model.summary()错误的重塑层,但在运行model.fit()时会出现不同的错误:

检查输入时出错:预期时间\u分布\u 108\u输入有5个维度,但得到了形状为(15,48,48,1)的数组

我也很困惑,为什么我会在这里得到一个错误,就像在查看model.summary输出中的输出形状时一样。很明显,有5个维度(无、2、48、48、64)。据我所知,“无”将替换为批次大小15

因此,我对所有这些错误的理解是,通过使用model.summary()中的input_形状修复第一个错误,或者使用model.fit()修复错误,其余的错误将被修复


感谢您花时间阅读本文,如果您能帮助解决这些错误,我们将不胜感激

必须将输入形状指定给每个模型的第一层,您不能这样做。@Dr.Snoopy请您解释一下我还应该在哪里指定第一层,或者我应该如何不同地指定第一层。我已经为CNN指定了它,我是否也应该为LSTM指定它?如果不太麻烦的话,你能把你的回答作为“回答”而不是评论吗?谢谢在您的CNN中,第一层(Conv2D)应该有一个输入形状,而在您的LSTM中,重塑层是第一层,因此这一层应该有一个输入形状,通过将其更改为model.add(重塑((1,48,48,1),输入形状=(48,48,1)),我能够解决这个错误!