我正在构建使用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
但是这应该在编译之前调用,因此每个部分都不会有不同的损失函数
感谢您的帮助和解答
答案 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文档中的loss
和loss_weights
参数。