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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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回答

3391閲覧

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

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グッド

4クリップ

投稿2017/06/22 11:02

編集2017/06/22 11:04

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

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

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

えと、まずリンクを貼っておきます。
私の説明の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/22 13:20

LouiS0616

総合スコア35660

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

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

kaitokimura

2017/06/22 15:23 編集

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

2017/06/22 15:37

「従来画像分類では1ピクセル1ピクセルをみて判断していた」これは誤解ですね。 SIFTなどを使った一世代前のNNと、畳込みNNの本質的な違いは、「特徴点を数学的に求めるか/学習によって自動的に求めるか」といった感じです。 全結合層への入力は特徴ベクトルです。(画像全体が特徴だ!というファンキーな実装も原理上は可能です) 畳込みNNの入力は、画像全体、つまり二次元配列であることが基本です。 畳込みNNの基本構造: 画像 -> 畳込み層 -> プーリング層 -> 全結合層 -> 出力 畳込みとプーリングをさらに重ねることもあります。 それ以外の解釈は、だいたいあっていると思います。
kaitokimura

2017/06/25 06: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で入力を平坦化しているのでしょうか??全結合層への入力は平坦化することが前提ですか??
LouiS0616

2017/06/25 07:03

まず、「とするならば」を明確にしておきたいと思います。Convolutional2Dが畳込み層、MaxPooling2Dがマックスプーリング層、Denseが全結合層というのは正しいです。 -なぜ畳込み層を二回連続で重ねるか- 実はプーリング層は必須でなく、むしろないほうが良いかもしれないという報告すらあります。その点で、プーリング層を毎回かませる必然性はありません。 回答でも触れていますが、人工知能という学問は帰納的に発達しています。意図をくみ取ることは可能ですが、ある種正確に返答するなら、「そのほうがうまくいった」からにすぎません。 畳込み層を連続でかませ、ところどころにプーリング層を組み込むアーキテクチャはよく見られるような気がします。 -Flattenの役割について- 実は私もKerasの初学者でして、少し調べました。どうやらFlattenは平滑化フィルタではないようです。 おそらく、畳込み層の出力である二次元リストを、一次元に成形しているのかと思われます。 [[1, 2], [3, 4], [5, 6]] -(Flatten)-> [1, 2, 3, 4, 5, 6] 全結合層は文字通り全てのリンクを扱うので、次元が増えるだけで組み合わせ爆発に巻き込まれてしまうのです。
kaitokimura

2017/06/25 11:08 編集

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

2017/06/25 08:19

いろいろと状況がふんわりしているので、気を付けるべき点を挙げてみます。 -『空模様の画像』は、航空写真ですか?天気図ですか?定点画像ですか?- もし定点画像でしたら、そもそもDNNを使う必要がないかと思います。画像全体の画素の平均値を取ればだいたい分類できるでしょうし、おそらくDNNもそのように学習します。 ・データセットはどれくらい用意できますか? 問題の複雑さにもよりますが、例えば「衛星画像をもとに、数時間後のどこどこの天気を予測する」といったような難しいものになると、ラベル付きデータは少なくとも数千、出来れば数万必要です。 問題設定によります、というと答えになっていないような気もしますが...
kaitokimura

2017/06/25 11:07 編集

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

2017/06/25 08:36 編集

うーん...雨の画像が少ないのは致命的ですね... そもそも、画像一枚一枚に対して実際の天気はわかるのですか? 雲一つないのに雨が降ることもありますし、その逆もありますから... 雨の時はレンズに雨粒がついていますが、毎回晴れる度に拭いているかもわかりませんし。
kaitokimura

2017/06/25 11:08 編集

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

2017/06/25 09:08 編集

ラベル付けが出来るのなら、学習も推定も可能ですよ。 ただ、以下のような機械学習でもなんでもない手法に手間・精度で劣ってしまう気もします。 ・if 画像の円検出をして一定数以上小円がある: 雨 ・else if 画像の平均画素が灰色に近い: 曇り ・else: 晴れ 学習目的としては、向いている題材とは言えないと思います。 犬猫の判別は鉄板ですね。色も多様、形も多様ですので、ディープラーニングの抽象思考が活躍することが期待できるのもGoodです。 MNISTの亜種として、こういうのも面白いかもしれません。http://internet.watch.impress.co.jp/docs/news/1030599.html
kaitokimura

2017/06/25 09:11

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

0

詳細な説明は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/23 02:29

編集2017/06/23 02:37
pashango2

総合スコア930

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

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

kaitokimura

2017/06/25 06:26

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問