请问自定义损失函数的输入如果是多维的应该怎么写呢?

来源:3-5 实战自定义损失函数与DenseLayer回顾

BloodHound_swh

2019-06-16

def myloss(matrix_true, matrix_pre):
    loss = tf.reduce_sum(matrix_true - matrix_pre)
    return loss

例如上面这一段,matrix_true和matrix_true都是[100, 3]的矩阵,但是在model.fit的时候

history = model.fit(x_train, y_train, epochs=30)

报错

InvalidArgumentError: Index out of range using input dim 2; input has only 2 dims [Op:StridedSlice] name: strided_slice/

另外,自定义损失函数里面的参数顺序是怎样的呢?

为了方便起见,将矩阵改成3*3的,下面是完整的代码

import tensorflow as tf
import numpy as np
from tensorflow import keras
import copy

print(tf.__version__)

x = tf.Variable([[3., 0., 5.], [0., 5., 4.], [3., 3., 0.]])
y = tf.Variable([[3., 0., 6.], [0., 4., 4.], [3., 2., 0.]])


def myloss(matrix_true, matrix_pre):
    loss = tf.reduce_sum(matrix_true - matrix_pre)
    return loss

model = keras.models.Sequential([
    keras.layers.Dense(3, activation='relu', input_shape=x.shape[1:]),
    keras.layers.Dense(3, activation='relu'),
    keras.layers.Dense(3, activation='relu'),
])

op = keras.optimizers.SGD(0.01)

model.summary()
model.compile(loss=myloss, optimizer=op)

history = model.fit(x, y, epochs=10)


不知道是不是我定义的变量的问题,即便是改成预测值是一维的,也无法成功运行

#%%
import tensorflow as tf
import numpy as np
from tensorflow import keras

print(tf.__version__)


#%%
x = tf.Variable([[3., 0., 5.], [0., 5., 4.], [3., 3., 0.]])
# y = tf.Variable([[3., 0., 6.], [0., 4., 4.], [3., 2., 0.]])
z = tf.Variable([[2.], [3.], [4.]])


def myloss(y_true, y_pred):
    loss = tf.reduce_sum(y_true - y_pred)
    return loss

model = keras.models.Sequential([
    keras.layers.Dense(3, activation='relu', input_shape=x.shape[1:]),
    keras.layers.Dense(3, activation='relu'),
    keras.layers.Dense(1),
])

op = keras.optimizers.SGD(0.01)

model.summary()
model.compile(loss=myloss, optimizer=op)

#%%
history = model.fit(x, z, epochs=10)
写回答

2回答

qq_白玉_1

2019-06-21

可以把训练数据类型改成tf.constant,应该可以正确运行。

事实上我认为这个tf.variable用来定义参数比较适合,可以在训练中不断改变。

但为什么用其作为输入数据会导致训练失败我也不清楚。

0
1
BloodHound_swh
谢谢, 我也发现了只有改成tf.constant才能正常运行。这和我之前用1.3的版本不同,1.3就是用tf.Variable。
2019-06-21
共1条回复

正十七

2019-06-16

同学你好,

自定义损失函数的参数顺序是ground truth在前,prediction在后,可以参考https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/losses/Loss

关于Index的问题,我理解你这里的[100, 3]矩阵里面全是要预测的值,而在实际运行中,还要加上batch_size维度,所以就变成了三维。但是我并没有在文档中看到要限制自定义loss的参数的维度。所以可能是其他问题,要不你把完整的程序贴一下?

0
3
BloodHound_swh
请问,是不是因为还需要对矩阵进行一些操作,才可以用来训练呢?
2019-06-16
共3条回复

Google老师亲授 TensorFlow2.0 入门到进阶

Tensorflow2.0实战—以实战促理论的方式学习深度学习

1849 学习 · 896 问题

查看课程