Я хочу определить пользовательскую функцию потерь в кератах, которая принимает дополнительный аргумент как 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"]()]]