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

2024-04-16 20:02:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我是ml/ai的新手,我正在尝试建立一个cnn+lstm,但我正在与lstm的形状作斗争。我正在使用ImageDataGenerator以10的批量大小传递48 x 48灰度图像。它是二元分类(a或b)。这些图像本身是一个视频的帧,我正在尝试通过它来更好地理解帧序列,因为它与整个视频的预测有关。cnn本身可以工作,但是当我添加lstm时,我得到了一个错误

这是我的密码:

cnn = Sequential()

num_timesteps = 2

# 1st conv layer
cnn.add(Conv2D(64,(3,3), padding='same', input_shape=(48, 48, 1)))
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(TimeDistributed(cnn, input_shape=(None, 48, 48, 1)))
model.add(LSTM(num_timesteps))
model.add(Dropout(0.2)) 
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])

运行model.fit时发生的错误是:

ValueError: Error when checking input: expected time_distributed_56_input to have 5 dimensions, but got array with shape (10, 48, 48, 1)

我曾尝试将时间步数添加到维度中,但这似乎不起作用

我不确定我做错了什么

任何帮助都将不胜感激


Tags: addlayerinputmodelactivationcnndropoutrelu
1条回答
网友
1楼 · 发布于 2024-04-16 20:02:01

可以放置重塑层,然后更改输入形状:

model.add(Reshape((1, 48, 48, 1)))
model.add(TimeDistributed(cnn, input_shape=(1, 48, 48, 1)))

完整工作示例:

import os
os.environ['CUDA_VISIBLE_DEVICES'] = '-1'
from tensorflow.keras import Sequential
from tensorflow.keras.layers import *
import numpy as np


cnn = Sequential()

num_timesteps = 2

# 1st conv layer
cnn.add(Conv2D(8,(3,3), padding='same', input_shape=(48, 48, 1)))
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(8,(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(8,(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(8,(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(8))
cnn.add(BatchNormalization())
cnn.add(Activation('relu'))
cnn.add(Dropout(0.5))

#fully connected 2
cnn.add(Dense(8))
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=(1, 48, 48, 1)))
model.add(LSTM(num_timesteps))
model.add(Dropout(0.2))
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['acc'])

model.fit(np.random.rand(100, 48, 48, 1), np.random.rand(100))

相关问题 更多 >