【问题标题】:Custom loss function: perform a model.predict on the data in y_pred自定义损失函数:对 y_pred 中的数据执行 model.predict
【发布时间】:2018-06-10 08:37:10
【问题描述】:

我正在训练网络去噪图像,为此我使用 CIFAR10 数据集。我正在尝试生成一个自定义损失函数,以便损失是 mse/classification_accuracy。 鉴于我的网络接收 32x32(噪声)图像作为输入并预测 32x32(去噪)图像,我假设 y_pred 和 Y_true 将是 32x32 图像的数组。因此我的自定义损失函数如下所示:

def custom_loss():
    def joint_optimized_loss(y_true, y_pred):
        mse =  K.mean(K.square(y_pred - y_true), axis=-1)
        preds = classif_model.predict(y_pred)
        correctPreds = 0
        totPreds = 0
        for pred in preds:
            predictedClass = pred.index(max(pred))
            totPreds += 1
            if predictedClass == currentClass: 
                correctPreds += 1
        classifAccuracy = correctPreds / totPreds
        loss = mse / classifAccuracy
        return loss
    return joint_optimized_loss
myModel.compile(optimizer='adadelta', loss=custom_loss())

classif_model 是一个预训练模型,可将 CIFAR10 图像分类为 10 个类别之一。它接收一组 32x32 图像。

但是,当我运行我的代码时,我收到以下错误:

Traceback(最近一次调用最后一次):

文件“myCode.py”,第 94 行,在

myModel.compile(optimizer='adadelta', loss=custom_loss()) 文件“/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py”, 第 850 行,编译中

sample_weight,掩码) 文件“/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py”, 第 450 行,加权

score_array = fn(y_true, y_pred) 文件“myCode.py”,第 57 行,joint_optimized_loss

preds = classif_model.predict(y_pred) 文件“/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/models.py”, 第 913 行,在预测中

return self.model.predict(x, batch_size=batch_size, verbose=verbose) 文件“/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py”, 第 1713 行,在预测中

详细=详细,步骤=步骤) 文件“/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py”, 第 1260 行,在 _predict_loop 中

批次 = _make_batches(num_samples, batch_size) 文件“/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py”, 第 374 行,在 _make_batches 中

num_batches = int(np.ceil(size / float(batch_size)))
AttributeError: 'Dimension' 对象没有属性 'ceil'

我认为这与 y_truey_pred 都是在训练之前为空的张量这一事实有关,因此 classif_model.predict 失败,因为它期待一个数组。但是我不确定如何解决这个问题...

我尝试使用 K.get_value(y_pred) 获取 y_pred 的值,但这给了我以下错误:

tensorflow.python.framework.errors_impl.InvalidArgumentError:形状 [-1,32,32,3] 具有负维度 [[Node: input_1 = Placeholderdtype=DT_FLOAT, shape=[?,32,32,3], _device="/job:localhost/replica:0/task:0/cpu:0"]]

【问题讨论】:

    标签: tensorflow keras metrics loss loss-function


    【解决方案1】:

    您不能将准确率用作损失函数,因为它不可微。这就是为什么要使用交叉熵等准确度上限的原因。

    此外,您实现准确性的方式也是非符号化的,您应该只使用keras.backend 中的函数来实现损失以使其正常工作。

    【讨论】:

      【解决方案2】:

      我遇到了几乎同样的问题,我试过了,它对我有用。

      代替:

      preds = classif_model.predict(y_pred)

      尝试:

      preds = classif_model(y_pred)

      我不确定原因,但这是因为当我们使用 model.predict(y) 时,它需要 batch_size,而在编译时我们没有,所以我们不能使用 model.predict(y)。 如有错误请指正。

      【讨论】:

        猜你喜欢
        • 2019-11-17
        • 2020-09-27
        • 2020-10-12
        • 2016-12-05
        • 2018-04-02
        • 2020-09-21
        • 1970-01-01
        • 2018-09-24
        • 2022-01-08
        相关资源
        最近更新 更多