python - 带有 3D CNN 数据格式错误的 Keras ImageDataGenerator 流目录?
问题描述
我是 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)
解决方案
我认为问题出在ImageDataGenerator
.
它仅适用于图像,不适用于视频(我遇到了同样的错误,在https://github.com/keras-team/keras/issues/10150,他们还声称ImageDataGenerator
仅适用于图像形张量。他们也建议实现您自己的数据生成,如https://stanford.edu/~shervine/blog/keras-how-to-generate-data-on-the-fly.html中所述,但我自己没有尝试过)
推荐阅读
- java - 如何使用 Configuration.assertionMode = AssertionMode.SOFT; 混合框架(硒+硒化物)
- javascript - 包含带有特殊字符的字段的 JavaScript 解构对象
- javascript - if 语句中的正则表达式验证
- docker - Docker 启动失败 (vrc=VERR_NEM_VM_CREATE_FAILED, rc=E_FAIL (0X80004005)
- node.js - 如何使用listObjects在nodeJS中的IBM COS中单独获取嵌套文件
- python - ModuleNotFoundError 尽管软件包已正确安装
- c# - 使用 ASP.NET 在下拉菜单中显示 ID 和值
- bash - 有没有办法在 shell 脚本的 for cicle 循环中更改/清理变量?
- python - 在 python 中获取香港地理编码的问题
- ruby-on-rails - Rails 应用程序中的路线顺序是否重要