连接conv网的两个输出

时间:2018-03-25 11:43:46

标签: python machine-learning neural-network keras conv-neural-network

我正在构建使用CNN进行本地化的图像分类器。

我的CNN将图像作为输入,但是在最后一个CONV图层之后我想将其分成两部分,一部分用于图像分类,另一部分用于图像定位。 不用说,一部分应该使用均方误差,另一部分应该使用二进制binary_crossentropy。我的结构是这样的:

input_image = Input(shape=(IMG_W, IMG_H, 3))

# Layer 1
x = Conv2D(32, (3,3), strides=(1,1), padding='same', name='conv_1', use_bias=False)(input_image)
x = BatchNormalization(name='norm_1')(x)
x = LeakyReLU(alpha=0.1)(x)


# Layer 2
x = Conv2D(64, (3,3), strides=(1,1), padding='same', name='conv_2', use_bias=False)(x)
x = BatchNormalization(name='norm_2')(x)
x = LeakyReLU(alpha=0.1)(x)

现在我想把它分成两个密集(FC)层

   class_layer = x
   class_layer = Dense(256,activation="relu")(class_layer)
   class_layer = Dense(2,activation="softmax")(class_layer)
   model_one = Model(input_image,class_layer)
  model_one.compile(loss="binary_crossentrophy", optimizer=keras.optimizers.Adam(),metrics=['accuracy'])

和图像本地化层

     x = Dense(1024,activation="relu")(x)
     x = Dense(256,activation="relu")(x)
     x = Dense(4,activation="relu")(x)
     model = Model(input_image,x)
model.compile(loss="mean_squared_error", optimizer=keras.optimizers.Adam(),metrics=['accuracy'])

但是我如何连接这些结果,结果向量将是(2 + 4)? 我甚至可以像这样分裂吗?

我知道model.concatenate但是这应该在编译之前调用,因此每个部分都不会有不同的损失函数

感谢您的帮助和解答

1 个答案:

答案 0 :(得分:0)

您可以使用多个输出初始化模型,并为每个输出指定损失。如果你希望你的model_one损失权重为a,而模型的损失为权重b,那么你的总损失看起来像a*mse + b*binary_ce,那么你就会有类似< / p>

model = Model(input_image, [x, class_layer])
model.compile(loss=['mean_squared_error', 'binary_crossentropy'],
              loss_weights=[a, b],
              optimizer=keras.optimizers.Adam())

有关详细信息https://keras.io/models/model/,请参阅Model.compile文档中的lossloss_weights参数。