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

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

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

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

4936閲覧

ループ処理における Could not interpret metric function identifier エラーの解決

mako_H

総合スコア11

Keras

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

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/11/14 06:48

編集2018/11/16 10:22

機械学習の勉強をしているものです.
python, keras(tensorflow)を使った多クラス分類のプログラムを作成しております.

概ねプログラムが完成し,各種精度を算出したいと考えた際,
https://qiita.com/shiita0903/items/838d50598cc28766f84e
こちらのサイトを見つけ,ソースコードを参考にしました.

これを使い単一のファイルについて各種精度を出せたので,次はディレクトリ内の各々のファイルについて先頭のものから順に読み込み,それぞれのファイルごとの精度を算出しようとしました.
しかし,先頭のファイルの精度を算出し,次のファイルの学習が開始される前に以下のメッセージが表示されプログラムがストップしてしまいます.

ValueError: ('Could not interpret metric function identifier:', 0.XXXX(数値))

なぜ単一のファイルの精度算出ではできfor文ループさせようとするとエラーが出てしまうのか,分かる方がいればご教示頂ければ幸いです.

※ソースコードは一部は省略,修正して載せております.

該当のソースコード

Python3

1# -*- coding: utf-8 -*- 2 3import keras.backend as K 4import os 5import pandas as pd 6from sklearn.model_selection import train_test_split 7from keras.models import Sequential 8from keras.layers.core import Dense, Activation 9from keras.utils import np_utils 10from sklearn import preprocessing 11 12 13# precision, recall, f-measureを定義する 14def normalize_y_pred(y_pred): 15 return K.one_hot(K.argmax(y_pred), y_pred.shape[-1]) 16 17 18def class_true_positive(class_label, y_true, y_pred): 19 y_pred = normalize_y_pred(y_pred) 20 return K.cast( 21 K.equal(y_true[:, class_label] + y_pred[:, class_label], 2), 22 K.floatx()) 23 24 25def true_positive(y_true, y_pred): 26 y_pred = normalize_y_pred(y_pred) 27 return K.cast(K.equal(y_true + y_pred, 2), K.floatx()) 28 29 30def class_precision(class_label, y_true, y_pred): 31 y_pred = normalize_y_pred(y_pred) 32 return K.sum(class_true_positive(class_label, y_true, y_pred)) / ( 33 K.sum(y_pred[:, class_label]) + K.epsilon()) 34 35 36def micro_precision(y_true, y_pred): 37 y_pred = normalize_y_pred(y_pred) 38 return K.sum(true_positive(y_true, y_pred)) / (K.sum(y_pred) + K.epsilon()) 39 40 41def macro_precision(y_true, y_pred): 42 class_count = y_pred.shape[-1] 43 return K.sum([class_precision(i, y_true, y_pred) for i in range(class_count)]) \ 44 / K.cast(class_count, K.floatx()) 45 46 47def class_recall(class_label, y_true, y_pred): 48 return K.sum(class_true_positive(class_label, y_true, y_pred)) / ( 49 K.sum(y_true[:, class_label]) + K.epsilon()) 50 51 52def micro_recall(y_true, y_pred): 53 return K.sum(true_positive(y_true, y_pred)) / (K.sum(y_true) + K.epsilon()) 54 55 56def macro_recall(y_true, y_pred): 57 class_count = y_pred.shape[-1] 58 return K.sum([class_recall(i, y_true, y_pred) for i in range(class_count)]) \ 59 / K.cast(class_count, K.floatx()) 60 61 62def class_f_measure(class_label, y_true, y_pred): 63 precision = class_precision(class_label, y_true, y_pred) 64 recall = class_recall(class_label, y_true, y_pred) 65 return (2 * precision * recall) / (precision + recall + K.epsilon()) 66 67 68def micro_f_measure(y_true, y_pred): 69 precision = micro_precision(y_true, y_pred) 70 recall = micro_recall(y_true, y_pred) 71 return (2 * precision * recall) / (precision + recall + K.epsilon()) 72 73 74def macro_f_measure(y_true, y_pred): 75 precision = macro_precision(y_true, y_pred) 76 recall = macro_recall(y_true, y_pred) 77 return (2 * precision * recall) / (precision + recall + K.epsilon()) 78 79 80def build_multilayer_perceptron(): 81 """多層パーセプトロンモデルを構築""" 82 model = Sequential() 83 model.add(Dense(16, input_shape=(12, ))) 84 model.add(Activation('relu')) 85 model.add(Dense(2)) 86 model.add(Activation('softmax')) 87 return model 88 89 90if __name__ == "__main__": 91 with open("result.csv", "w") as f: 92 print("date,accuracy,precision,recall,f_measure", file=f) 93 94 for i in range(1, 32): 95 # ファイルが存在すれば読み込み,以下を実行する 96 if (os.path.exists( 97 os.path.join("data", "hoge", "20XX", "01", 98 "20XX010" + str(i) + ".txt")) 99 or os.path.exists( 100 os.path.join("data", "hoge", "20XX", "01", 101 "20XX01" + str(i) + ".txt"))): 102 if i < 10: 103 dataset = pd.read_csv( 104 os.path.join("data", "hoge", "20XX", "01", 105 "20XX010" + str(i) + ".txt"), 106 delim_whitespace=True) 107 else: 108 dataset = pd.read_csv( 109 os.path.join("data", "hoge", "20XX", "01", 110 "20XX01" + str(i) + ".txt"), 111 delim_whitespace=True) 112 113 # 説明変数,ターゲット変数を定義 114 X = dataset.iloc[:, [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]] 115 Y = dataset.iloc[:, 17] 116 117 # データの標準化 118 X = preprocessing.scale(X) 119 120 # ラベルをone-hot-encoding形式に変換 121 # 0 => [1, 0, 0] 122 # 1 => [0, 1, 0] 123 # 2 => [0, 0, 1] 124 Y = np_utils.to_categorical(Y) 125 126 # 訓練データとテストデータに分割 127 train_X, test_X, train_Y, test_Y = train_test_split( 128 X, Y, train_size=0.8, test_size=0.2) 129 130 # print(macro_precision) 131 # print(macro_recall) 132 # print(macro_f_measure) 133 134 # モデル構築 135 model = build_multilayer_perceptron() 136 model.compile( 137 optimizer='adam', 138 loss='categorical_crossentropy', 139 metrics=[ 140 'accuracy', macro_precision, macro_recall, macro_f_measure 141 ]) 142 143 # モデル訓練 144 model.fit(train_X, train_Y, epochs=1, batch_size=100, verbose=1) 145 146 # モデル評価 147 loss, accuracy, macro_precision, macro_recall, macro_f_measure = model.evaluate( 148 test_X, test_Y, verbose=0) 149 150 # print(macro_precision) 151 # print(macro_recall) 152 # print(macro_f_measure) 153 154 # 学習,評価結果を保存 155 with open("result.csv", "a") as f: 156 print( 157 "{0},{1},{2},{3},{4}".format( 158 str(i), accuracy, macro_precision, macro_recall, 159 macro_f_measure), 160 file=f)

エラー文が出て止まった際の箇所

metrics=[ 'accuracy', macro_precision, macro_recall, macro_f_measure ])

補足情報(FW/ツールのバージョンなど)

・Python 3.6.5
・Keras 2.2.4
・Tensorflow 1.11.0

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーを見たところ

'Could not interpret metric function identifier:', 0.XXXX(数値)

とのことなので、'macro_precision', 'macro_recall' 'macro_f_measure' という関数名と同じ名前の変数名を定義してしまっていたりしないですか?

print(macro_precision) print(macro_recall) print(macro_f_measure)

として確認してみてください。

投稿2018/11/14 06:58

編集2018/11/14 06:58
tiitoi

総合スコア21956

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

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

mako_H

2018/11/14 07:11

# モデル構築の前の行と,# モデル訓練 の処理後にそれぞれprint文を配置しました. 前者では, <function macro_precision at 0x11d4b0b70> <function macro_recall at 0x11d4b0d08> <function macro_f_measure at 0x11d4b0ea0> とアドレスを返していたのに対し,後者では, 0.4999672006402435 0.4999934401280487 0.4999799484058381 とそれぞれ数値を返しております. また,エラー内容も, ValueError: ('Could not interpret metric function identifier:', 0.4999799484058381) と後者の数値が表示されておりました.
mako_H

2018/11/14 23:24

どのようにしたら,値が関数に代入されない?ようになるのでしょうか? どなたでも構いません.分かる方がいれば,ご教示頂ければ幸いです.
tiitoi

2018/11/15 01:26

モデル訓練の処理後と書いていますが、compile()の段階、つまりモデル訓練の前にエラーになったのですよね? 原因ですが、提示されてるのがコードの一部だけなのでわかりません。 関数名と同じ名前の変数を使っていないか確認してください
mako_H

2018/11/16 10:30

>モデル訓練の処理後と書いていますが、compile()の段階、つまりモデル訓練の前にエラーになったのですよね? そうです.print文でデバッグしたところ,i=1のときのモデル訓練(評価)後それぞれの変数の値がアドレスから数値になり,i=2のときモデル訓練の前にエラーで止まってしまっております. >原因ですが、提示されてるのがコードの一部だけなのでわかりません。 >関数名と同じ名前の変数を使っていないか確認してください 全文を載せました.また,同じ名前の変数は,#モデル構築,#モデル評価,#学習,評価結果を保存,の箇所でしか使っておりません.
tiitoi

2018/11/16 10:37

> loss, accuracy, macro_precision, macro_recall, macro_f_measure = model.evaluate(test_X, test_Y, verbose=0) 回答の通り、ここで「関数名と同じ名前の変数」を定義してしまっていますね。関数名と重複する名前を変数名に使わないようにしてください。 つまり、解決策としては、ここの evaluate() の返り値を代入している変数名を変えてください。
mako_H

2018/11/17 00:42

そちらで定義しまっているのを失念しておりました.よく考えればそうですよね.恥ずかしい... 無事,解決いたしました.何度も解答してくださり,ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問