python - 尝试将 auc-roc 分数添加到 CNN 训练中
问题描述
我目前的 CNN 具有相对较高的准确度,但 auc 得分较低,因此我想同时考虑准确度和 auc 来训练我的模型。但是,当我尝试添加“auc”作为训练的第二个指标时,我无法开始我的时代。
这是我收到的错误消息:
FailedPreconditionError:从容器读取资源变量 conv2d_4/kernel 时出错:localhost。这可能意味着该变量未初始化。未找到:资源 localhost/conv2d_4/kernel/N10tensorflow3VarE 不存在。[[{{node conv2d_4/Conv2D/ReadVariableOp}}]]
我已经尝试过之前讨论中提供的功能 auc 。抱歉,我现在找不到帖子。
from keras import backend as K
def auc(y_true, y_pred):
auc = tf.metrics.auc(y_true, y_pred)[1]
K.get_session().run(tf.local_variables_initializer())
return auc
auc_model = models.Sequential()
auc_model.add(layers.Conv1D (kernel_size = (200), filters = 10, input_shape=(1644,1) , activation='relu'))
auc_model.add(layers.MaxPooling1D(pool_size = (50), strides=(10)))
auc_model.add(layers.Reshape((40, 35, 1)))
auc_model.add(layers.Conv2D(16, (3, 3), activation='relu'))
auc_model.add(layers.Conv2D(16, (3, 3), activation='relu'))
auc_model.add(layers.MaxPooling2D((2, 2)))
auc_model.add(layers.Flatten())
auc_model.add(layers.Dense(32, activation='relu', kernel_regularizer=keras.regularizers.l2(0.001)))
auc_model.add(layers.Dropout(rate=0.2))
auc_model.add(layers.Dense(1, activation='sigmoid'))
auc_model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy', auc])
auc_model.summary()
from tensorflow.keras.callbacks import EarlyStopping
target = y_tr.columns[0]
rows_tr = np.isfinite(y_tr[target]).values
rows_te = np.isfinite(y_te[target]).values
x_train = x_tr[rows_tr].reshape((x_tr[rows_tr].shape[0], 1644, 1))
x_test = x_te[rows_te].reshape((x_te[rows_te].shape[0], 1644, 1))
auc_model.fit( x_train, y_tr[target][rows_tr],
validation_data=(x_test, y_te[target][rows_te]), epochs = 5)
print('\n# Evaluate on test data')
results = auc_model.evaluate(x_test, y_te[target][rows_te], batch_size = 8, verbose=1)
I want to start my training process considering both accuracy and auc score. Thanks.
解决方案
指标仅用于报告您在每个时期训练的模型的评估。它不会改变你的训练。
如果你想让你的模型也考虑 AUC,你应该修改你的损失。最大限度地减少binary_crossentropy的损失,自然地,在不考虑 AUC 的情况下最大限度地提高准确性。当您拥有不平衡的数据集(例如一个倾斜的类)时,这会使问题变得更加严重。
如果您真的只希望它用于度量,您可以看到这篇文章: 如何在 keras 中计算接收操作特征 (ROC) 和 AUC?
但是如果你真的想让你的模型最大化 AUC,你应该在 Keras 上写一个自定义的损失函数,并把它放在你的模型的损失中。这里有一个很好的讨论: https ://www.kaggle.com/c/invasive-species-monitoring/discussion/32762
推荐阅读
- node.js - 使用另一层的 AWS Lambda 层
- python - 如何对 Pandas 数据框进行分组并显示 HTML 表格
- node.js - 使用 2 个不同的套接字将 2 个完全不同的客户端连接到同一服务器
- sql - 如何在给定特定条件的情况下将两个表合并在一起 - Oracle SQL
- javascript - 在 React Redux 中,每个提供者/组件子树可以像 Context API 那样拥有多个存储吗?
- flutter - 在 Flutter 中对齐文本
- android - 我的 react-native 应用程序无法识别 react-native-image-crop-picker
- awk - 在第一列和第二列之间添加一个新列,其值为从 1 到 5 的数字,根据需要重复以达到总行号
- netbeans-12 - 我的 apache NetBeans 不工作。它仅在启动时才加载模块它变为空白
- java - Spring Boot 适用于其他本地计算机,但不适用于我的 IntelliJ,Bean Factory 无法正常工作