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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Keras

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

Python

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

Q&A

1回答

429閲覧

kerasを用いたCNNでのFailedPreconditionError

kusaaaaaaaaa

総合スコア15

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Keras

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

Python

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

0グッド

0クリップ

投稿2018/11/28 02:29

編集2018/11/29 05:21

前提・実現したいこと

機械学習初心者でAdverdsrialExamplesの学習をしています。
次のgithubを参考にし、少し内容を変更したプログラムを作成しようとえております。
https://github.com/nobetan/dl_examples/blob/master/adversal_example/adversal_example_imagenet.ipynb
変更点は主にCNNモデルを変更し、自前のデータセットを学習させ、自前の画像でテストを行っている点になります。

以下のプログラムに対するエラーの原因がわからずに困っております。
もしご存知の方いらしましたら、ご教授またはご指摘頂けると幸いです。

以下プログラム

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

FailedPreconditionError (see above for traceback): Attempting to use uninitialized value conv2d_1/bias [[{{node conv2d_1/bias/read}} = Identity[T=DT_FLOAT, _device="/job:localhost/replica:0/task:0/device:CPU:0"](conv2d_1/bias)]] エラーが発生した箇所までのソースコードを張りますので、こちらを参照ください。↓ https://github.com/posimiya99/a/blob/master/error.ipynb

試したこと

こちらに記載されているように変数の初期化等を試みたがうまくいかず同様のエラーが出てしまった。
http://mosapro.hatenablog.com/entry/2017/05/17/094606

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

win10
python 3.6.6
tensorflow 1.11.0
jupyter

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

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

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

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

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

tiitoi

2018/11/29 05:25

sess.run(tf.global_variables_initializer()) これを試したらどうでしょうか?
kusaaaaaaaaa

2018/11/29 05:37

ありがとうございます、このコードはどの位置に挿入すればよろしいでしょうか?
tiitoi

2018/11/29 05:41 編集

[11] の find_adversary_noise() の直前に入れるとどうですか?
kusaaaaaaaaa

2018/11/29 05:55

ありがとうございます。エラーを回避することが出来ました。エラーは起こらなかったのですが実行内容に問題が出てしまい、元画像がそもそも0%になる現象が起こってしまいました。そのコードを載せるので見て頂けると幸いです。何か対処法がありましたら教えて頂きたいです。→https://github.com/posimiya99/a/blob/master/error2.ipynb
tiitoi

2018/11/29 06:04

ちょっとパット見ではわからないです。そもそもAdvarsal Network を作ってもパラメータが増えたりすることにはないので、 sess.run(tf.global_variables_initializer()) はいらないはずなんですがね。コードはちゃんとNotebook の上から順番に実行しているのでしょうか?
kusaaaaaaaaa

2018/11/29 06:13

ありがとうございます。コードは上から順に実行しています。in[]で抜けている数字は他のクラスで試していたので数字が増えています。そもそものデータセットの画像(文字)はハッキリしているものではなく、CNNモデル精度が70%と低いのですがそれが原因だったりするのでしょうか?
tiitoi

2018/11/29 06:25

データがこちらはなく動かして確認できないので、すみませんが、なぜそうなるかはちょっとわからないです。
kusaaaaaaaaa

2018/12/04 04:39

回答ありがとうございます。find_adversary_noiseのnoiselimit値を大きくしたところ、ノイズをかける事に成功し、ひとまずAdversarialExamplesを生成することが出来ました。しかし、出力結果には不自然な所があり、相変わらずsourseの予測が0%であったり、実際に生成した画像を予測してみたところ、ターゲットラベルへ画像を変形できておらず、元々の画像の予測と同じになっていました。→https://github.com/posimiya99/no1/blob/master/github/no1/part1.ipynb 必要なデータセット、json、h5、ipynbを用意しましたので→https://github.com/posimiya99/no1/tree/master/github/no1 、もしお時間があればtiitoiさんの環境で試して頂いて、解決策を見つけることが出来たのなら教えて頂きたいと思っています。厚かましいお願いですが、どうかよろしくお願いします。
tiitoi

2018/12/04 05:55

ご提示いただいたコードを動かしてみましたが、重みを読み込んで推論しようとすると FailedPreconditionError と出るのはおかしいです。保存されてる重みファイルが不完全な可能性があります。モデルの定義及び学習部分のコードを提示していただくことはできますか?
kusaaaaaaaaa

2018/12/06 06:11

回答ありがとうございます。githubが不調でしたので、ファイル共有サービスの方にipynbファイルをアップロードさせていただきました。→https://25.gigafile.nu/0105-2ca213f60764c00e01a7d6cff68c7a4d 解決策がありましたら教え頂きたいです。よろしくお願いします。
tiitoi

2018/12/06 07:54

動かしてみましたが、50 epoch 時点で train accuracy 100% で test accuracy 15%となったので、過学習しているようです。質問者さんの環境ではちゃんと学習ができたのでしょうか?
tiitoi

2018/12/06 07:54 編集

---2重投稿になってしまったのでこちらを削除---
kusaaaaaaaaa

2018/12/07 03:41

回答ありがとうございます。こちらの環境でも過学習しているようでした。この様な場合どの様な対策をすれば正確に学習できるのでしょうか?
tiitoi

2018/12/07 04:53 編集

データを増やすぐらいしかないですね。たぶん100枚は少ないと思うので。 とりあえず汎化性能が出るような学習ができないと、そのあとAdversasl Network を試したりどうこうっていうのは意味がないので。
kusaaaaaaaaa

2018/12/08 03:27

回答ありがとうございます。こちら(https://qiita.com/halspring/items/7692504afcba97ece249)を参考にしてデータセットの水増しを行い、学習用の画像を2600枚から26000枚に増やしました。約10倍に増やして学習させたのですがやはり過学習が起こっているようでした。また、水増しする前に比べてもより精度が低下してしまいました。val_accが異様に低いのですが、何か原因は考えられるでしょうか?学習済みの画像に対する精度は高いのでデータセット自体には問題はないと思っています。それとも水増しではなく新たなデータセットが必要なのでしょうか?また、モデルを変えると精度は上昇するのでしょうか?何が原因であるかもし分かるようでしたら教えて頂きたいです。よろしくお願いします。水増ししたデータセットと学習したコードをこちらに載せさせて頂きます。→https://38.gigafile.nu/0107-1f8e3aa4a56e83edff87aa2dbe3783e8
tiitoi

2018/12/08 04:17 編集

長くなったので、回答のほうに過学習の対策をいくつか書きました。どれをやったら確実に精度があがるか (それとも上がらないか) はやってみないとわかりません。その試行錯誤が機械学習に取り組むことになります。 自分の経験からいうと、今回のケースはデータが少なすぎると思います。(あくまで予想です。) 今回のデータは captcha の画像みたいですが、どうやって集められたのでしょうか?適当な背景にアルファベット文字を入れて機械的に作ったように見えるので、同じ要領でプログラムで作成できないのでしょうか?
guest

回答1

0

コメント欄の続き

学習は損失関数を最小化するだけなので、基本的に枚数に関係なく収束させられます。
なので、「学習はできた (train acc は100%近くになった) のでデータセットは問題ない」という論理は成り立たないです。

過学習の対策としては

  1. モデルの構造、パラメータの数の見直し
  2. Batch Normalization、Dropout、正則化項導入
  3. 0から学習するのではなく、ImageNet の学習済みモデルで転移学習する。
  4. データが少ないので増やす

などがあります。

今回、captcha のように複雑な背景にアルファベットの文字が1つある画像から、アルファベットを推定する26クラス分類問題ですよね。
似たような問題としては MNIST があります。
MNIST は 0 ~ 9 の手書き文字画像認識で背景は黒、クラス数も10なので今回の問題よりずっと簡単だと思いますが、学習データは6万枚あります。
それと比較して26クラスで2600枚というのは、MNIST よりずっと難しい問題を解こうとしているのに、少なすぎると感じます。

データオーグメンテーションはある程度 val acc が出ている場合にそれをさらに上げるのには効果がありますが、今回のように全くダメという場合にはそれでデータを増やすだけでは難しいと思います。

やはり、データをもっと増やすべきだと思います。
一般に captcha の画像は機械的に作っているものだと思うので、それで機械的にデータを作ることはできないのでしょうか?

投稿2018/12/08 04:13

tiitoi

総合スコア21956

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

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

kusaaaaaaaaa

2018/12/10 02:36

ありがとうございます。画像を生成する環境はあるので、データセットを増やしてもう一度挑戦してみたいと思います。大体で大丈夫なのですが、合計で何枚ほどあれば成功するでしょうか? とにかく今は大量にデータセットを収集して学習させたいと思います。
tiitoi

2018/12/10 05:06 編集

何枚あればいいかは試してみないとわかりません。 機械的に生成できるのであれば、沢山作りましょう。 例えば MNIST の各クラスの枚数は以下のようになっています。参考までに。 数字 枚数 0 5923 1 6742 2 5958 3 6131 4 5842 5 5421 6 5918 7 6265 8 5851 9 5949
kusaaaaaaaaa

2018/12/10 05:31

ありがとうございます。参考にさせていただきます!
kusaaaaaaaaa

2018/12/11 12:08

26クラスのデータセットを揃えるのには時間がかかる為、まず2クラスのみで試しました。 枚数はA 約1000枚 B 1000枚とMNISTには及びませんが、最初の10倍揃えました。 学習させてみたところ、val_accが0.96となり、過学習せず無事に学習しているようでした。 そしてAdversarialExamplesを生成しようとB→Aに変形させたのですが、B100%→B0%、A0%→99%のように変形出来ているようでした。(noiselimit、step_size、grad_absmax等の変数を任意に変更し、成功したり成功しなかったりと良く分からない現象が起きた、同じコードなのに成功したりエラーが出る事もある、今回は成功?した例) しかし、やはり最後のpredict_single_imgを行った際に、noisy_imgが変形前の様にBが100%となってしまいました。 以前記載していただいたimagenetで行う際のコードをアドバイス通り変更し、そこでpredict_single_img内のコードをいじったのですが、それが影響しているのでしょうか? 生成したAdversarialExamplesの画像を保存し予測したのですが、やはりB100%となってしまいました。 もし、原因がわかるようでしたら教えて頂きたいです。よろしくお願いします。 今回の学習からAdversarialExamples生成までのコード等は以下です↓ https://24.gigafile.nu/0110-54fbac7e4340dad520bb09fd61b00f73 以前記載して頂いたimagenetによるAdversarialExamples生成のコードは以下です↓ https://github.com/nobetan/dl_examples/blob/master/adversal_example/adversal_example_imagenet.ipynb 比較するとわかりやすいかもしれません、よろしくお願いします。
kusaaaaaaaaa

2018/12/13 03:02

何か少しでも分かる様な事がありましたら教えて頂きたいです。よろしくお願いします。
tiitoi

2018/12/13 03:22

コメントは見たのですが、今 GPU 使える環境がないので週末とかに確認しようと思います。 すいません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問