请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

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

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回答

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

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 BloodHound_swh #1
    谢谢, 我也发现了只有改成tf.constant才能正常运行。这和我之前用1.3的版本不同,1.3就是用tf.Variable。
    回复 有任何疑惑可以回复我~ 2019-06-21 14:11:05
正十七 2019-06-16 21:13:45

同学你好,

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 BloodHound_swh #1
    好的。为了方便起见,这里就用3*3的矩阵了。在最后一步fit的时候,就出错了。完整的代码,我添加到问题描述里面了,谢谢。
    回复 有任何疑惑可以回复我~ 2019-06-16 21:21:17
  • 提问者 BloodHound_swh #2
    类似的逻辑,在tf1.3版本是可以完成的,但是2.0就出现了Index out of range using input dim 2; input has only 2 dims [Op:StridedSlice] name: strided_slice/ 的问题。
    回复 有任何疑惑可以回复我~ 2019-06-16 22:08:45
  • 提问者 BloodHound_swh #3
    请问,是不是因为还需要对矩阵进行一些操作,才可以用来训练呢?
    回复 有任何疑惑可以回复我~ 2019-06-16 22:58:11
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信