kerasで損失関数を自作したいのですが、ミニバッチの扱い方がよくわかりません。
自作したコードがこちらです。
python
1def custom_loss(y, L): 2 #y.shape = (batch_size, 50) 3 #L.shape = (batch_size, 50, 50) 4 return K.mean(K.dot(K.dot(K.transpose(y), L), y), axis=-1)
意図としては、転置したベクトルと行列を内積して得られたベクトルをさらにベクトルと内積して
それのミニバッチ全体の平均を損失関数としています。
これでfitしようとすると次のエラーが出ました。
Epoch 1/50
InvalidArgumentError Traceback (most recent call last)
<ipython-input-283-f2523448ebc4> in <module>
2 batch_size=100,
3 nb_epoch=epochs,
----> 4 shuffle=True,
5 #validation_data=(mean_test, Sigma_test),
6 #callbacks=[es]
~/anaconda3/lib/python3.7/site-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, **kwargs)
1037 initial_epoch=initial_epoch,
1038 steps_per_epoch=steps_per_epoch,
-> 1039 validation_steps=validation_steps)
1040
1041 def evaluate(self, x=None, y=None,
~/anaconda3/lib/python3.7/site-packages/keras/engine/training_arrays.py in fit_loop(model, f, ins, out_labels, batch_size, epochs, verbose, callbacks, val_f, val_ins, shuffle, callback_metrics, initial_epoch, steps_per_epoch, validation_steps)
197 ins_batch[i] = ins_batch[i].toarray()
198
--> 199 outs = f(ins_batch)
200 outs = to_list(outs)
201 for l, o in zip(out_labels, outs):
~/anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py in call(self, inputs)
2713 return self._legacy_call(inputs)
2714
-> 2715 return self._call(inputs)
2716 else:
2717 if py_any(is_tensor(x) for x in inputs):
~/anaconda3/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py in _call(self, inputs)
2673 fetched = self._callable_fn(*array_vals, run_metadata=self.run_metadata)
2674 else:
-> 2675 fetched = self._callable_fn(*array_vals)
2676 return fetched[:len(self.outputs)]
2677
~/anaconda3/lib/python3.7/site-packages/tensorflow/python/client/session.py in call(self, *args, **kwargs)
1456 ret = tf_session.TF_SessionRunCallable(self._session._session,
1457 self._handle, args,
-> 1458 run_metadata_ptr)
1459 if run_metadata:
1460 proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)
InvalidArgumentError: transpose expects a vector of size 2. But input(1) is a vector of size 3
[[{{node loss_27/lambda_19_loss/transpose_2}}]]
どのようにすればデータ1つの場合の損失関数の値を計算して、そのミニバッチでの平均値を出力することができるのでしょうか。拙い文章で申し訳ありませんが、どうぞ宜しくお願い致します。
あなたの回答
tips
プレビュー