python - 在keras中使用Conv3d将多个图像输入到同一个CNN

标签 python keras conv-neural-network

我想使用 conv3d 将 8 张图像同时输入到同一个 CNN 结构中。我的 CNN 模型如下:

def build(sample, frame, height, width, channels,  classes):
    model = Sequential()
    inputShape = (sample, frame, height, width, channels)
    chanDim = -1

    if K.image_data_format() == "channels_first":
        inputShape = (sample, frame, channels, height, width)
        chanDim = 1


    model.add(Conv3D(32, (3, 3, 3), padding="same", input_shape=inputShape))
    model.add(Activation("relu"))
    model.add(BatchNormalization(axis=chanDim))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), padding="same", data_format="channels_last"))
    model.add(Dropout(0.25))

    model.add(Conv3D(64, (3, 3, 3), padding="same"))
    model.add(Activation("relu"))
    model.add(BatchNormalization(axis=chanDim))
    model.add(MaxPooling3D(pool_size=(2, 2, 2), padding="same", data_format="channels_last"))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(128))    #(Dense(1024))
    model.add(Activation("relu"))
    model.add(BatchNormalization())
    model.add(Dropout(0.5))

    # softmax classifier
    model.add(Dense(classes))
    model.add(Activation("softmax")

模型的训练如下:

IMAGE_DIMS = (57, 8, 60, 60, 3) # since I have 460 images so 57 sample with 8 image each
data = np.array(data, dtype="float") / 255.0
labels = np.array(labels)
# binarize the labels
lb = LabelBinarizer()
labels = lb.fit_transform(labels)
# note: data is a list of all dataset images
(trainX, testX, trainY, testY) train_test_split(data, labels, test_size=0.2, random_state=42)                                                                                                          
aug = ImageDataGenerator(rotation_range=25, width_shift_range=0.1, height_shift_range=0.1, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode="nearest")

# initialize the model
model = CNN_Network.build(sample= IMAGE_DIMS[0], frame=IMAGE_DIMS[1],
                      height = IMAGE_DIMS[2], width=IMAGE_DIMS[3],
                      channels=IMAGE_DIMS[4], classes=len(lb.classes_))

opt = Adam(lr=INIT_LR, decay=INIT_LR / EPOCHS)
model.compile(loss="categorical_crossentropy", optimizer= opt, metrics=["accuracy"])

# train the network
model.fit_generator(
aug.flow(trainX, trainY, batch_size=BS),
validation_data=(testX, testY),
steps_per_epoch=len(trainX) // BS,
epochs=EPOCHS, verbose=1)

我对 input_shape 感到困惑,我知道 Conv3D 需要 5D 输入,输入是 4D,并且从 keras 添加批处理,但出现以下错误:

ValueError: Error when checking input: expected conv3d_1_input to have 5 dimensions, but got array with shape (92, 60, 60, 3)

谁能帮帮我,我该怎么办? 92 结果是什么,我用 (57, 8, 60, 60, 3) 确定 input_shape。我的 input_shape 应该变成什么,才能同时将 8 个彩色图像输入到同一模型。

最佳答案

** 编辑:更新了链接 Here是一个自定义图像数据生成器,用于 Conv3D 网络的 5D 输入。希望能帮助到你。以下是如何使用它的示例:

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)

您可以构建自己的 5D 张量:

frames_folder = 'path/to/folder'
X_data = []
y_data = []
list_of_sent = os.listdir(frames_folder)
print (list_of_sent)
class_num = 0
time_steps = 0  
frames = []
for i in list_of_sent:
    classes_folder = str(frames_folder + '/' + i) #path to each class
    print (classes_folder)
    list_of_frames = os.listdir(classes_folder)
    time_steps= 0
    frames = []
    for filename in  sorted(list_of_frames):   
        if ( time_steps == 8 ):
            X_data.append(frames) #appending each tensor of 8 frames resized to 110,110
            y_data.append(class_num) #appending a class label to the set of 8 frames
            j = 0  
            frames = []
        else:
            time_steps+=1
            filename = cv2.imread(vid + '/' + filename)
            filename = cv2.resize(filename,(110, 110),interpolation=cv2.INTER_AREA)
            frames.append(filename)


    class_num+=1
X_data = np.array(X_data)
y_data = np.array(y_data)

对于上面的代码片段,文件夹结构必须如下所示:

    data/
        class0/
            img001.jpg
            img002.jpg
            ...
        class1/
            img001.jpg
            img002.jpg
            ...

关于python - 在keras中使用Conv3d将多个图像输入到同一个CNN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54852430/

相关文章:

python - 使用 numpy 将 bool 数组索引到多维数组中

tensorflow - 卷积神经网络 (CNN) 输入形状

python - 在 python 中使用 tensorflow 实现一个基本的 CNN

machine-learning - 预训练如何改善神经网络的分类?

python - 在 pandas groupby 绘图栏中重新排序星期几

python - pyinstaller,导入错误: no module named pywintypes

python /博托 3 : How to retrieve/download files from AWS S3?

keras - 在回调 ModelCheckpoint 上使用模型保存历史记录

python - Keras 文档 : Multi-input and multi-output models Not able to follow

machine-learning - CNN : understanding weights output channel argument