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

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

ただいまの
回答率

90.45%

  • Python

    12338questions

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

  • Python 3.x

    10309questions

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

  • MacOS(OSX)

    2401questions

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

  • TensorFlow

    957questions

ディープラーニングについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 5
  • VIEW 1,478

kaitokimura

score 51

ディープラーニングについて始めたいのですがたくさん疑問がありすぎます。
画像識別についてですが
Kerasでキルミーアイコン686枚によるキルミー的アニメ絵分類
上に他の画像でも識別できるようなことが書いてあったので
あげているソースコード
kill_me_learning
を理解するところから始めようと思いました。
様々なサイトを見ましたが、いまいち畳み込み層、プーリング層、全結合層のイメージがわかりません。
上記コードのkml_train.pyにおいて、このコードではニューラルネットワーク構築の際kerasをつかっているようですが、
Sequentialにてモデル構築。addでその機能を追加していくようなイメージだと思います。
Convolution2Dは、3*3のフィルタを32回かけていくというでしょうか?、フィルタの数(32)がそのまま次のノード数に繋がると考えて良いのでしょうか??
フィルタをかけたあとにrelu関数(0を超えていれば入力をそのまま出力する関数)を用いることで濃淡が数値として表され、何もないところは0何か色がある場合はそこの値がそのまま出力されるということでエッジ検出などにつかわれるということですか??

プーリング層ですが画像を圧縮していくということですが、これは何かが写っている部分だけを画像とするので小さくなるということでしょうか??

全結合層についてはまったくわかりません。
色々な知識を数日で詰め込んでしまった結果余計わからなくなってしまいました…。
イメージ説明
インプットの1ノードに画像の1ピクセルが入っていますよね?ここからどのように動いているのか教えて欲しいです…。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+8

えと、まずリンクを貼っておきます。
私の説明の10000000倍役に立つと思います。

全結合層

ディープラーニングの基幹、ニューラルネットワーク(NN)の基本形です。
特徴ベクトルを入力とし、出力は目的によって様々です。
分類問題に用いるときは、出力層の一つ一つのノードの値は、そのクラスに属する尤度と解釈することが多いです。
出力を適当に決めてよいのか...? と思うかもしれませんが、どんなシステムでも学習できるのがNNの最大の強みです。
もちろん、決め方によって性能に差は出ますが。

さて、肝心の演算については、実はかなり簡単な計算をしています。
まず、大前提として、ノードもリンクも、一つ一つ実数値を持っています。
全結合のニューラルネットワーク
このとき、i4は次のように計算されます。
i4 = n1*w1 + n2*w2 + n3*w3 これが、隠れ層のノードの一つへの入力になります。
それでは出力は何かと言いますと、n4 = f(i1+b1)となります。
ここで、fは活性化関数と呼んでいるもので、ネットワークで非線形の演算を表現できるようにするものです。
ReLUもその一種で、他にもシグモイド関数などが用いられることがあります。

それでは、結局ニューラルネットワークの学習とはなんなのか...?
NNも入力に対して出力が一定に決まるという意味では一種のファンクションです。
その振る舞いはパラメータ、ここでは重みwとバイアスbで決まります。
重みとバイアスを正しくチューニングすることが、まさにNNの学習であるといえます。

隠れ層

図では英語でHidden Layerと書かれていますね。
ディープラーニングは、層の多い、つまり隠れ層の多いNNを用いた学習を指します。
さて、なぜ最近ディープラーニングがホットなのか...?
「隠れ層が多いことで、人間の抽象的な思考や概念を表現できるためだ」と言われています
実は学問的な裏付けはあまりありません。人工知能は科学ですから、帰納的に学問が発展しています。

特徴ベクトル

さて、ニューラルネットワークの説明で特徴ベクトルという言葉を用いました。
特徴ベクトルは、文字通り特徴を並べた配列で、その形態はさまざまです。
画像を用いた問題の場合、どのような特徴を抽出してくるか、が大きなテーマになっています。
昔は、エッジやコーナーを演算して抽出するようなシステムを用い、特徴ベクトルを作っていました。

畳込みニューラルネットワーク(CNN)

昔は?では今はどうしているのか?そう感じるのは正しいです。
今は、畳込み層を用いたニューラルネットワークを用いるのが基本です。
畳込み層を用いることによって、エッジやコーナー、濃淡などを抽出します。

畳込み層も重みを持っています。演算自体は、普通の画像フィルタリングと同じです。
畳込みNNが従来のNNと違うのは、特徴の抽出も学習することです。
いろいろ資料を見ていると、畳込み層がエッジなどを強調したものが見つかると思います。
これは、畳込み層がよりよい特徴を抽出するように学習されたからです。
機械が自発的に特徴を見つけるというのは、まさに抽象的な思考を取得していると言えませんか?

プーリング

お調べになっている通り、画像を圧縮する層です。
この層は、演算を高速化する他に、細かい位置の変換に強くなる(頑健である)と言えます。
例えば人間が写真を見たとき、写っているものの位置に着目するでしょうか?
写真のどの位置に写っていようが、人間は人間であり、犬は犬です。
その点では、必要な位置情報は絶対位置ではなく、相対位置であると言えます。
プーリング層を噛ませることによって、細かな位置の違いが無視され、性能が上がると言われているのです。

ここらの話はこちらが参考になります。

ようやく質問に答えると

長くなってしまってすみません。

それぞれの層のイメージ
役割としては、次のような感じでしょうか。

  • 畳込み層... 特徴を抽出する。
  • プーリング層... こまかな位置を意図的に無視することで、頑健性を高める。
  • 全結合層... NNの心臓部。得られた特徴ベクトルを基に分類問題を解く。

畳込みの演算と出力について
畳込み層の演算自体は、一般のフィルタリング処理と同一です。フィルタの出力が次の層に伝わります。

ReLU関数の役割について
直接的な役割は、先ほども言ったように、ネットワークの表現力を高めることです。
畳込み層によって、確かにエッジなどの画像が得られますが... あくまで学習の結果です。

プーリング層の役割について
画像を圧縮するという認識は正しいです。しかし、「何かが写っている部分」だけを選んでいるわけではありません。
イメージで言うと、モザイク処理ですかね。画像全体を圧縮します。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/23 00:22 編集

    大変丁寧に答えていただき本当にありがとうございます。
    全結合層は最後につかわれることが多いようなのですが。解釈としてこういうことでよいでしょうか。
    従来画像分類では1ピクセル1ピクセルをみて判断していたものであった。畳み込みニューラルネットワークでは1ピクセルではなく特徴ベクトルを入力として分類するものである。その特徴ベクトルを抽出するものが畳み込み層である。その畳み込み層で得られた特徴ベクトルをプーリング層により位置不偏性を獲得し、これらによって得られた特徴ベクトルを全結合層によりクラス分類する。全結合における中間層のノード数はdenseの引数によって与えられる。この解釈は合っているでしょうか??
    明日はお返事が遅くなると思いますがよろしくお願いいたします。

    キャンセル

  • 2017/06/23 00:37

    「従来画像分類では1ピクセル1ピクセルをみて判断していた」これは誤解ですね。
    SIFTなどを使った一世代前のNNと、畳込みNNの本質的な違いは、「特徴点を数学的に求めるか/学習によって自動的に求めるか」といった感じです。
    全結合層への入力は特徴ベクトルです。(画像全体が特徴だ!というファンキーな実装も原理上は可能です)

    畳込みNNの入力は、画像全体、つまり二次元配列であることが基本です。
    畳込みNNの基本構造: 画像 -> 畳込み層 -> プーリング層 -> 全結合層 -> 出力
    畳込みとプーリングをさらに重ねることもあります。

    それ以外の解釈は、だいたいあっていると思います。

    キャンセル

  • 2017/06/25 15:39

    大変返信が遅れて申し訳ありません。
    では今回の挙げられているソースコードで質問がございます。
    convolution2Dが畳み込み層、MaxPooling2Dがマックスプーリング層を表しているとするならば
    ```-python
    model.add(Convolution2D(32, 3, 3, border_mode='valid',
    input_shape=x_train.shape[1:]))
    model.add(Activation('relu'))
    #以降設定しなくて良い。
    model.add(Convolution2D(32, 3, 3))
    model.add(Activation('relu'))

    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Convolution2D(64, 3, 3, border_mode='valid'))
    model.add(Activation('relu'))

    model.add(Convolution2D(64, 3, 3))
    model.add(Activation('relu'))

    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))

    model.add(Flatten())
    #中間層
    model.add(Dense(256))
    model.add(Activation('relu'))

    model.add(Dropout(0.5))
    model.add(Dense(NUM_CLASSES))
    #どのクラスであるかの確率算出
    model.add(Activation('softmax'))
    ```
    といった具合に2回連続で畳み込み層が存在するのですがこれの意図は何でしょうか??
    またDenseを全結合層だとするならなぜFlattenで入力を平坦化しているのでしょうか??全結合層への入力は平坦化することが前提ですか??

    キャンセル

  • 2017/06/25 16:03

    まず、「とするならば」を明確にしておきたいと思います。Convolutional2Dが畳込み層、MaxPooling2Dがマックスプーリング層、Denseが全結合層というのは正しいです。

    -なぜ畳込み層を二回連続で重ねるか-
    実はプーリング層は必須でなく、むしろないほうが良いかもしれないという報告すらあります。その点で、プーリング層を毎回かませる必然性はありません。
    回答でも触れていますが、人工知能という学問は帰納的に発達しています。意図をくみ取ることは可能ですが、ある種正確に返答するなら、「そのほうがうまくいった」からにすぎません。
    畳込み層を連続でかませ、ところどころにプーリング層を組み込むアーキテクチャはよく見られるような気がします。

    -Flattenの役割について-
    実は私もKerasの初学者でして、少し調べました。どうやらFlattenは平滑化フィルタではないようです。
    おそらく、畳込み層の出力である二次元リストを、一次元に成形しているのかと思われます。
    [[1, 2], [3, 4], [5, 6]] -(Flatten)-> [1, 2, 3, 4, 5, 6]
    全結合層は文字通り全てのリンクを扱うので、次元が増えるだけで組み合わせ爆発に巻き込まれてしまうのです。

    キャンセル

  • 2017/06/25 16:52 編集

    自分の都合により改変しました。

    キャンセル

  • 2017/06/25 17:19

    いろいろと状況がふんわりしているので、気を付けるべき点を挙げてみます。

    -『空模様の画像』は、航空写真ですか?天気図ですか?定点画像ですか?-
    もし定点画像でしたら、そもそもDNNを使う必要がないかと思います。画像全体の画素の平均値を取ればだいたい分類できるでしょうし、おそらくDNNもそのように学習します。

    ・データセットはどれくらい用意できますか?
    問題の複雑さにもよりますが、例えば「衛星画像をもとに、数時間後のどこどこの天気を予測する」といったような難しいものになると、ラベル付きデータは少なくとも数千、出来れば数万必要です。

    問題設定によります、というと答えになっていないような気もしますが...

    キャンセル

  • 2017/06/25 17:28 編集

    自分の都合により改変しました。

    キャンセル

  • 2017/06/25 17:33 編集

    うーん...雨の画像が少ないのは致命的ですね...
    そもそも、画像一枚一枚に対して実際の天気はわかるのですか?
    雲一つないのに雨が降ることもありますし、その逆もありますから...

    雨の時はレンズに雨粒がついていますが、毎回晴れる度に拭いているかもわかりませんし。

    キャンセル

  • 2017/06/25 17:56 編集

    自分の都合により改変しました。

    キャンセル

  • 2017/06/25 18:07 編集

    ラベル付けが出来るのなら、学習も推定も可能ですよ。
    ただ、以下のような機械学習でもなんでもない手法に手間・精度で劣ってしまう気もします。
    ・if 画像の円検出をして一定数以上小円がある: 雨
    ・else if 画像の平均画素が灰色に近い: 曇り
    ・else: 晴れ
    学習目的としては、向いている題材とは言えないと思います。

    犬猫の判別は鉄板ですね。色も多様、形も多様ですので、ディープラーニングの抽象思考が活躍することが期待できるのもGoodです。
    MNISTの亜種として、こういうのも面白いかもしれません。http://internet.watch.impress.co.jp/docs/news/1030599.html

    キャンセル

  • 2017/06/25 18:11

    根本的に題材の問題でしたかありがとうございます。
    今回のところは判別を理解するために犬猫から始めて見たいと思います。
    題材に関しましてはまた練り直したいとおもいます。笑
    複数の質問に答えていただき本当にありがとうございました。
    2日以内に犬猫編でも問題が出てくると思いますのでその時はまたよろしくお願いいたします。
    LouiSさんのような大変優しく知識のある方がいてくれると大変助かります。ありがとうございました。

    キャンセル

+1

詳細な説明はLouiS0616さんにおまかせするとして・・・

Convolution2Dは、3*3のフィルタを32回かけていくというでしょうか?、フィルタの数(32)がそのまま次のノード数に繋がると考えて良いのでしょうか??

元記事の説明をみていませんが、多分違います。
3*3はウインドウサイズです、3x3のウインドウで32回Kernel処理をするというだけであり、次ノード数とは全く関連性はありません。

フィルタをかけたあとにrelu関数(0を超えていれば入力をそのまま出力する関数)を用いることで濃淡が数値として表され、何もないところは0何か色がある場合はそこの値がそのまま出力されるということでエッジ検出などにつかわれるということですか??

違います、reluは単なる活性化関数ですエッジ検出などとは無関係です。

プーリング層ですが画像を圧縮していくということですが、これは何かが写っている部分だけを画像とするので小さくなるということでしょうか??

違います。
画像の細部情報を間引くことにより、特徴を見つけやするためのものです。

インプットの1ノードに画像の1ピクセルが入っていますよね?ここからどのように動いているのか教えて欲しいです…。

違います、CNNでは1ピクセルごとの分解は行いません。

質問を見ているとDeepLearning自体の知識に乏しく、重要なバックプロパゲーションの概念がないように見えます。
Webで分断的な情報を学習よりも、以下の書籍で基礎を学習する事をオススメします。

「ゼロから作るDeep Learning: Pythonで学ぶディープラーニングの理論と実装」

DeepLearningやっている人は、高確率でこの本を持っています(私の周辺調べ)ですので、今後わからない事があったら「この本のここがわからない」と具体的な質問が出来るようになり、具体的な答えも得られるようになります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/25 15:26

    とりあえず書籍購入いたしました。わからないところがあったらまたよろしくお願いいたします。

    キャンセル

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

  • ただいまの回答率 90.45%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    12338questions

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

  • Python 3.x

    10309questions

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

  • MacOS(OSX)

    2401questions

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

  • TensorFlow

    957questions