Ошибка передачи тензора / вектора в пользовательскую функцию потерь в кератах - PullRequest
0 голосов
/ 22 мая 2019

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

1 Ответ

0 голосов
/ 23 мая 2019

Поскольку вы не показываете ни то, как определяется этот cor_weight_tensor, ни его значение, трудно дать точный ответ.

В любом случае, для адаптации формы этого тензора вы можете либо вычислить его среднее значение (еслитензор имеет длину обучающих данных, тогда я могу предположить, что это какая-то статистика по набору данных), уменьшив ее до единого скаляра или каким-то образом адаптировать ее к размеру пакета (в зависимости от того, как он определен).

В любом случае, если это значение исходит из набора данных, вы можете увидеть его как новый вход для вашей модели.По этой причине я бы предложил использовать функциональный API-интерфейс Keras, который позволяет вам легко указывать несколько входов, чтобы вы могли адаптировать его к размеру пакета в вашем тензорном элементе, прежде чем передавать его в функцию потерь.

...