Tensorflow 在Keras中添加偏置输出

Tensorflow 在Keras中添加偏置输出,tensorflow,keras,conv-neural-network,Tensorflow,Keras,Conv Neural Network,我正在解决一个多类图像分类问题。直接训练CNN并没有给这个任务带来好的效果,所以我现在正在尝试一种变通方法。其思想是训练多个二值分类网络,每个图像类一个,然后合并它们的输出。合并模型的输出层应该是N+1个元素的向量,其中N是图像类的数量。输出向量的argmax是分类结果(图像类)。输出向量的第一个元素是偏差项,仅当图像不符合高概率的类别时,该项才被激活。该元素将在输出向量中具有一个常量(偏差)值,该值将用作分类置信阈值 我设法通过向网络添加另一个输入来做我想做的事情;该输入被初始化为一个常数值,

我正在解决一个多类图像分类问题。直接训练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}))

您只需在模型定义中创建一个常量值:

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)>
>模型(数据)

我假设
密集(1,activation=“softmax”)
只是一种简化。在1类上应用softmax没有意义。@Lescurel是正确的。也许你应该
activation='sigmoid'
,这样它会在
(0,1)
@Lescurel中输出一个值。谢谢,这是多类网络的遗留问题,我现在更改了它。