keras - 处理分割任务时,keras 中的度量“准确性”会抛出错误“不兼容的形状”
问题描述
我使用 Keras 来处理分割任务。
地面实况图是二值图像,注意黑色代表背景,白色代表物体。
所以我在 Keras 中使用数据生成器如下,在此之前我将值 0 设置为背景像素,将值 1 设置为对象:
train_label_datagen = ImageDataGenerator(
horizontal_flip= True,
)
train_label_generaror = train_label_datagen.flow_from_directory(
directory=os.path.join(FLAGS.dataset_dir, FLAGS.cropped_dir, "training",
FLAGS.labels_folder_name),
target_size=(FLAGS.resize_size, FLAGS.resize_size),
class_mode= None,
color_mode= 'grayscale',
batch_size= FLAGS.batch_size,
seed = FLAGS.seed,
shuffle= False
)
和 model.compile 函数细节是这样的:
sgd = SGD(lr= FLAGS.lr, decay=FLAGS.decay, momentum=FLAGS.momentum,
nesterov=True)
model.compile(optimizer= sgd,
loss = losses.sparse_categorical_crossentropy,
metrics=['acc', miou])
model.output 是一个概率图。
我的问题是:当我训练模型时出现错误
tensorflow.python.framework.errors_impl.InvalidArgumentError: Incompatible shapes: [602112] vs. [12,224,224]
[[Node: metrics/acc/Equal = Equal[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/acc/Reshape, metrics/acc/Cast)]]
[[Node: metrics/miou/confusion_matrix/assert_non_negative_1/assert_less_equal/Assert/AssertGuard/Assert/Switch_1/_167 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_544_m...t/Switch_1", tensor_type=DT_INT64, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
我尝试将损失更改为“binary_crossentropy”并将 output.activation 更改为“sigmoid”,然后它就可以工作了。
所以我想知道是什么导致了这个错误。
解决方案
通过尝试不同的方法和分析混淆矩阵,我已经解决了这个问题。
代码如下:
import keras.backend as K
from tensorflow.contrib.metrics import confusion_matrix
def custom_accuracy(y_true, y_pred, nb_classes):
class_labels= K.reshape(y_true, shape=[-1])
class_pred = K.resshape(y_pred, axis= -1)
class_pred = K.reshape(class_pred, shape=[-1])
confusion_matrix = confusion_matrix(labels= class_labels,
prediction= class_pred,
num_classes= nb_classes)
TP = 0
all = 0
for class_index in range(0, nb_classes):
TP += confusion_matrix[class_index, class_index]
all += confusion_matrix[class_index]
return K.sum(TP) / K.sum(all)
通过定制的准确度指标,它可以工作。
推荐阅读
- r - 如何覆盖 Shinywidget 包中的 actionbttn 颜色?
- c# - 如何为解决方案中的每个项目创建单独的 nuget 包,并将项目引用转换为 nuget 依赖项?
- winforms - 重启应用程序后 kryptonDockingManager 保存文件和加载文件不起作用
- c# - 重命名 Azure 容器时出现 System.InvalidCastException
- batch-file - 在 Windows 中将命令作为函数参数传递
- vb.net - 如何修复从“ListViewItem”类型到“Integer”类型的转换无效。错误?
- doctrine-orm - 如何在学说查询中使用 CASE 和 SUBSTRING_INDEX?
- reactjs - 从 react.js 的下拉列表中获取初始值
- kubernetes - pod 是否通过服务来处理出站流量?
- u-boot - 未知命令 'boota' 尝试 'help' - 引导 u-boot 映像时出错