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

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

新規登録して質問してみよう
ただいま回答率
85.49%
機械学習

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

Python

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

Q&A

解決済

3回答

5836閲覧

DeepLearning Network in Network CNN 保存したモデルを使って予測をすると毎回違った値が返ってくる

_Victorique__

総合スコア1392

機械学習

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

Python

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

0グッド

0クリップ

投稿2017/11/15 16:26

現在、ディープラーニングを用いた画像分類をやっています。
GPUを用いて学習を行いcpuにモデルを戻してからserializerのnpzを使ってモデルを保存しました。
ちなみにモデルにはNINを用いています。

早速保存したモデルを読み込んで分類とその分類したクラスのパーセンテージを表示させるようにしました。
ですが、同じ画像なのに毎回違った値が返ってきます。
例えばクラスの分類があっていて、そのクラスのパーセンテージが違う場合はまあいいのですが、クラス分類まで変わってしまうことがあります。モデルは変わっていないはずなのにこういうことがあり得るのでしょうか?

関係がありそうな部分だけコードを載せておきます。

Network in Network

python

1#モデルの作成 2model = NIN(5) 3optimizer = optimizers.Adam() 4optimizer.setup(model) 5cuda.get_device(gpu_device).use() 6model.to_gpu(gpu_device) 7 8 9#モデルの保存 10model.to_cpu() 11serializers.save_npz('ファイル名.npz', model) 12 13 14#確率変換 15def softmax(a): 16 c = np.max(a) 17 exp_a = np.exp(a-c) 18 sum_exp_a = np.sum(exp_a) 19 y = exp_a / sum_exp_a 20 return y 21 22 23#予測 24model = NIN(n_class) 25serializers.load_npz('モデルのファイルパス', model) 26x = Variable(img_lst[0:1]) 27y = model(x) 28test = y.data[0] 29test = test.tolist() 30y = softmax(y.data[0])

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

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

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

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

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

WathMorks

2017/11/15 21:36

「ですが、同じ画像なのに毎回違った値が返ってきます。」具体的な数値を教えてください。
_Victorique__

2017/11/16 01:30

クラス分類が変わる程値がブレると記述していますが、具体的な値を出して意味があるでしょうか?
guest

回答3

0

ベストアンサー

Network in Network(http://hiro2o2.hatenablog.jp/entry/2016/12/06/214839)

このリンク先のコードそのまま使ってるんですかね?
そうだとして、、、ですけど、self.trainTrueのままだったりしませんか?
それなら、推論時にもdropoutが入るのでおかしくなりそうな気がします。

投稿2017/11/16 03:39

diningyo

総合スコア379

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

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

_Victorique__

2017/11/16 04:11

あーそこは完全に盲点でした。どうやらv2.0.0以降からtrainが廃止されていたらしく、エラーが出ていたのでそこだけ削除してしまっていたようです。解決策として以下のようなwith構文を書くことで切り替えができるようになるみたいです!ありがとうございました。 with chainer.using_config('train', False): h = self.mlpconv4(F.dropout(h))
guest

0

当然ですがNINのコードがないと答えられないでしょう。
URLの先にあるそのNINのコードには__call__の途中にdropoutが入っています。
これがそのままなら、毎回ランダムに入力の一部を削除するので結果が変わりますね。どうなんでしょう?

投稿2017/11/15 22:10

quickquip

総合スコア11038

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

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

_Victorique__

2017/11/16 01:34

回答ありがとうございます。dropout関数に関してもう少し調べてみます。
_Victorique__

2017/11/16 01:39

ですがクラス分類が変わる程の値のブレは正直理解しがたいです。
quickquip

2017/11/16 02:48

モデルの重みとコードがないことには、そこへの確証は持てません。あり得るのでしょうか? と聞かれたらあり得るでしょう、としか。
_Victorique__

2017/11/16 04:13

どうやらdropout関数が原因でした。結果的には同じ値が返ってくるのが普通という認識であっていました。ありがとうございました!
quickquip

2017/11/16 04:47

なんだ。普通そんな挙動をするコードを書くことがあるのか? という質問だったのか……。
quickquip

2017/11/16 04:50

Chainerの古いコードの挙動まで調べなかったのは私の失敗で、ちょっと勘違いしたままの回答になってしまいました。
guest

0

具体的にどういう処理をしているのかはよく知りませんが、乱択アルゴリズムを内部で使用しているような計算をしている以上、毎回異なる学習結果になるのは当たり前ではないでしょうか?モデルの妥当性などはもちろん学習結果が毎回異なることとは別問題ですが。
追記:「モデルの保存」が「学習したパラメータの保存」ということならば予測させた結果は毎回変わることはないと思います。

投稿2017/11/15 18:55

編集2017/11/15 19:41
Paalon

総合スコア232

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

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

_Victorique__

2017/11/16 01:39

学習したパラメータの保存が serializer.save という認識であっているのかというところが疑問ですね。現在は optimizer.save をしていないのでそれを含めてのモデルの保存というのなら少し考えないといけないですね。それにしてもクラス分類が変わってしまうほどの値のブレは正直理解不能です。
_Victorique__

2017/11/16 04:13

解決しました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問