首页 文章

如何在keras中使用并行卷积层?

提问于
浏览
11

我对神经网络和keras有点新 . 我有一些大小为6 * 7的图像,过滤器的大小为15.我想有几个过滤器并分别训练卷积层,然后将它们组合起来 . 我在这里看了一个例子:

model = Sequential()
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1],
                    border_mode='valid',
                    input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(nb_filters, kernel_size[0], kernel_size[1]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=pool_size))
model.add(Dropout(0.25))
model.add(Flatten(input_shape=input_shape))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('tanh'))

此模型适用于一个过滤器 . 任何人都可以给我一些关于如何修改模型以使用并行卷积层的提示 .

谢谢

2 回答

  • 11

    我的方法是创建定义所有并行卷积和拉动操作的其他模型,并将所有并行结果张量连接到单输出张量 . 现在,您可以像顺序层一样在顺序模型中添加此并行模型图 . 这是我的解决方案,希望它能解决您的问题 .

    #variable initialization 
    nb_filters =100
    kernel_size= {}
    kernel_size[0]= [3,3]
    kernel_size[1]= [4,4]
    kernel_size[2]= [5,5]
    input_shape=(32, 32, 3)
    pool_size = (2,2)
    nb_classes =2
    no_parallel_filters = 3
    
    # create seperate model graph for parallel processing with different filter sizes
    # apply 'same' padding so that ll produce o/p tensor of same size for concatination
    # cancat all paralle output
    
    inp = Input(shape=input_shape)
    convs = []
    for k_no in range(len(kernel_size)):
        conv = Convolution2D(nb_filters, kernel_size[k_no][0], kernel_size[k_no][1],
                        border_mode='same',
                             activation='relu',
                        input_shape=input_shape)(inp)
        pool = MaxPooling2D(pool_size=pool_size)(conv)
        convs.append(pool)
    
    if len(kernel_size) > 1:
        out = Merge(mode='concat')(convs)
    else:
        out = convs[0]
    
    conv_model = Model(input=inp, output=out)
    
    # add created model grapg in sequential model
    
    model = Sequential()
    model.add(conv_model)        # add model just like layer
    model.add(Convolution2D(nb_filters, kernel_size[1][0], kernel_size[1][0]))
    model.add(Activation('relu'))
    model.add(MaxPooling2D(pool_size=pool_size))
    model.add(Dropout(0.25))
    model.add(Flatten(input_shape=input_shape))
    model.add(Dense(128))
    model.add(Activation('relu'))
    model.add(Dense(128))
    model.add(Activation('relu'))
    model.add(Dropout(0.5))
    model.add(Dense(nb_classes))
    model.add(Activation('tanh'))
    

    有关更多信息,请参阅类似的问题:Combining the outputs of multiple models into one model

  • 13

    下面是在keras版本2中设计并行卷积和子采样层网络的示例 . 我希望这可以解决您的问题 .

    rows, cols = 100, 15
    def create_convnet(img_path='network_image.png'):
        input_shape = Input(shape=(rows, cols, 1))
    
        tower_1 = Conv2D(20, (100, 5), padding='same', activation='relu')(input_shape)
        tower_1 = MaxPooling2D((1, 11), strides=(1, 1), padding='same')(tower_1)
    
        tower_2 = Conv2D(20, (100, 7), padding='same', activation='relu')(input_shape)
        tower_2 = MaxPooling2D((1, 9), strides=(1, 1), padding='same')(tower_2)
    
        tower_3 = Conv2D(20, (100, 10), padding='same', activation='relu')(input_shape)
        tower_3 = MaxPooling2D((1, 6), strides=(1, 1), padding='same')(tower_3)
    
        merged = keras.layers.concatenate([tower_1, tower_2, tower_3], axis=1)
        merged = Flatten()(merged)
    
        out = Dense(200, activation='relu')(merged)
        out = Dense(num_classes, activation='softmax')(out)
    
        model = Model(input_shape, out)
        plot_model(model, to_file=img_path)
        return model
    

    此网络的图像看起来像
    enter image description here

相关问题