如何使用精度(而不是准确度)在 Keras 中优化 CNN

Posted

技术标签:

【中文标题】如何使用精度(而不是准确度)在 Keras 中优化 CNN【英文标题】:How to optimize a CNN in Keras using precision (instead of accuracy) 【发布时间】:2021-12-04 17:40:16 【问题描述】:

这是我第一次写文章。我通常很快就能找到我想要的东西,但这次我没有运气。

我的问题很简单,我有一个包含 True 和 False 值的目标列。基本上,这是一个二元分类问题。我想知道如何使用 Precision(而不是指标:Accuracy)优化我的 CNN?

顺便说一句,这是行不通的:

model.compile(loss='binary_crossentropy',  optimizer=optm, metrics=['precision'])

这是我的代码:

model = Sequential()
model.add(Dense(64,name = 'Primera', input_dim=8, activation='relu'))
model.add(Dense(32 ,name = 'Segunda'))
model.add(Dense(1,name = 'Tercera', activation='sigmoid'))

from tensorflow.keras import optimizers
optm = optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(loss='binary_crossentropy',  optimizer=optm, metrics=['accuracy'])

model.summary()

history = model.fit(trainX, trainY, 
                    epochs=1000, 
                    batch_size=16, 
                    validation_split=0.1, 
                    verbose=1)

谢谢!

【问题讨论】:

【参考方案1】:

您可以使用tf.keras.metrics.Precision(),示例见下面的代码。

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.metrics import Precision
from sklearn.datasets import make_classification

X, y = make_classification(n_classes=2, n_features=8, n_informative=8, n_redundant=0, random_state=42)

model = Sequential()
model.add(Dense(64, input_dim=8, activation='relu'))
model.add(Dense(32))
model.add(Dense(1, activation='sigmoid'))

model.compile(
    loss='binary_crossentropy',
    optimizer=Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False),
    metrics=[Precision()]
)

model.fit(X, y, epochs=5, batch_size=32, validation_split=0.1, verbose=1)
# Epoch 1/5
# 3/3 [==============================] - 1s 83ms/step - loss: 0.8535 - precision: 0.5116 - val_loss: 0.6936 - val_precision: 0.5714
# Epoch 2/5
# 3/3 [==============================] - 0s 7ms/step - loss: 0.6851 - precision: 0.5200 - val_loss: 0.5975 - val_precision: 0.6667
# Epoch 3/5
# 3/3 [==============================] - 0s 7ms/step - loss: 0.6004 - precision: 0.6545 - val_loss: 0.5370 - val_precision: 0.8000
# Epoch 4/5
# 3/3 [==============================] - 0s 7ms/step - loss: 0.5412 - precision: 0.8250 - val_loss: 0.4878 - val_precision: 0.8000
# Epoch 5/5
# 3/3 [==============================] - 0s 8ms/step - loss: 0.5145 - precision: 0.9394 - val_loss: 0.4462 - val_precision: 0.8000

【讨论】:

以上是关于如何使用精度(而不是准确度)在 Keras 中优化 CNN的主要内容,如果未能解决你的问题,请参考以下文章

keras 中是不是有基于精度或召回而不是损失的优化器?

精度随着时代的增加而降低

Keras GridSearchCV 使用精度以外的指标

Keras - 验证精度与 LSTM 中的自测精度不匹配?

在 Keras 分类神经网络中进行精度交易以获得更好的召回率

Keras CNN 精度要么是静态的,要么对于图像分类来说太高了