将多个模型的输出组合成一个模型

时间:2017-03-31 22:36:17

标签: classification keras conv-neural-network

我目前正在寻找一种可以将多个模型的输出组合成一个模型的方法,我需要创建一个进行分类的CNN网络。

enter image description here

图像被分成几个部分(如颜色所示),每个部分作为输入给定某个模型(1,2,3,4),每个模型的结构是相同的,但每个部分都给出到一个单独的模型,以确保相同的重量不适用于整个图像 - 我试图避免完全的重量分享,并保持重量共享本地。然后,每个模型执行卷积和最大池化,并生成某种输出,这些输出必须输入到密集层中,该层获取先前模型(模型1,2,3,4)的输出并执行分类。

我的问题是可以创建模型1,2,3,4并将其连接到完全连接的层并训练给定输入部分和输出类的所有模型 - 无需定义输出keras中的卷积和汇集层?

1 个答案:

答案 0 :(得分:5)

是的,您可以使用多输入和多输出模型创建此类模型,有关详细信息,请参阅keras documentation。在这里,我分享代码示例,希望这有帮助

import numpy as np
import keras
from keras.optimizers import SGD
from keras.models import Sequential, Model
from keras.layers import Activation, Dense, Dropout, Flatten, Input, Merge, Convolution2D, MaxPooling2D

# Generate dummy data
train1 = np.random.random((100, 100, 100, 3))
train2 = np.random.random((100, 100, 100, 3))
train3 = np.random.random((100, 100, 100, 3))
train4 = np.random.random((100, 100, 100, 3))

y_train = keras.utils.to_categorical(np.random.randint(10, size=(100, 1)), num_classes=10)

#parallel ip for different sections of image
inp1 = Input(shape=train1.shape[1:])
inp2 = Input(shape=train2.shape[1:])
inp3 = Input(shape=train3.shape[1:])
inp4 = Input(shape=train4.shape[1:])

# paralle conv and pool layer which process each section of input independently
conv1 = Conv2D(64, (3, 3), activation='relu')(inp1)
conv2 = Conv2D(64, (3, 3), activation='relu')(inp2)
conv3 = Conv2D(64, (3, 3), activation='relu')(inp3)
conv4 = Conv2D(64, (3, 3), activation='relu')(inp4)

maxp1 = MaxPooling2D((3, 3))(conv1)
maxp2 =MaxPooling2D((3, 3))(conv2)
maxp3 =MaxPooling2D((3, 3))(conv3)
maxp4 =MaxPooling2D((3, 3))(conv4)

# can add multiple parallel conv, pool layes to reduce size

flt1 = Flatten()(maxp1)
flt2 = Flatten()(maxp2)
flt3 = Flatten()(maxp3)
flt4 = Flatten()(maxp4)

mrg = Merge(mode='concat')([flt1,flt2,flt3,flt4])

dense = Dense(256, activation='relu')(mrg)

op = Dense(10, activation='softmax')(dense)

model = Model(input=[inp1, inp2, inp3, inp4], output=op)
model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
model.fit([train1,train2,train3,train4], y_train,
          nb_epoch=10, batch_size=28)