keras 如果我的模型在最后一层使用sigmoid和binary_crossentropy进行训练,我可以输出类的概率而不是0/1吗?

5kgi1eie  于 6个月前  发布在  其他
关注(0)|答案(1)|浏览(42)

我已经使用sigmoid函数训练了一个CNN模型,最后是密集层:

model.add(layers.Dense(1, activation='sigmoid'))

字符串
我还使用二进制交叉熵进行了编译:

model.compile(loss='binary_crossentropy',
              optimizer = 'Adam',
              metrics=[tf.keras.metrics.Precision(),tf.keras.metrics.Recall(),'accuracy'])


二值图像分类的f1分数很低,我的模型预测一个类优于另一个类。所以我决定在最后一层添加一个基于sigmoid函数输出概率的阈值:

c = load_img('/home/kenan/Desktop/COV19D/validation/covid/ct_scan_19/120.jpg', 
             color_mode='grayscale',
             target_size = (512,512))
c=img_to_array(c)
c= np.expand_dims(c, axis=0)
pred = model.predict_proba(c)
pred
y_classes = ((model.predict(c)> 0.99)+0).ravel() 
y_classes


我想在我的代码中使用'pred'作为类的概率,但它总是0或1,如下所示:

Out[113]: array([[1.]], dtype=float32)


为什么给予的不是1而是[0,1]的概率呢?有没有办法得到我的情况下的类概率,而不是0或1?

ffx8fchx

ffx8fchx1#

不,你不能。在最后一层激活Sigmoid将输出0到1范围内的一个值。如果你想获得不同标签的类概率,你必须将最后一层激活更改为softmax。

相关问题