【问题标题】:Make a custom loss function for mean intersection of union for regression in bounding boxes为边界框中回归的平均交集制作自定义损失函数
【发布时间】:2019-02-23 21:29:09
【问题描述】:

我正在尝试逐个迭代批次以计算联合的平均交集。但是拟合函数显示了这个

错误:一个操作有None 用于梯度。请确保您的所有操作都定义了渐变(即可微分)。无梯度的常用操作:K.argmax、K.round、K.eval。

帮助,因为我是 keras 新手

#y_true shape: (None, 4)
import keras.backend as K
def iou(y_true, y_pred):
    # determine the (x, y)-coordinates of the intersection rectangle
    iou = 0
    for i in range(K.int_shape(y_pred)[0]):
        boxA = y_pred[i]
        boxB = y_true[i]
        xA = K.max(boxA[0], boxB[0])
        yA = K.max(boxA[2], boxB[2])
        xB = K.min(boxA[1], boxB[1])
        yB = K.min(boxA[3], boxB[3])

        interArea = K.max(0, xB - xA + 1) * K.max(0, yB - yA + 1)

        boxAArea = (boxA[1] - boxA[0] + 1) * (boxA[3] - boxA[2] + 1)
        boxBArea = (boxB[1] - boxB[0] + 1) * (boxB[3] - boxB[2] + 1)

        iou += interArea / float(boxAArea + boxBArea - interArea)
    #MEAN
    mean = iou/K.int_shape(y_pred)[0]
    return 1-mean

model.compile(optimizer='adam', loss=iou, metrics=['accuracy'])
model.fit(x_train, y_train, epochs=20, batch_size = 50)

我的模型在将均方误差作为损失函数时效果很好。型号:

input_shape = (180, 240, 3)
model = Sequential([
    Conv2D(32, (3, 3), input_shape=input_shape, padding='same',activation='relu'),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    BatchNormalization(),

    Conv2D(64, (3, 3), activation='relu', padding='same'),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    BatchNormalization(),

    Conv2D(128, (3, 3), activation='relu', padding='same',),

    Conv2D(256, (3, 3), activation='relu', padding='same',),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),

    Conv2D(128, (3, 3), activation='relu', padding='same',),
    MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    BatchNormalization(),
    Flatten(),
    Dense(4096, activation='relu'),
    Dense(4096, activation='relu'),
    Dense(4, activation='relu')
])

【问题讨论】:

  • 你的model定义在哪里,loss=iou是什么(在Keras中不存在),你定义的函数到底在哪里使用?
  • 哎呀!那是一个错字函数名称是 iou。已编辑

标签: python-3.x tensorflow machine-learning keras conv-neural-network


【解决方案1】:

这意味着自定义损失函数中的所有操作都应该是可微的,否则无法执行优化过程。为此,您只需逐个检查代码中哪个操作是罪魁祸首,并将其替换为 Keras 可微后端类似物或寻找其他替代方案。

考虑到提供的代码 sn-p,可能有几个可能的建议可以使它工作:

  • for-loop 应该向量化
  • 由于您使用 max(0, ...) 来获取相交区域,因此可能会发生它为常数 0 并且没有可用的梯度,因此请检查它是否没有卡在那里
  • 对于均值计算,有一个现成的 Keras 后端函数 K.mean
  • 最好限制值以改进优化(例如,限制在 (0,1) 范围内)

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 2019-11-28
    • 1970-01-01
    • 2019-04-12
    • 2018-04-03
    • 2018-02-08
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    相关资源
    最近更新 更多