【问题标题】:ValueError: Error when checking input: expected time_distributed_55_input to have 5 dimensions, but got array with shape (10, 48, 48, 1)ValueError:检查输入时出错:预期 time_distributed_55_input 有 5 个维度,但得到的数组形状为 (10, 48, 48, 1)
【发布时间】:2020-09-03 22:23:50
【问题描述】:

我是 ml/ai 的新手,我正在尝试构建一个 cnn+lstm,但我正在为 lstm 的形状而苦苦挣扎。我使用 ImageDataGenerator 传递 48 x 48 灰度图像,批量大小为 10。它是二元分类(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: 检查输入时出错:预期 time_distributed_56_input 有 5 个维度,但得到的数组形状为 (10, 48, 48, 1)

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

我不知道我做错了什么

任何帮助将不胜感激!

【问题讨论】:

    标签: python tensorflow keras lstm conv-neural-network


    【解决方案1】:

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

    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))
    

    【讨论】:

      猜你喜欢
      • 2021-11-24
      • 1970-01-01
      • 2018-01-09
      • 2022-01-15
      • 2021-12-19
      • 2018-11-09
      • 1970-01-01
      • 2019-12-22
      • 2020-09-06
      相关资源
      最近更新 更多