首页 文章

自定义丢失功能:对y_pred中的数据执行model.predict

提问于
浏览
1

我正在训练网络去噪图像,为此我使用的是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图像 .

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

回溯(最近一次调用最后一次):文件“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,mask)文件”/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行,预测返回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 bat中ches = _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:Shape [-1,32,32,3]具有负维度[[Node:input_1 = Placeholderdtype = DT_FLOAT,shape = [?,32,32,3],_ device =“ /工作:本地主机/副本:0 /任务:0 / CPU:0" ]]

2 回答

  • 1

    我有几乎同样的问题,我试过这个,它对我有用 .

    代替:

    preds = classif_model.predict(y_pred)

    尝试:

    preds = classif_model(y_pred)

    我不确定原因,但是因为当我们使用model.predict(y)时它需要batch_size并且在编译时我们没有任何,所以我们不能使用model.predict(y) . 如果这是错误的请纠正我 .

  • 1

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

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

相关问题