tensorflow - 为什么我的 IoU 在使用 tensorflow / keras 的训练中不断减少?
问题描述
我正在为语义分割训练一个类似于 U-net 的模型,但 IoU 在一个时期之后不断减少时期。这是我的 IoU 和 IoU 损失函数。我的输入和输出掩码是一个 numpy 数组,dtype=np.bool
因此我将其转换为 float32 以计算 IoU。我不知道是什么问题?我的指标函数或我的模型。我真的需要有人帮助我。
def iou(y_true, y_pred):
y_true = tf.keras.backend.flatten(y_true)
y_pred = tf.keras.backend.flatten(y_pred)
y_true_f = tf.cast(y_true, tf.float32)
y_pred_f = tf.cast(y_pred, tf.float32)
intersection = tf.keras.backend.sum(y_true_f * y_pred_f)
union = tf.keras.backend.sum(y_true_f) + tf.keras.backend.sum(y_pred_f) - intersection
return (intersection + 1e-7) / (union + 1e-7)
def iou_loss(y_true, y_pred):
return 1.0 - iou(y_true, y_pred)
# Compile model
metrics = [iou_loss, iou, 'accuracy']
model.compile(optimizer=Adam(learning_rate), loss=iou, metrics=[metrics], run_eagerly=True)
这是我的训练结果
Epoch 2/100
34/34 [==============================] - 3s 89ms/step - loss: 0.0186 - iou_loss: 0.9814 - iou: 0.0186 - accuracy: 0.9022 - val_loss: 0.0358 - val_iou_loss: 0.9647 - val_iou: 0.0353 - val_accuracy: 0.9460
Epoch 00002: val_loss improved from 0.03619 to 0.03579, saving model to /content/gdrive/MyDrive/model_ccnet_iris.h5
Epoch 3/100
34/34 [==============================] - 3s 89ms/step - loss: 0.0158 - iou_loss: 0.9843 - iou: 0.0157 - accuracy: 0.8972 - val_loss: 0.0352 - val_iou_loss: 0.9652 - val_iou: 0.0348 - val_accuracy: 0.9071
Epoch 00003: val_loss improved from 0.03579 to 0.03525, saving model to /content/gdrive/MyDrive/model_ccnet_iris.h5
Epoch 4/100
34/34 [==============================] - 3s 88ms/step - loss: 0.0132 - iou_loss: 0.9868 - iou: 0.0132 - accuracy: 0.8910 - val_loss: 0.0348 - val_iou_loss: 0.9656 - val_iou: 0.0344 - val_accuracy: 0.8690
Epoch 00004: val_loss improved from 0.03525 to 0.03485, saving model to /content/gdrive/MyDrive/model_ccnet_iris.h5
Epoch 5/100
34/34 [==============================] - 3s 87ms/step - loss: 0.0112 - iou_loss: 0.9888 - iou: 0.0112 - accuracy: 0.8842 - val_loss: 0.0345 - val_iou_loss: 0.9659 - val_iou: 0.0341 - val_accuracy: 0.8411
Epoch 00005: val_loss improved from 0.03485 to 0.03455, saving model to /content/gdrive/MyDrive/model_ccnet_iris.h5
Epoch 6/100
34/34 [==============================] - 3s 85ms/step - loss: 0.0096 - iou_loss: 0.9904 - iou: 0.0096 - accuracy: 0.8740 - val_loss: 0.0343 - val_iou_loss: 0.9662 - val_iou: 0.0338 - val_accuracy: 0.8216
解决方案
优化器的功能是最小化
您设置IoU
为损失函数的损失函数,这就是它减少的原因。
推荐阅读
- javascript - 如何删除位于圆圈边界之外的标记?
- tfs - TFS 无法识别导入的数据库
- spring - 在 Twitter 克隆应用程序中关注用户的 Spring Rest Api 设计?
- typescript - 为什么 TypeScript 有一个结构化的类型系统?
- java - 如何在 e clipse 中配置生成的 Sources
- algorithm - 如何识别一些二叉搜索树的遍历属于后序还是中序?
- mixed-models - MCMCglmm 问题:多物种和超测量树
- html - 在 AutoCAD 中嵌入 html
- javascript - 在猫鼬中使用重命名集合
- python - 如何使用 SpaCy 和 NLTK 进行自定义 NER 标记?