首页 > 解决方案 > 我可以在 CNN 中展平后添加数据吗?

问题描述

我正在与 CNN 合作,我的教授希望我尝试包含一些相关的信息,但在图像本身中不可用。截至目前,数据是一维数组。他认为在扁平化层之后和密集层之前添加它应该是可能的,但是我们都还没有足够的知识。

model = Sequential()
for i, feat in enumerate(args.conv_f):
    if i==0:
        model.add(Conv2D(feat, input_shape=x[0].shape, kernel_size=3, padding = 'same',use_bias=False))
    else:
        model.add(Conv2D(feat, kernel_size=3, padding = 'same',use_bias=False))
        model.add(BatchNormalization())
        model.add(LeakyReLU(alpha=args.conv_act))
        model.add(Conv2D(feat, kernel_size=3, padding = 'same',use_bias=False))
        model.add(BatchNormalization())
        model.add(LeakyReLU(alpha=args.conv_act))
        model.add(Dropout(args.conv_do[i]))

model.add(Flatten())

#Input code here

denseArgs = {'use_bias':False}
for i,feat in enumerate(args.dense_f):
    model.add(Dense(feat,**denseArgs))
    model.add(BatchNormalization())
    model.add(LeakyReLU(alpha=args.dense_act))
    model.add(Dropout(args.dense_do[i]))
model.add(Dense(1))

显然,我们可能是错的,所以任何帮助表示赞赏!谢谢!

标签: pythontensorflowkerasdeep-learningconv-neural-network

解决方案


我知道的一种方法需要使用 keras 的功能 API。这意味着您将不得不放弃您当前使用的顺序方法。

以玩具模型为例,让集团:

img_input = Input((64, 64, 1))
model = Conv2D(20, (5, 5))(img_input)
model = MaxPooling2D((2, 2))(model)

model = Flatten()(model)

是具有最终展平的 CNN 的卷积层。可以通过将最后一个模型层与新信息连接来添加信息。新信息可以通过创建一个只有输入层的短模型(此处为 af_input)来打包。

举个例子:

af_input = Input(shape=(2,))

model = Concatenate()([model, af_input])

model = Dense(120, activation='relu')(model)
model = Dropout(0.1)(model)
model = Dense(100, activation='relu')(model)

predictions = Dense(2)(model)

fullmodel = Model(inputs=[img_input,af_input], outputs=predictions)

所以现在 CNN 的 flatten 层的结果将与一个额外信息的向量(这里是 2 个特征)连接起来。

然后,您可以像往常一样继续向网络添加层。

我建议您查看stackoverflow链接: 如何在keras中连接两层?

另一个例子和一个很好的解释。


推荐阅读