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

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

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

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python 3.x

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

Q&A

解決済

2回答

614閲覧

ChainerでF値を出したい

KazuyaKojima

総合スコア16

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

Python 3.x

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

0グッド

1クリップ

投稿2020/01/23 08:34

現在chainerを用いて分類予測を行うモデルを作成しているのですが、f値をPrintReportで表示することができません。
調べてみてもあまりそれらしいものが出てこないので質問させていただきました。

なお、accuracy, lossは正常に記録されています。

python

1import matplotlib.pyplot as plt 2import load_data 3import load_vector 4import numpy as np 5import chainer 6import chainer.links as L 7import chainer.functions as F 8from chainer import Chain, Variable, datasets, optimizers 9from chainer import report, training 10from chainer.training import extensions 11from chainer import iterators 12from chainer import serializers 13import chainer.cuda 14 15#データの準備(株) 16topix = load_vector.load_vector("topix_100days") #入力データの選択 17x_train, x_test = topix[:2000], topix[2000:] 18 19label = load_data.label(load_data.teacher_dataset("topix.csv"),length=100) #教師データの選択 20t_train, t_test = label[:2000], label[2000:] 21 22train = list(zip(x_train, t_train)) 23test = list(zip(x_test, t_test)) 24 25# #データの準備(果物) 26# fluits, labels = load_vector.load_fluits() 27# x_train, x_test = fluits[:500]+fluits[600:1200], fluits[500:600]+fluits[1200:] 28# t_train, t_test = labels[:500]+labels[600:1200], labels[500:600]+labels[1200:] 29# train = list(zip(x_train, t_train)) 30# test = list(zip(x_test, t_test)) 31 32class CNN(Chain): 33 def __init__(self): 34 super(CNN, self).__init__() 35 with self.init_scope(): 36 self.cn1 = L.Convolution2D(None, 32, ksize=(3,3), pad=(1,1)) 37 self.cn2 = L.Convolution2D(None, 32, ksize=(3,3), pad=(1,1)) 38 self.fc1 = L.Linear(None, 128) 39 self.fc2 = L.Linear(128, 2) 40 41 def __call__(self, x, t=None): 42 h1 = F.max_pooling_2d(F.relu(self.cn1(x)), ksize=4, stride=4) 43 h2 = F.max_pooling_2d(F.relu(self.cn2(h1)), ksize=4, stride=4) 44 h3 = F.dropout(F.relu(self.fc1(h2)),ratio=0.5) 45 return self.fc2(h3) 46 47 48model = CNN() 49net = L.Classifier(model) 50optimizer = optimizers.MomentumSGD(lr=0.001).setup(net) 51 52batchsize = 30 53train_iter = chainer.iterators.SerialIterator(train, batchsize, repeat=True, shuffle=True) 54test_iter = chainer.iterators.SerialIterator(test, batchsize, repeat=False, shuffle=True) 55 56updater = training.StandardUpdater(train_iter, optimizer, device=-1) # device=-1でCPUでの計算実行を指定 57 58epoch = 50 59trainer = training.Trainer(updater, (epoch, 'epoch'), out='result') 60 61# テストデータで評価 62trainer.extend(extensions.Evaluator(test_iter, net, device = -1)) 63 64# 学習を記録 65trainer.extend(extensions.LogReport(trigger=(1, 'epoch'))) 66 67# グラフに描画、保存 68trainer.extend(extensions.PlotReport(['main/loss', 'validation/main/loss'], x_key='epoch', file_name='loss.png')) 69trainer.extend(extensions.PlotReport(['main/f1_score', 'validation/main/f1_score'], x_key='epoch', file_name='f_score.png')) 70trainer.extend(extensions.PlotReport(['main/accuracy', 'validation/main/accuracy'], x_key='epoch', file_name='accuracy.png')) 71trainer.extend(extensions.PrintReport(['epoch', 'main/f1_score', 'main/accuracy','validation/main/f1_score', 'validation/main/accuracy','elapsed_time']), trigger=(1, 'epoch')) 72 73trainer.run()

よろしくお願いいたします。

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

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

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

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

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

Q71

2020/01/23 10:01

同じような事で止まっていて、続きができていません。 Chainerのコードを調べたところ、レポートに登録しなければならないようでした。標準のClassifierを使われているようですが、そのコードを見てみてください。
KazuyaKojima

2020/01/24 04:36

なるほど、一度見てみます
KazuyaKojima

2020/01/24 06:05

Evaluatorの部分を追記することで解決いたしました。参考にどうぞ
guest

回答2

0

自己解決

調べてみるとaccuracyとlossのみが標準でEvaluatorで計算してくれるようでそれ以外の指標は自作しなければならないようです。

python

1 2class Evaluator(extensions.Evaluator): 3 default_name="mycm" 4 def evaluate(self): 5 iterator = self._iterators['main'] 6 model = self._targets['main'] 7 eval_func = self.eval_func or model 8 9 if self.eval_hook: 10 self.eval_hook(self) 11 12 if hasattr(iterator, 'reset'): 13 iterator.reset() 14 it = iterator 15 else: 16 it = copy.copy(iterator) 17 18 summary = reporter_module.DictSummary() 19 20 f1_count = 0 21 recall_count = 0 22 prexision_count = 0 23 lcount = 0 24 for i, batch in enumerate(it): 25 observation = {} 26 with reporter_module.report_scope(observation): 27 in_arrays = self.converter(batch, self.device) 28 with function.no_backprop_mode(): 29 if isinstance(in_arrays, tuple): 30 eval_func(*in_arrays) 31 re, pr = self.cm(in_arrays) 32 elif isinstance(in_arrays, dict): 33 eval_func(**in_arrays) 34 re, pr = self.cm(in_arrays) 35 else: 36 eval_func(in_arrays) 37 re, pr = self.cm(in_arrays) 38 f1 = 2 * re * pr / (re + pr) 39 40 f1_count = f1_count + f1 41 recall_count = recall_count + re 42 precision_count = precision_count + pr 43 44 summary.add(observation) 45 lcount = i 46 47 cm_observation = {} 48 49 cm_observation["recall"] = round(recall_count / (lcount + 1), 3) 50 cm_observation["precision"] = round(precision_count / (lcount + 1), 3) 51 cm_observation["f1_score"] = round(f1_count / (lcount + 1), 3) 52 53 summary.add(cm_observation) 54 55 return summary.compute_mean() 56

投稿2020/01/24 06:04

KazuyaKojima

総合スコア16

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

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

Q71

2020/01/24 06:06

Evaluaterの方でしたか。ありがとうございます。
guest

0

Classifierのコード

Python

1reporter.report({'loss': self.loss}, self)

145行目です。このように、レポーターに登録してやる必要があるみたいです。まだ試せていないので、試すことができたなら是非結果を教えて下さい。

投稿2020/01/24 05:45

Q71

総合スコア995

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問