我想在keras中定义一个自定义损失函数,该函数接受其他参数作为cor_weight_tensor。但是由于cor_weight_tensor的长度等于训练集中的数据点数量,该数量远大于批处理大小。我出错了。有人可以让我知道吗,如何在每次迭代中使用长度与批处理大小相同的cor_weight_tensor。下面给出了我的代码,并显示错误消息。
from keras.models import Sequential
from keras.layers import Dense
from keras import backend
###############
##custom function to calculate loss
def custom_loss(wt):
def loss(y_true,y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred - y_true), axis=-1))*wt
# Return a function
return loss
###############
###############
def rmse(y_true, y_pred):
return backend.sqrt(backend.mean(backend.square(y_pred - y_true), axis=-1))
classifier = Sequential()
classifier.add(Dense(output_dim = 128,init ='uniform',activation = 'relu',input_dim=19))
classifier.add(Dense(output_dim =128,init ='uniform',activation = 'relu'))
classifier.add(Dense(output_dim =64,init ='uniform',activation = 'relu'))
classifier.add(Dense(output_dim =64,init ='uniform',activation = 'relu'))
classifier.add(Dense(output_dim = 1 ,init ='uniform',activation = 'relu'))
classifier.compile(optimizer = 'adam' , loss = custom_loss(cor_weight_tensor), metrics = [rmse])
H = classifier.fit(X_train,Y_train,batch_size = 64 ,epochs=10, validation_split=0.2)
我的样本输入训练功能(X_train)集如下所示(6个示例数据点)。现在让我们说数据实例1-2来自一个来源,3-4来自第二个来源,5-6来自第三来源。因此,我想根据其来源为他们分配权重。因此,我创建了一个长度为6的权重向量。创建权重向量的原因是在计算来自不同来源的样本的损失时要赋予更大的权重。
cor_weight_tensor = [1,1,0.75,0.75,0.66,0.66]
X_train
1 0.23,6.69871783,3.09982644
2 0.88,5.90097192,3.09413889
3 0.93,5.22863582,3.00215503
4 0.47,4.99313908,2.89293094
5 0.39,4.81252967,2.70707414
6 0.77,4.79805324,2.59780939
示例输出功能变量为
Y_train
0.45
0.95
0.99
0.77
0.65
0.89
我得到的错误消息很有意义,但是我该如何解决该错误。
InvalidArgumentError (see above for traceback): Incompatible shapes: [64] vs. [308025]
[[Node: loss/dense_5_loss/mul = Mul[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:GPU:0"](metrics/rmse/Sqrt, loss/dense_5_loss/mul/y)]]
[[Node: metrics/rmse/Mean_1/_121 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/device:CPU:0", send_device="/job:localhost/replica:0/task:0/device:GPU:0", send_device_incarnation=1, tensor_name="edge_662_metrics/rmse/Mean_1", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"]()]]
答案 0 :(得分:0)
由于您既未显示cor_weight_tensor的定义方式,也未显示其含义,因此很难提供准确的答案。
无论如何,要调整该张量的形状,您可以通过将其简化为单个标量来计算其均值(如果张量具有训练数据长度,那么我可能认为它是数据集中的某种统计量)。以某种方式将其更改为批量大小(取决于其定义方式)。
无论哪种方式,如果该值来自数据集,您都可以将其视为模型的新输入。出于这个原因,我建议使用Keras Functional API,该API可让您轻松指定多个输入,以便在将其传递给损失函数之前,可以使其适应张量的批量大小。