如何将输入数据发送到我的多通道深度学习模型?

问题描述 投票:0回答:1

我有一些输入,想要实现一个多通道输出深度模型。因此,输入将是形状为 (1300, 320, 320) 的 5 个数组的列表,其中 1300 是该数组中图像的总数,每个图像将为 320*320。我想到的模型与下图非常相似:

我写了下面的代码,但不确定这是否是正确的方法?另一个问题是我不确切知道如何提供输入并编写代码的训练部分。

def MyMultiChannelNet(input_channels):
    channels = []
    models = []

    for i in range(input_channels):
        input_layer = Input(shape=(320, 320, 1))
        channels.append(input_layer)

        x = Conv2D(64, (3, 3), activation='relu', padding='same')(input_layer)
        x = BatchNormalization()(x)
        x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = MaxPooling2D((2, 2), strides=(2, 2))(x)

        x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = MaxPooling2D((2, 2), strides=(2, 2))(x)

        x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = MaxPooling2D((2, 2), strides=(2, 2))(x)

        models.append(Model(inputs=input_layer, outputs=x))

    merged = concatenate([model.output for model in models])

    x = Flatten()(merged)
    x = Dense(4096, activation='relu')(x)
    x = BatchNormalization()(x)
    x = Dense(4096, activation='relu')(x)
    x = BatchNormalization()(x)

    output_layer = Dense(1, activation='sigmoid')(x)

    model = Model(inputs=channels, outputs=output_layer)

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

    return model
deep-learning model conv-neural-network
1个回答
0
投票

你所实现的将创建5个独立的网络,每个通道将被单独处理,而不看其他通道。最后,浅层(2 层)MLP 是混合所有这些数据的唯一地方。这是一种非常不标准的模型,通常我们只会将一个网络应用于整个模型。卷积已经能够处理宽度 x 高度 x 通道的数据,因此您不必执行任何操作,而是:


input_layer = Input(shape=(320, 320, input_channels))
x = Conv2D(64, (3, 3), activation='relu', padding='same')(input_layer)
x = BatchNormalization()(x)
...

换句话说,只需堆叠数据,使其成为[批量、宽度、高度、通道],然后对其应用常规的卷积网络堆栈。

如果您出于某种良好的建模原因想要进行这种分离,您也可以简化代码,不需要所有的小模型

def MyMultiChannelNet(input_channels):
    outputs = []

    input_layer = Input(shape=(320, 320, input_channels))

    for i in range(input_channels):
        channels.append(input_layer)
        input_channel = input_layer[:, :, input_channels:input_channels+1]
        x = Conv2D(64, (3, 3), activation='relu', padding='same')(input_channel)
        x = BatchNormalization()(x)
        x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = MaxPooling2D((2, 2), strides=(2, 2))(x)

        x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = MaxPooling2D((2, 2), strides=(2, 2))(x)

        x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = Conv2D(256, (3, 3), activation='relu', padding='same')(x)
        x = BatchNormalization()(x)
        x = MaxPooling2D((2, 2), strides=(2, 2))(x)

        outputs.append(x)

    merged = concatenate(outputs)

    x = Flatten()(merged)
    x = Dense(4096, activation='relu')(x)
    x = BatchNormalization()(x)
    x = Dense(4096, activation='relu')(x)
    x = BatchNormalization()(x)

    output_layer = Dense(1, activation='sigmoid')(x)

    model = Model(inputs=input_layer, outputs=output_layer)

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

    return model
© www.soinside.com 2019 - 2024. All rights reserved.