【问题标题】:Keras ImageDataGenerator flow directory with 3D CNN data format error?带有 3D CNN 数据格式错误的 Keras ImageDataGenerator 流目录?
【发布时间】:2018-05-08 11:38:29
【问题描述】:

我是 Keras 的新手,我有一个包含多个文件夹的数据集,每个文件夹都指向一个特定的类。我使用 ImageDataGenerator 从子文件夹中读取数据。 我正在尝试使用 16 个大小为 80x100 的连续帧,因此 input_shape 为 (16, 80, 100, 1)。 当我进行训练时,网络的输入出现错误,我知道输入应该是 3D CNN 的 5d 张量,但我不确定我这样做是否正确。

我正在使用spyder编写和实现代码:

from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation, Flatten, Conv3D, MaxPooling3D
from keras.layers.advanced_activations import LeakyReLU
from keras.optimizers import SGD, RMSprop
from keras.utils import np_utils, generic_utils
from keras.losses import categorical_crossentropy
from keras.optimizers import Adam
import os
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import cv2
from sklearn.cross_validation import train_test_split
from sklearn import cross_validation
from sklearn import preprocessing

datagen = ImageDataGenerator()
train_data=datagen.flow_from_directory('C:\\Users\\AA\\Data\\Training', target_size=(80, 100), color_mode='grayscale', classes=None, class_mode='categorical', batch_size=32, interpolation='nearest')
test_data=datagen.flow_from_directory('C:\\Users\\AA\\Data\\Testing', target_size=(80, 100), color_mode='grayscale', classes=None, class_mode='categorical', batch_size=32, interpolation='nearest')



    ins = (16, 80, 100, 1)
    model = Sequential()
    model.add(Conv3D(32, kernel_size=(3, 3, 3), input_shape=ins, border_mode='same'))
    model.add(Activation('relu'))
    model.add(Conv3D(32, kernel_size=(3, 3, 3), border_mode='same'))
    model.add(Activation('softmax'))
    model.add(MaxPooling3D(pool_size=(3, 3, 3), border_mode='same'))
    model.add(Dropout(0.25))

    model.add(Conv3D(64, kernel_size=(3, 3, 3), border_mode='same'))
    model.add(Activation('relu'))
    model.add(Conv3D(64, kernel_size=(3, 3, 3), border_mode='same'))
    model.add(Activation('softmax'))
    model.add(MaxPooling3D(pool_size=(3, 3, 3), border_mode='same'))
    model.add(Dropout(0.25))

    model.add(Flatten())
    model.add(Dense(512, activation='sigmoid'))
    model.add(Dropout(0.5))
    model.add(Dense(8, activation='softmax'))


 model.compile(loss=categorical_crossentropy, optimizer=Adam(), metrics=['accuracy'])    


   model.fit_generator(train_data,
        steps_per_epoch=2000,
        epochs=50,
        validation_data=test_data,
        validation_steps=800)

错误提示:

File "C:\Users\AA\AppData\Local\Continuum\Anaconda3\lib\site-packages\keras\engine\training.py", line 113, in _standardize_input_data
    'with shape ' + str(data_shape))

ValueError: Error when checking input: expected conv3d_24_input to have 5 dimensions, but got array with shape (32, 80, 100, 1)

【问题讨论】:

  • 任何有用的说明!

标签: python tensorflow keras convolutional-neural-network


【解决方案1】:

我认为问题出在ImageDataGenerator

它仅适用于图像,不适用于视频(我遇到了同样的错误,https://github.com/keras-team/keras/issues/10150 他们还声称ImageDataGenerator 仅适用于图像形状的张量。他们还建议实现您自己的数据生成就像https://stanford.edu/~shervine/blog/keras-how-to-generate-data-on-the-fly.html 中描述的那样,但我自己没有尝试过)

【讨论】:

    【解决方案2】:

    https://gist.github.com/Emadeldeen-24/736c33ac2af0c00cc48810ad62e1f54a

    这是一个自定义图像数据生成器,用于将 5D 输入到 Conv3D 网络。希望对您有所帮助。

    from tweaked_ImageGenerator_v2 import ImageDataGenerator
    datagen = ImageDataGenerator()
    train_data=datagen.flow_from_directory('path/to/data', target_size=(x, y), batch_size=32, frames_per_step=4)
    
    【解决方案3】:

    该模型将您的输入解释为 16 个 80x100 灰度图像的样本。您必须将输入重塑为

    (no_of_samples,16,80,100,1)
    

    这里有 16 个时间步

    【讨论】:

    • 感谢回复,train_data 本身的样本数是多少?当我试图重塑 train_data 但即使我使用相同的重塑功能时仍然会发生错误。或者我应该在输入中将这个结构写成:ins = (no_of_samples,16,80,100,1) .. 谢谢
    • 是的,我的意思是如果你有 32 张图像,那么你将有 2 个 16 帧的序列。所以你的形状将是(2,16,80,100,1)。所以你将不得不重塑它。只是您必须注意正确获取序列,因为您无法控制 ImageDataGenerator 的顺序
    • 我尝试将输入形状更改为 (samples, 80, 100, 16, 1),但出现错误,期望 5d 但找到 6d。我也尝试使用 XX = (train_data.samples, 80, 100, 16, 1) 并且有一个错误说元组对象不是迭代器。我尝试在stackoverflow.com/questions/42699956/… 中找到相同的方法,但无法重塑 train_data!
    • user239457,我忘了说samples = 193
    • 伙计们,我该如何重塑它?我只是遇到了这个错误,我确实用 2D conv 对其进行了测试,它工作正常。
    猜你喜欢
    • 2019-02-08
    • 1970-01-01
    • 2020-08-28
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多