вычислить пользовательские потери в Keras с прогнозируемыми и истинными значениями, отличающимися по форме - PullRequest
1 голос
/ 01 октября 2019

Я пытаюсь построить сеть, которая предсказывает кривую так, чтобы кривая была как можно ближе к группе кривых вместе.

Я определил эту пользовательскую функцию потерь

import keras.backend as K
def custom_loss(production_eval, ypred):
    return K.mean(K.mean(K.abs(production_eval-ypred),axis=1))

Вот сама модель

def BuilModel():

    maxlen = 12
    hidden_dims = 188
    l1_reg=0.002
    l2_reg=0.004
    std=0.005

    print('Build model...')
    main_input = Input(shape=(10*maxlen,1))

    ## split input into 10 (10 raw production curves)
    In = Lambda( lambda x: tf.split(x,num_or_size_splits=10,axis=1))(main_input)

    #Shared GRU
    shared_gru = Bidirectional(GRU(hidden_dims,activation='selu',
                               return_sequences=False,
                               kernel_regularizer=L1L2(l1=l1_reg, l2=l2_reg),
                               input_shape=(maxlen, 1)), name="Bi_GRU")
    x = concatenate([shared_gru(In[i]) for i in range(10)])
    x = Dense(hidden_dims,activation='relu')(x)
    main_output = Dense(12,activation='relu')(x)

    model = Model(inputs=main_input, outputs=main_output)

    model.compile(loss=custom_loss,outputs=main_output, optimizer='adam')   
    return model

Я получил следующую ошибку

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, init
ial_epoch, steps_per_epoch, validation_steps,
validation_freq, max_queue_size, workers, use_multiprocessing,
**kwargs)    1146         else:    1147             fit_inputs = x + y + sample_weights
-> 1148         self._make_train_function()    1149         fit_function = self.train_function    1150 

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in
_make_train_function(self)
    520                     updates=updates,
    521                     name='train_function',
--> 522                     **self._function_kwargs)
    523 
    524     def _make_test_function(self):

TypeError: function() got multiple values for argument 'outputs'

первая ошибка, однако, решена;Я получаю эту ошибку при обучении

/usr/local/lib/python3.6/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
   1176                                         steps_per_epoch=steps_per_epoch,
   1177                                         validation_steps=validation_steps,
-> 1178                                         validation_freq=validation_freq)
   1179 
   1180     def evaluate(self,

/usr/local/lib/python3.6/dist-packages/keras/engine/training_arrays.py in fit_loop(model, fit_function, fit_inputs, out_labels, batch_size, epochs, verbose, callbacks, val_function, val_inputs, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps, validation_freq)
    202                     ins_batch[i] = ins_batch[i].toarray()
    203 
--> 204                 outs = fit_function(ins_batch)
    205                 outs = to_list(outs)
    206                 for l, o in zip(out_labels, outs):

/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in __call__(self, inputs)
   2977                     return self._legacy_call(inputs)
   2978 
-> 2979             return self._call(inputs)
   2980         else:
   2981             if py_any(is_tensor(x) for x in inputs):

/usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py in _call(self, inputs)
   2915                 array_vals.append(
   2916                     np.asarray(value,
-> 2917                                dtype=tf.as_dtype(tensor.dtype).as_numpy_dtype))
   2918         if self.feed_dict:
   2919             for key in sorted(self.feed_dict.keys()):

/usr/local/lib/python3.6/dist-packages/numpy/core/numeric.py in asarray(a, dtype, order)
    536 
    537     """
--> 538     return array(a, dtype, copy=False, order=order)
    539 
    540 

ValueError: setting an array element with a sequence.

Учебный код представляет собой 10-кратную перекрестную проверку следующим образом

y_pred = []
y_true = []

kf = KFold(n_splits=10)
kf.get_n_splits(X)
for train_idx, test_idx in kf.split(X):
    Xtrain, Xtest = X[train_idx], X[test_idx]
    y_train, y_test = Ys[train_idx], Ys[test_idx]
    X_train = Xtrain.reshape(Xtrain.shape[0], Xtrain.shape[1], 1)
    X_test = Xtest.reshape(Xtest.shape[0], Xtest.shape[1],1)
    model = BuilModel()
    print(y_train.shape)

    model.fit(X_train, y_train,
          batch_size=64,
          nb_epoch=10,
          validation_data=(X_test, y_test))
    y_true.append(y_test)
    y_pred.append(model.predict(X_test))

Где X имеет форму (32000, 120) Y являетсямассив двумерных матриц, представляющих цели

1 Ответ

2 голосов
/ 01 октября 2019

Аргумент outputs не должен присутствовать в model.compile.

Заменить

model.compile(loss=custom_loss,outputs=main_output, optimizer='adam')

на

model.compile(loss=custom_loss, optimizer='adam')
...