質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

738閲覧

Kerasでの評価関数を自作するときの引数と演算方法

sub-ro

総合スコア0

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/12 12:45

前提・実現したいこと

二次関数で表すことのできる物性値を用いていくつかの特徴量を計算し、
計算された特徴量と二次関数の係数3つを教師データとするような機械学習プログラムをKerasで書いています。
デフォルトでは学習するときに出力される評価関数の値は3つの係数の推定値と真値の差に関わる量になります。
しかし、本来評価したい値は二次関数の係数ではなく、二次関数のある場所での値です。
このため、評価関数の自作を行いましたがいくつか疑問点が出てきたので教えていただけるとありがたいです。

質問内容

自作してみた評価関数は”該当のソースコード”にある通りです。

評価関数として直接用いるのは4つの関数のうち1, 2番目であり、3, 4番目はデバックに用いています。
係数は学習時に標準ベクトルに規格化されているので元に戻すためにy_stdsc.inverse_transform()
を用いています。
今回は二次関数f(x)のx=100の値を評価しています。

質問1:評価関数引数におけるバッチ数について

y_true, y_predは評価関数の引数として用いるために用意された変数であり、
各バッチごとの推定対象(ここでは二次関数の3つの係数)の真値と推定値であるとKeras公式サイトなどに書かれています。
そして、それ自体は正しいだろうということがいくつかの例で真値を出力することによってわかりました。
しかし、y_true, y_predの大きさとバッチ数が一致していません。
例えば教師データとして360個のデータを用意してvalidation_split = 0.1, batch_size = 64としたとします。
すると訓練に用いる教師データのバッチ数は
360 * (1 - 0.1) / 64 = 5.1
なので5個になるはずです。
対してy_true, y_predの大きさから分かるバッチ数は4個と一致しません。
この大きさは評価関数のy_true[i][j]のiの部分を変更してエラーが出るまでの数から求めています。
この不一致が起こるのはなぜでしょうか?

質問2:評価関数内での演算の方法

評価に用いたい二次関数の値は範囲が広いため、大きい値も小さい値も同時に評価するために真値と推定値の差(fdiff)を
真値と推定値の平均(fave)で割ったものを評価対象としています。
この計算を行うとエラーは生じないのですが計算結果がおかしくなります。
二次関数の真値、推定値を表示するための自作評価関数から評価対象を計算し
(ftruemetricsとfpredmetricsを各学習ごとに保存して外部で自作評価関数Fmetricsに対応する値を計算する)、
2番目の自作評価関数が計算する評価対象と比較すると一致しません。
比較対象を二次関数の真値や推定値そのものやそれらの差や平均にすると一致します。
一致しないのはy_true, y_predから求められる量同士を掛けたり、割ったときです。
この原因はy_true, y_predから求められる量はテンソルであり、テンソルは単純に掛けたり、割ったりできないからだと思い
テンソルの要素ごとの割り算(tf.math.divide(x, y))も用いてみましたが一致しませんでした。
どのように書けば正しく計算できるのでしょうか?

関数の係数を推定対象にしているが評価対象は関数のある点での値という少々間接的なことを行っていますが
答えを教えていただけるとありがたいです。

該当のソースコード

使用言語:python

""" 評価関数定義用関数 """ def Func(Coe_true, Coe_pred): xval = 100 ftrue = (Coe_true[0] + Coe_true[1] * xval + Coe_true[2] * xval * xval) fpred = (Coe_pred[0] + Coe_pred[1] * xval + Coe_pred[2] * xval * xval) fdiff = ftrue - fpred fdifftest = ftrue - fpred > 0 fave = (ftrue - fpred) / 2 Fval = fdiff / fave return tf.where(fdifftest, Fval, -Fval) """ 自作評価関数 """ def Fmetrics(y_true, y_pred): Coe_true = y_stdsc.inverse_transform([y_true[0][0], y_true[0][1], y_true[0][2]]) Coe_pred = y_stdsc.inverse_transform([y_pred[0][0], y_pred[0][1], y_pred[0][2]]) return Func(Coe_true, Coe_pred) """ 自作評価関数_真値表示用 """ def ftruemetrics(y_true, y_pred): Coe_true = y_stdsc.inverse_transform([y_true[0][0], y_true[0][1], y_true[0][2]]) return Coe_true[0] + Coe_true[1] * 100 + Coe_true[2] * 100 * 100 """ 自作評価関数_推定値表示用 """ def fpredmetrics(y_true, y_pred): Coe_pred = y_stdsc.inverse_transform([y_pred[0][0], y_pred[0][1], y_pred[0][2]]) return Coe_pred[0] + Coe_pred[1] * 100 + Coe_pred[2] * 100 * 100

補足情報(使用環境)

使用環境
python 3.6.10
keras 2.3.1
tensorflow 2.1.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問