🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Keras

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

Python

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

Q&A

1回答

965閲覧

画像識別の結果を安定させる方法

kane_study

総合スコア4

Keras

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

Python

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

0グッド

0クリップ

投稿2021/01/02 12:22

初期値に依存するせいか、学習→テストの結果が1〜2%程、変わってしまいます。
何か良い方法はないでしょうか?

BatchNormalizationを試しましたが、あまり変わりませんでした。

python

1 [1-6] 2# モデルの定義。 3def define_model(): 4 inputs = Input(shape=(32, 32, 3)) 5 x = Conv2D(64, (3, 3), padding='SAME', activation='relu')(inputs) 6 x = Conv2D(64, (3, 3), padding='SAME', activation='relu')(x) 7 x = Dropout(0.25)(x) 8 x = MaxPooling2D()(x) 9 10 x = Conv2D(128, (3,3), padding='SAME', activation='relu')(x) 11 x = Conv2D(128, (3,3), padding='SAME', activation='relu')(x) 12 x = Dropout(0.25)(x) 13 x = MaxPooling2D()(x) 14 15 x = Conv2D(256, (3,3), padding='SAME', activation='relu')(x) 16 x = Conv2D(256, (3,3), padding='SAME', activation='relu')(x) 17 x = GlobalAveragePooling2D()(x) 18 19 x = Dense(1024, activation='relu')(x) 20 x = Dropout(0.25)(x) 21 y = Dense(10, activation='softmax')(x) 22 23 model = Model(inputs, y) 24 25 # モデルのコンパイル。 26 model.compile(optimizer=tf.keras.optimizers.Adam(), 27 loss='categorical_crossentropy', 28 metrics=['accuracy']) 29 model.summary() 30 return model 31 32model = define_model()

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

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

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

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

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

guest

回答1

0

こんにちは、ちなみにデータセットの規模はどれくらいでしょうか?もし、手持ちの、例えば自分で実験をして得たデータで、公開データセットのような大規模なものではない場合は、数%程度であれば、毎回異なってくるのはある程度は仕方ない気もします。
条件が詳しくわかりませんが、訓練とデータの分け方や初期値が毎回異なっていたりすると思います。

投稿2021/01/03 07:53

Kenta_py

総合スコア132

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

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

kane_study

2021/01/03 09:03

ありがとうございます。 CIFAR-10です。 学習データ5万 テストデータ1万です。
kane_study

2021/01/03 09:04

上記のモデルだと30エポック (optimizer=SGD(momentum=0.9) に変えた場合は100エポック回してます。
kane_study

2021/01/03 09:08

補足ですが 学習→テスト とは学習をリセットし、 再度、学習させてみて、差が出るか確認しました。 テストデータは毎回同じです。
Kenta_py

2021/01/03 09:09

なるほど、cifar-10なのですね。確かに、インプットサイズが32ですね! cifar-10でこのCNNのネットワークの感じだと精度は75%くらいでしょうか? 私の勝手な経験ですがその条件で1%くらいずれるのは仕方ないかなあと思っていました。何か結果が毎回ほぼ同じでいけない理由や目的などがあるのでしょうか?
kane_study

2021/01/03 09:13

活性化関数を変えて識別制度を測ってみたいという目的と そのモデルから作られたadversarial example を作成し adversarial trainingをやってみたいです。
kane_study

2021/01/03 09:15

識別精度は 83%です。
kane_study

2021/01/03 09:18

adversarial exampleとは元の画像に 少しノイズ(ネトワークから逆算)を加え、意図的に人工知能の判断を誤らせるというものです。 何かの記事で読んだのですが パンダの画像が手長ザルに誤認識されたらしいです。
kane_study

2021/01/03 09:20

adversarial training とは adversarial exampleをトレーニングデータに混ぜる事で adversarial exampleをある程度正確に識別できる様にする事です。
Kenta_py

2021/01/03 09:25

なるほど、ありがとうございます。adversarial trainingをやるために、そもそも同じ設定でもその中でどれくらいばらつくのかを知りたくてやってみると1・2%ほど分類精度が毎回異なった、ということですね。 少し話が違いますが、手元にある書籍ではcifar-10で活性化関数を変えながら実験してる例がありましたが、この条件では活性化関数ごとに誤認識率が大きく異なっていたので、ひとまず活性化関数を変えてみるとそれ以上に変化がみられるかもしれないですね。 adversarial trainingについても詳しくやりたいことを記述いただきありがとうございます。
kane_study

2021/01/03 09:33

ありがとうございます。 既にやりました。あまり大きな差はない事と 差を分かりやすくする為に学習を安定させたいです。
kane_study

2021/01/03 09:34

申し訳ございません。 どんなモデル、どんな条件で どんな活性化関数で比較していましたでしょうか?
Kenta_py

2021/01/03 09:59 編集

なるほど、あまり差がなかったのですね。以前私も似たことをやったことがあるのですが、あまり大きくは変わりませんでした。そのときはcutoutやrandom erasingの有無で精度が変わるかをやった記憶があります。 参考にした書籍は以下のものです。 https://bookclub.kodansha.co.jp/product?item=0000310465 活性化関数は有名なReLuなどで比べていました。詳細な構造は書いていなかったように思います。 そのほかはメジャーなパラメータのほかにZCA白色化の有無などでも検証していました。 残念ながら私もどうしたら今回の取り組みで良い結果に導けるか、ということはわからないので、WEBでcifar10, adversarial training などで調べてその実験のコードがあるかもしれないので探してみてはいかがでしょうか。本題に戻ると、個人的には1、2%程度のばらつきは同じ条件内でもあってある程度は仕方ないんじゃないかと思い、回答させていただいた次第でした。 安定化させるとしたら、これが本質的に正しい方法かどうかはおいておいて、乱数シードを固定するとか、CNNの重みの初期値を発生させるときの分散を小さくするとか、0からはじめるとかがあるかと思いました。分類精度は下がるかもしれませんが、層を浅くしたりCNNのパラメータ数も少なくすればよいかもしれません。ミニバッチをシャッフルしないとかもあると思います。 よろしくお願いいたします。
kane_study

2021/01/03 10:01

ありがとうございます。 数パーの差はよくある事なのですね。
kane_study

2021/01/03 10:22

ありがとうございます。 外部パッケージを使っているので、 tensorflowしか使えません。 初期値設定は厳しそうです。
kane_study

2021/01/03 10:23

層を浅くする CNNのパラメータ数を少なくするというのは逆効果な気がしたのですが どうなんでしょうか 自分は逆に上げようとしました。
Kenta_py

2021/01/03 10:32

なるほど、ご報告ありがとうございます。 パラメータ数が少ないとランダムな要素が減るので安定するのでは?と思ったのですが、逆効果ですかね、、、 ひとまずこのスレッドでは変化させる候補を絞ったということで閉じてしまって、また色々と試されたリストを列挙し、さらに最終的にはadversarial exampleに応用したい旨など詳しく述べた新たな質問を設ければ他の良い回答が得られやすいかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問