【问题标题】:Add bias output in Keras在 Keras 中添加偏置输出
【发布时间】: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


【解决方案1】:

您可以在模型定义中简单地创建一个常量值:

bias_value = 0.5
bias = tf.ones((tf.shape(outputs1)[0],1))*bias_value
merged = Concatenate()([bias, outputs1, outputs2]) 

tf.shape(outputs1)[0] 确保bias 的批处理形状与要合并的其他输出兼容。

您还需要更新模型构造,因为偏差输入不再存在。

model = Model(inputs=inputs, outputs=merged)

使用您的样本数据运行模型给出:

>>> model(data)
<tf.Tensor: shape=(1, 3), dtype=float32, numpy=array([[0.5, 1. , 1. ]], dtype=float32)>

【讨论】:

    猜你喜欢
    • 2018-06-20
    • 2017-10-06
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2023-03-07
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多