我正在训练网络去噪图像,为此我使用的是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) 在joint_optimized_loss
中输入第57行“myCode.py”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行,预测
verbose =详细,步骤=步骤) 文件“/home/rvidalma/anaconda2/envs/tensorUpdated/lib/python2.7/site-packages/keras/engine/training.py”, 第1260行,在_predict_loop
中batches = _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_true
和y_pred
都是张量的事实有关,这些张量在训练之前是空的,因此classif_model.predict
会因为期待数组而失败。但是我不确定如何解决这个问题......
我尝试使用y_pred
获取K.get_value(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”]]
答案 0 :(得分:0)
您不能将精确度用作损失函数,因为它不可微分。这就是为什么使用交叉熵等准确度的上限。
此外,您实现准确性的方式也是非符号的,您应该仅使用keras.backend
中的函数来实现其正常工作的损失。
答案 1 :(得分:0)
我遇到了几乎相同的问题,我尝试了这个,它对我有用。
而不是:
preds = classif_model.predict(y_pred)
尝试:
preds = classif_model(y_pred)
我不确定原因,但是因为当我们使用model.predict(y)时需要batch_size,而编译时我们没有,所以我们不能使用model.predict(y)。 如果这是错误的,请纠正我。