【发布时间】:2021-05-19 16:51:43
【问题描述】:
我正在解决一个多类图像分类问题。直接训练 CNN 并没有为这项任务带来好的结果,所以我现在正在尝试一种解决方法。这个想法是训练多个二元分类网络,每个图像类一个,然后合并它们的输出。合并模型的输出层应该是 N+1 个元素的向量,其中 N 是图像类的数量。输出向量的argmax就是分类结果(图像类)。输出向量的第一个元素是一个偏置项,仅当图像不适合任何具有高概率的类时才被激活。该元素将在输出向量中具有一个常数(偏差)值,该值将用作分类置信度阈值。
我设法通过向网络添加另一个输入来做我想做的事;该输入被初始化为一个常数值并用作偏差。通过以某种方式将常量值嵌入网络本身,是否可以在不改变网络输入形状的情况下实现我想要的?
这是我目前的代码:
inputs = Input(shape=(240, 320), name="img_input")
x = tf.keras.layers.Flatten()(inputs)
outputs1 = Dense(1, activation='sigmoid')(x)
outputs2 = Dense(1, activation='sigmoid')(x)
bias = Input(shape=(1,), name="bias_input")
merged = Concatenate()([bias, outputs1, outputs2])
model = Model(inputs=[inputs, bias], outputs=merged)
print(model.summary())
plot_model(model, to_file='network.png', show_shapes=True)
测试模型:
data = np.ones(320 * 240).reshape((1, 240, 320))
bias = (np.ones(1) / 2.0).reshape((1, 1)) # use 1.0/2 as the bias value
# prints [[0.5 1. 1. ]] as expected
print(model.predict({"img_input": data, "bias_input": bias}))
【问题讨论】:
-
我认为
Dense(1,activation="softmax")只是一个简化。对 1 个类应用 softmax 没有意义。 -
@Lescure 是正确的。可能你应该
activation='sigmoid'以便它在( 0 , 1 )中输出一个值 -
@Lescurel 谢谢,那是多类网络的遗留物,我现在改了。
标签: tensorflow keras conv-neural-network