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

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

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

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

Python

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

Q&A

解決済

1回答

2770閲覧

Chainer 評価の欄が空白

nematoda

総合スコア9

Chainer

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

Python

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

0グッド

0クリップ

投稿2018/09/13 08:12

編集2018/10/01 02:49

前提・実現したいこと

Chainerを用いて、入力画像を2つのグループに分類するCNNを作ろうと考えています。
そして、作ったモデルを評価するためにextensionsを使うつもりです
しかし、extensionsを使っても以下のように値が表示されるはずの箇所が空白になっています。
原因がわかる方、解決方法がわかる方は是非教えてください

発生している問題・エラーメッセージ

エラーメッセージ test:2001 10001 epoch main/loss main/accuracy validation/main/loss validation/main/accuracy elapsed_time 1 127.978 2 136.339 3 144.826 4 153.156 5 161.596 6 169.946 7 178.368 8 186.679 9 195.067 10 203.447

該当のソースコード

python

1import os 2import numpy as np 3from PIL import Image 4import matplotlib 5matplotlib.use('Agg') 6import chainer 7from chainer import cuda,Function,report,training,utils,Variable 8from chainer import datasets,iterators,optimizers,serializers,cuda 9from chainer import Link,Chain,ChainList 10import chainer.functions as F 11import chainer.links as L 12from chainer.training import extensions 13import cupy 14 15 16class MyChain(Chain): 17 def __init__(self): 18 super(MyChain,self).__init__( 19 cn1 = L.Convolution2D(3,30,9,stride=1,pad=0), 20 cn2 = L.Convolution2D(30,48,9,stride=1,pad=1), 21 cn3 = L.Convolution2D(48,60,9,stride=1,pad=0), 22 l1 = L.Linear(2160,100), 23 l2 = L.Linear(100,2), 24 ) 25 26 def __call__(self,x,t): 27 return F.softmax_cross_entropy(self.fwd(x),t) 28 29 def fwd(self,x): 30 h1 = F.max_pooling_2d(F.relu(self.cn1(x)),2) 31 h2 = F.max_pooling_2d(F.relu(self.cn2(h1)),2) 32 h3 = F.max_pooling_2d(F.relu(self.cn3(h2)),2) 33 h4 = F.relu(self.l1(h3)) 34 return self.l2(h4) 35 36model = MyChain() 37optimizer = optimizers.Adam() 38optimizer.setup(model) 39 40gpu_device = 0 41chainer.cuda.get_device(gpu_device).use() 42model.to_gpu(gpu_device) 43image_files = 'millionimages.txt' 44dataset = chainer.datasets.LabeledImageDataset(image_files) 45split_at = int(len(dataset) * 0.8) 46train,test = chainer.datasets.split_dataset(dataset,split_at) 47 48 49batchsize = 128 50train_iter = iterators.SerialIterator(train,batchsize,repeat=True,shuffle=True) #batchsizeを設定 51test_iter = iterators.SerialIterator(test,batchsize,repeat=False,shuffle=False) 52updater = training.StandardUpdater(train_iter,optimizer,device=gpu_device) 53trainer = training.Trainer(updater,(10,'epoch'),out='result_validation') #epochを設定 54 55trainer.extend(extensions.LogReport()) 56trainer.extend(extensions.snapshot(filename='snapshot_epoch-{.updater.epoch}')) 57trainer.extend(extensions.Evaluator(test_iter, model,device=gpu_device)) 58trainer.extend(extensions.PrintReport(['epoch', 'main/loss', 'main/accuracy', 'validation/main/loss', 'validation/main/accuracy', 'elapsed_time'])) 59trainer.extend(extensions.PlotReport(['main/accuracy', 'validation/main/accuracy'],x_key='epoch', file_name='accuracy.png')) 60trainer.extend(extensions.PlotReport(['main/loss', 'validaion/main/loss'],x_key='epoch', file_name='loss.png')) 61trainer.extend(extensions.ProgressBar()) 62 63trainer.run() 64 65 66

試したこと

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

Python 2.7.12
chainer 4.1.0

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

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

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

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

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

guest

回答1

0

自己解決

損失計算(softmax_cross_entropy)をモデルの中に入れ込んでしまうのではなく、L.Classifierで損失計算をすることで、評価の欄に計算結果が表示されました。
L.Classifierは損失計算だけでなく、lossやaccuracyの値も計算する機能が備わっているようなので、trainerのextendで評価をする場合は使ったほうが良いのかな?(勉強不足でごめんなさい)
L.Classifierはデフォルトでsoftmax_cross_entropyを計算するので、今回の場合はこのまま使えました。
記述に間違いなどがあったら是非教えてください。

以下のコードは前のコードからモデル内のsoftmax_cross_entropyを削除し、L.Classifierを追加したものです。
他にも細かいところが変わっていますがあまり気にしなくてもいいです。

python

#coding:UTF-8
import os
import numpy as np
from PIL import Image
import matplotlib
matplotlib.use('Agg')
import chainer
from chainer import cuda,Function,report,training,utils,Variable
from chainer import datasets,iterators,optimizers,serializers,cuda
from chainer import Link,Chain,ChainList
import chainer.functions as F
import chainer.links as L
from chainer.training import extensions
import cupy

class MyChain(Chain):                #F.softmax_cross_entropyを削除
def init(self):
super(MyChain,self).init(
cn1 = L.Convolution2D(3,30,9,stride=1,pad=0),
cn2 = L.Convolution2D(30,48,9,stride=1,pad=1),
cn3 = L.Convolution2D(48,60,9,stride=1,pad=0),
l1 = L.Linear(2160,100),
bn = L.BatchNormalization(100),
l2 = L.Linear(100,2),
)

def __call__(self,x): h1 = F.max_pooling_2d(F.relu(self.cn1(x)),2) h2 = F.max_pooling_2d(F.relu(self.cn2(h1)),2) h3 = F.max_pooling_2d(F.relu(self.cn3(h2)),2) h4 = F.relu(self.l1(h3)) h5 = self.bn(h4) return self.l2(h5)

model = MyChain()
model = L.Classifier(model)               #追加
optimizer = chainer.optimizers.Adam()
optimizer.setup(model)

gpu_device = 0
chainer.cuda.get_device(gpu_device).use()
model.to_gpu(gpu_device)

image_files = 'millionimages.txt'
dataset = chainer.datasets.LabeledImageDataset(image_files)
split_at = int(len(dataset) * 0.8)
train,test = chainer.datasets.split_dataset(dataset,split_at)
print("train:"+str(len(train)))
print("test:"+str(len(test)))
print(len(dataset))
print(str(train[0]))

batchsize = 128
train_iter = chainer.iterators.SerialIterator(train,batchsize,repeat=True,shuffle=True)
test_iter = chainer.iterators.SerialIterator(test,batchsize,repeat=False,shuffle=False)
updater = training.StandardUpdater(train_iter,optimizer,device=gpu_device)
trainer = training.Trainer(updater,(10,'epoch'),out='result_validation')

trainer.extend(extensions.LogReport())
trainer.extend(extensions.snapshot(filename='snapshot_epoch-{.updater.epoch}'))
trainer.extend(extensions.Evaluator(test_iter, model,device=gpu_device))
trainer.extend(extensions.PrintReport(['epoch', 'main/loss', 'main/accuracy', 'validation/main/loss', 'validation/main/accuracy', 'elapsed_time']))
trainer.extend(extensions.ParameterStatistics(model))
trainer.extend(extensions.PlotReport(['main/accuracy', 'validation/main/accuracy'],x_key='epoch', file_name='accuracy.png'))
trainer.extend(extensions.PlotReport(['main/loss', 'validaion/main/loss'],x_key='epoch', file_name='loss.png'))
trainer.extend(extensions.dump_graph('main/loss'))
trainer.extend(extensions.ProgressBar())

trainer.run()

投稿2018/10/01 12:13

nematoda

総合スコア9

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問