Tensorlowの損失関数の計算結果の次元について

回帰:燃費を予測する

このチュートリアルを実行してmodelのトレーニングを完了したのち、
手動でmseによる損失を計算したいと思います。
tf.keras.losses.MeanSquaredErrorを用いると

Python

mse = tf.keras.losses.MeanSquaredError() mse(train_labels, model.predict(normed_train_data)).numpy() >>118.41424560546875

となり、上記チュートリアル中のlossの結果に比べると全然違う値が返ってきます。

もしくはtf.keras.metrics.mean_squared_errorで計算させると

Python

tf.keras.metrics.mean_squared_error( model.predict(normed_train_data), train_labels,).numpy().shape >>(314,)

正解ラベルの数だけlossが返ってきます。

y_predとy_trainの形状は

Python

model.predict(normed_train_data).shape >>(314, 1)train_labels.shape >>(314, )

のようになっているので、それをReshapeして合わせると、

Python

tf.keras.metrics.mean_squared_error( model.predict(normed_train_data).reshape(-1), train_labels,).numpy()>>3.975967443404117 mse = tf.keras.losses.MeanSquaredError() mse(model.predict(normed_train_data).reshape(-1), train_labels).numpy()>>3.9759674072265625

と近い値になります。

また以下のように手動でloss関数を tf.keras.metrics.mean_squared_errorで設定した場合も上と同じ結果が得られます。

Python

def custom_loss(y_true, y_pred): loss = tf.keras.metrics.mean_squared_error( y_true, y_pred ) return loss def build_model(): model = keras.Sequential([ layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]), layers.Dense(64, activation='relu'), layers.Dense(1) ]) optimizer = tf.keras.optimizers.RMSprop(0.001) model.compile(loss=custom_loss, optimizer=optimizer, metrics=['mae', 'mse']) return model

model.fit中で計算されるmseの結果は内部的に自動でreshapeされてリンク中のような結果になっているのでしょうか?

コメントを投稿

0 コメント