InvalidArgumentError: unique expects a 1D vector
InvalidArgumentError: unique expects a 1D vector
我正在尝试创建一个自定义损失函数以用于神经网络算法。
我的损失函数:
import keras.backend as kb
import tensorflow as tf
def sign_penalty(y_true, y_pred):
penalty=0.5
loss=tf.where(tf.less(y_pred/y_true, 1),
penalty*(1-tf.dtypes.cast((((tf.unique_with_counts(y_pred >= y_true)[2])/(kb.sum(tf.unique_with_counts(y_pred >= y_true)[2])))[0]),tf.float32))+kb.sum((y_true - y_pred)**2/y_true),
kb.square(kb.sum((y_true - y_pred)**2/y_true)))
return(loss)
使用的机型:
model_mlp = Sequential()
model_mlp.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
model_mlp.add(Dense(1))
model_mlp.compile(loss=sign_penalty, optimizer=adam)
model_mlp.summary()
当我拟合模型时:
mlp_history = model_mlp.fit(X_train.values, Y_train, validation_data=(X_valid.values, Y_valid), epochs=epochs, verbose=2)
我收到以下错误:
InvalidArgumentError: unique expects a 1D vector. [[node
sign_penalty/UniqueWithCounts (defined at
:3) ]]
[Op:__inference_train_function_773] Function call stack:
train_function
我认为错误来自惩罚,但我不知道为什么。
您正在将 3D 矢量传递给 unique_with_counts
。只能传递1D。
试试这个简单的方法来计算百分比:
def sign_penalty(y_true, y_pred):
penalty=0.5
a = tf.cast((y_pred >= y_true)[2], tf.float32)
s = kb.sum(a)
percentage = a / s
loss=tf.where(tf.less(y_pred/y_true, 1),
penalty*(1-percentage)+kb.sum((y_true - y_pred)**2/y_true),
kb.square(kb.sum((y_true - y_pred)**2/y_true)))
return(loss)
为了解决这个问题,我打印了y_true和y_pred:
tf.print(y_true)
tf.print(y_pred)
结果显示他们是在 one-hot 代表中。
当我将它们从单热表示中逆转时,事情开始对我有用:
y_true_c = tf.argmax(y_true, axis=1)
y_pred_c = tf.argmax(y_pred, axis=1)
我正在尝试创建一个自定义损失函数以用于神经网络算法。 我的损失函数:
import keras.backend as kb
import tensorflow as tf
def sign_penalty(y_true, y_pred):
penalty=0.5
loss=tf.where(tf.less(y_pred/y_true, 1),
penalty*(1-tf.dtypes.cast((((tf.unique_with_counts(y_pred >= y_true)[2])/(kb.sum(tf.unique_with_counts(y_pred >= y_true)[2])))[0]),tf.float32))+kb.sum((y_true - y_pred)**2/y_true),
kb.square(kb.sum((y_true - y_pred)**2/y_true)))
return(loss)
使用的机型:
model_mlp = Sequential()
model_mlp.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
model_mlp.add(Dense(1))
model_mlp.compile(loss=sign_penalty, optimizer=adam)
model_mlp.summary()
当我拟合模型时:
mlp_history = model_mlp.fit(X_train.values, Y_train, validation_data=(X_valid.values, Y_valid), epochs=epochs, verbose=2)
我收到以下错误:
InvalidArgumentError: unique expects a 1D vector. [[node sign_penalty/UniqueWithCounts (defined at :3) ]] [Op:__inference_train_function_773] Function call stack: train_function
我认为错误来自惩罚,但我不知道为什么。
您正在将 3D 矢量传递给 unique_with_counts
。只能传递1D。
试试这个简单的方法来计算百分比:
def sign_penalty(y_true, y_pred):
penalty=0.5
a = tf.cast((y_pred >= y_true)[2], tf.float32)
s = kb.sum(a)
percentage = a / s
loss=tf.where(tf.less(y_pred/y_true, 1),
penalty*(1-percentage)+kb.sum((y_true - y_pred)**2/y_true),
kb.square(kb.sum((y_true - y_pred)**2/y_true)))
return(loss)
为了解决这个问题,我打印了y_true和y_pred:
tf.print(y_true)
tf.print(y_pred)
结果显示他们是在 one-hot 代表中。 当我将它们从单热表示中逆转时,事情开始对我有用:
y_true_c = tf.argmax(y_true, axis=1)
y_pred_c = tf.argmax(y_pred, axis=1)