Я пытаюсь построить сеть, которая предсказывает кривую так, чтобы кривая была как можно ближе к группе кривых вместе.
Я определил эту пользовательскую функцию потерь
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 являетсямассив двумерных матриц, представляющих цели