我正在尝试使代码以我发现的custom_loss运行
但是我遇到了一些形状不兼容的错误。
InvalidArgumentError:不兼容的形状:[0,1]与[19,1] [[{{node loss_65 / dense_165_loss / custom_loss / GreaterEqual}}]]
显然,输入大小必须被batch_size整除。有人知道如何解决这个问题吗?
import tensorflow as tf
import keras.backend as K
from keras import models
from keras.layers import Dense
import numpy as np
def custom_loss(y_true, y_pred):
y_true_next = y_true[1:]
y_pred_next = y_pred[1:]
y_true_tdy = y_true[:-1]
y_pred_tdy = y_pred[:-1]
y_true_diff = tf.subtract(y_true_next, y_true_tdy)
y_pred_diff = tf.subtract(y_pred_next, y_pred_tdy)
standard = tf.zeros_like(y_pred_diff)
y_true_move = tf.greater_equal(y_true_diff, standard)
y_pred_move = tf.greater_equal(y_pred_diff, standard)
y_true_move = tf.reshape(y_true_move, [-1])
y_pred_move = tf.reshape(y_pred_move, [-1])
condition = tf.not_equal(y_true_move, y_pred_move)
indices = tf.where(condition)
ones = tf.ones_like(indices)
indices = tf.add(indices, ones)
indices = K.cast(indices, dtype='int32')
direction_loss = tf.Variable(tf.ones_like(y_pred), dtype='float32')
updates = K.cast(tf.ones_like(indices), dtype='float32')
alpha = 1000
direction_loss = tf.scatter_nd_update(direction_loss, indices, alpha*updates)
custom_loss = K.mean(tf.multiply(K.square(y_true - y_pred), direction_loss), axis=-1)
return custom_loss
def mpl(train_x, train_y, batch_size):
model = models.Sequential()
model.add(Dense(40, batch_input_shape=(batch_size, train_x.shape[1]), activation = "relu"))
model.add(Dense(1))
model.summary()
model.compile(
optimizer = 'adam',
loss = custom_loss
)
results = model.fit(
train_x, train_y,
epochs= 5,
batch_size = batch_size,
verbose = 1
)
return results
BATCH_SIZE = 20
# works with BATCH_SIZE = 10|20.. dont work with 15|30...
# train_x = np.random.random_sample((500, 10))
# train_y = np.random.random_sample((500, 1))
# works only with BATCH_SIZE = 1
train_x = np.random.random_sample((841, 10))
train_y = np.random.random_sample((841, 1))
result = mpl(train_x, train_y, BATCH_SIZE)