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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Q&A

解決済

2回答

1384閲覧

kerasを用いたCNNでの犬猫判別

kaitokimura

総合スコア59

Python 3.x

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

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

0グッド

0クリップ

投稿2017/07/05 11:02

編集2017/07/05 11:03

Mac OS Sierra 10.12.1

現在kerasを用いたCNNで犬猫判別をしています。
犬猫の画像を128*128(3チャンネル)にリサイズして
ミニバッチを採用しています。
33の60カーネル畳み込み層でrelu関数を用いたものが2層
マックスプーリング層が2
2
ドロップアウト25パーセント
33の60カーネル畳み込み層でrelu関数を用いたものが2層
マックスプーリング層が2
2
ドロップアウト25パーセント
Flattenしrelu関数を用いた256の全結合層
ドロップアウト50パーセント
ソフトマックス関数でクラス分類(犬か猫かの2択)
オプティマイザにはadadeltaを用いていて損失関数にはcategorical_crossentropyを用いています。
エポック数は30です。
この結果val_accが76%しかいきませんでした。
いくつか疑問があります教えてください。
①まずacc,loss,val_acc,val_lossについてです。
解釈ですがaccはトレーニング画像の正答率。lossはcategorical_crossentropyからの値(この値を減らすための重みを調整して行ってくれている?)、val_accはテスト画像の正答率val_lossはテスト画像のlossという感じでよろしいですか??
②層の組み合わせなのですが大まかな組み立てはできませんか??一層一層追加していき試行錯誤で正答率を上げていくしかないのでしょうか??
③カーネル数の増減による影響はなんでしょうか??
④ドロップアウトを挟むところは適正でしょうか?誤っていたらどのように使うことが適切でしょうか。
⑤全結合層の中間層??の増減により影響はなんですか??ここのパラメーターは結果によって調整するくらいの感覚なのでしょうか??
色々質問があり申し訳有りませんがよろしくお願いいたします。
一応一通り教科書は読まさせていただきました。
コーディングしていき疑問点を解消していきたい次第です。。。
足りない情報がありましたら答えさせていただきます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

どのような教科書を使ったのかは知りませんが、非常に基本的な内容です。また、あなたの現状の理解度と問題の難易度がマッチしていないように思います。まずは基本事項を確認しましょう。

  1. acc, loss, val_acc, val_loss

acc: 精度, accuracy 正解率のこと
loss: 損失関数の値。お考えの通り、大まかにはこの値を減らすように学習をしています。
val_acc, val_loss: それぞれ「validation」セットのacc, loss です。どの画像のacc, lossなのかはコードの書き方によります。大まかにはvalidation_splitを使って指定しているなら。トレーニングセットから切り出したヴァリデーション画像のacc, lossです。validation_dataにテスト画像を指定しているならテスト画像のacc, loss になります。validationとtestには違う画像を使うことをおすすめします。

  1. 層の組み合わせについて

これについては6.で後述します

  1. Conv層のkernel数

そのままで申し訳ありませんが畳み込み層のフィルタの大きさです。
以下の記事などでそもそも畳込み層で何をやっているのかを確認しましょう。
http://qiita.com/icoxfog417/items/5fd55fad152231d706c2

  1. ドロップアウトの位置

コードがないと正確なことは言えませんが、おおまかには問題ないように思います。

  1. 全結合層のユニット数

また、そのままで申し訳ないですが、アフィン変換行列のサイズとなります。
多いほうがモデル誤差が小さくなりますが、トレーニングデータの量によっては過学習の原因となりますので、適宜調節してください。

  1. ネットワークの構造について

まず、トレーニングデータ、テストデータの画像数がわからないですが、このような簡単な構造で76%なら良いほうではないかと思います。
MNISTなら、このような構造でもよいかとは思います。しかし、犬、猫の分類のように難しい分類には力不足です。GoogleNet, AlexNet, VGGNet などを持ちださなければ太刀打ち出来無い問題だと思います。

以上です。

投稿2017/07/05 13:07

MasashiKimura

総合スコア1150

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

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

kaitokimura

2017/07/05 13:54 編集

validation_dataにテスト画像を指定している場合。単純にtrainで作成した分類器によってどれだけの精度で判別できているかがval_accと考えてよろしいでしょうか?? 3につきまして、conv層のことは勉強したのですが枚数が全体にちょうどフィルターをかけることができる枚数を指定すればいいですか??(例えば元画像が128*128の場合3*3のフィルタをかけたい場合枚数はどう指定するのが適切なのでしょうか。) 5、6に関しましてとてもわかりやすい説明ありがとうございます。
MasashiKimura

2017/07/05 14:16 編集

validation_data にテスト画像を与えているなら val_acc はテスト画像の精度です。 しかし、そのような方法で使うことを意図しているものではありません。テスト画像の精度は model.evaluate()ではかってください。 畳み込み層のフィルタについては、誤解しているようですね。フィルタの枚数と画像サイズは関係ありません。大雑把な説明ですが、カーネルサイズが画像サイズと一致していて、フィルタ枚数が100なら全体での畳込みの回数は100回です。逆に、カーネルが画像を100分割し、フィルタ枚数に100を指定するなら、全体では1万回です。
kaitokimura

2017/07/05 14:20

ようやく全て分かったような気がします。すごく納得しました。笑 関数名まで教えてくださってありがとうございました。ようやく一つ進むことができそうです(泣
kaitokimura

2017/07/05 14:25

回答いただいたお二方ありがとうございました。後に回答いただいた方も大変わかりやすかったのに申し訳ございませんでした。またお二方ともまたよろしくお願いします。
guest

0

答えられる範囲で答えます
①概ねあっていると思います.
kerasを使用されているとのことですので,fitメソッドのvalidation_splitを使っている前提でお話します
val_accやval_lossはvalidデータに対する数値かと思います.一般的に機械学習ではデータをtrainデータ,validデータ,testデータの3種類に分割します.trainデータではモデルのパラメータを,validデータではモデルのハイパーパラメータを調整するのに使います.

②画像認識で有名なモデル(VGGやresnet)について調べて見るのはどうでしょうか?
そのモデルがなぜ精度改善に繋がったのかなどを理解するのがいいと思われます

⑤中間層の数は①で触れたハイパーパラメータの1つです.
中間層の数を増やせばモデルの表現能力は向上しますが,汎化性能が落ちる恐れがあります.逆に数を減らせばモデルの表現能力は低下し精度が悪くなる可能性があります
モデルの適切な表現能力を見極めるために,中間層の数を変えては学習を回し,val_lossがどう変化するかを見守ることになるかと思います

投稿2017/07/05 13:23

odan

総合スコア54

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

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

kaitokimura

2017/07/05 13:35

2、5については理解できたのですが、ではここでのパラメータとハイパーパラメータとは何を意味していますか??人間が予め設定しておかなければいけないものをハイパーパラメータと呼びますよね??ユニット数やニューラルネットワークの層等自分で決めるパラメータということですよね??validデータではこの人間が決めたパラメータを調整するのですか??trainとvalidについてもう少し教えていただきたいです。
odan

2017/07/05 13:43

SGDで自動的に調整される値(Dense層を構成する行列など)をパラメータ,Dense層のユニット数やDropoutの確率などの値をハイパーパラメータといいます.仰られている通りハイパーパラメータはvalidデータを使って調整します. trainデータの一部(10%など)を取り出してvalidデータとすることが多いです.validation_splitはfitメソッドに与えられたtrainデータ(X, y)のうち何%をvalidデータとして使うかを指定します https://keras.io/ja/models/sequential/
kaitokimura

2017/07/05 13:58 編集

私が自分で何をしているのかわからなくなりました。笑 splitでデータを分けているのですがそれはtrainデータとvalidデータを分けてくれているということなのですよね。 testデータらしきものをこれ以外に設けていないのですが、この場合validデータがtestデータの役割をしているということですか? てっきりトレーニング画像でパラメータを調整した後、val_accはどれだけ分類できているかの精度を示しているものだと考えていました。この考えは間違えですか? それとも今自分は犬か猫かの分類さえできておらずパラメータ調整しているだけつまり分類器を作成しているだけに過ぎず、testデータを新たに与えてあげなければいけないのでしょうか?大変申し訳ないです。
odan

2017/07/05 14:06

validデータを見てハイパーパラメータを調整しているとモデルがvalidデータにオーバフィットし,モデルを正しく評価出来ません. そのためにtestデータが用意されています.つまりモデルを評価する場合,testデータに対する正解率を見なければなりません 大抵のデータセットの場合,最初からtrainデータとtestデータは用意されていると思いますが...
kaitokimura

2017/07/05 14:23

過学習が起こりうるわけですね。trainデータの中の数割をvalidデータとして扱い両方のデータを用いてパラメータハイパーパラメータを調整し、testデータはこれらの精度を測るものですか。
odan

2017/07/05 14:26

そうです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問