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

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

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

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

Q&A

解決済

2回答

17272閲覧

KerasのConv2D関数のパラメーターfilters: 使用するカーネルの数、って意味不明

oookabe

総合スコア126

Keras

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

1グッド

6クリップ

投稿2017/10/01 02:37

KerasのConv2D関数のパラメーターfilters: 「使用するカーネルの数」って意味不明です。
カーネルサイズ(Gaussian関数のσに相当)が指定されれば、そのfilterも唯一に決められ、一つしかないと思いますが、どうして「使用するカーネルの数」というパラメーターがあるのでしょうか。

もしかして、同じfilterを使って画像を連続的に(結果を継承的に)平滑する回数の事を指しているのでしょうか。
そうだったら、同じ画像に対して何十回も繰り返し平滑したら、画像内容がなくなりますね!?

filters: 「使用するカーネルの数」を解釈できる方お願い致します。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

そのまんま何枚(というか何通りの)のフィルタを適用するか、だけだと思いますが。
仮に、1枚のモノクロ画像を入れたときに、filters=128/kernel_size=3なら、128通りの3x3のフィルタを入力画像に対して適用して、128通りの出力が出る、ということになります。
CNNでは、その出力された128通りの出力を評価して、誤差逆伝播して128枚のフィルタを更新して、最適化された重みを獲得していくので、128通りのフィルタは各々異なった(しかも、各アプリケーションの検出対象の一つの特徴を示した)フィルタになるはずです。

投稿2017/11/09 01:59

diningyo

総合スコア379

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

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

1129

2017/11/09 09:28 編集

それ以前に、strideとkernel_size が決まれば 使用できるフィルターの適用の仕方は限られませんか? そこで、filtersの数を変えたときにどのような意味があると思いますか?
diningyo

2017/11/09 10:07 編集

おっしゃる通り、strideとkernel_sizeが決まれば、”一枚の絵”(とあえて書きますが)へのフィルタの適用の仕方は決まります。 CNNにおける、畳込み演算のfiltersは入力に対して独立したフィルタを何通り適用するかを決めるパラメータです(すなわち、filterの枚数)。 極端なイメージで書きますが、仮に認識したい物体が数字の0から9で10クラスあったとして とした時に、filters=10としてCNNを訓練したとすると filter_0 = 数字の0の特徴を強く反映したフィルタ filter_1 = 数字の1を特徴を強く反映したフィルタ といった形で、各々の独立したフィルタが認識したいカテゴリの何かを強く特徴づけてフィルタになっていきます。 まとめると、適用対象が画像であるとした時、kernel_sizeは画像に対して適用するfilterのpixelサイズ、strideは何pixelおきに、filterを適用するか、filtersはkernel_sizeで指定されるフィルタが何枚存在するか、ということになります。(filtersと書くから紛らわしい。) #他のフレームワークではout_channelsが多い気が。
1129

2017/11/09 10:03 編集

分かりやすい説明ありがとうございます。 それぞれのフィルターが関連づける特徴はランダムな数字ですか?
diningyo

2017/11/09 10:18

訓練開始時にfilter_size * kernel_size * kernel_size 分のパラメータを 初期化します。 Conv2D層の引数```kernel_initializer```に指定をしない限りは一様分布の乱数で初期化されます。 この時点では、特徴も何もないランダムな数字ですが、訓練を行いフィルタ係数を更新していくと、分布に偏りが生まれます(=特徴)。 入力を画像とした際には、入力の最初の層におけるフィルタ係数を2次元データとして画像化すると、「あぁー、確かに特徴捕らえてるな」と思えるようなフィルタ係数になっていたりします。 ネットワークが深くなると、人の目にはもはや何見てるかわからないノイズに見えますが。。 以下のブログエントリでフィルタの可視化した結果を載せてくれていますので、ご興味お有りならご覧になってみてください。 [可視化の例:人工知能に関する断創録](http://aidiary.hatenablog.com/entry/20170216/1487252452)
1129

2017/11/09 11:03

なるほど、ありがとうございます。だから各フィルターは違う特徴を持てるのですね。もう一つ質問させてください。 この例の場合だと、各フィルターは意図的に0-9の特徴を捉えますか? それとも、2つのフィルターが4の特徴を捉えてしまうといった事もありますか?
mkgrei

2017/11/09 11:24

設計している人の願いでフィルタ数を10個にしたりはあるかもしれませんが、学習はただ最適化アルゴリズムのままにされているかと。 試しに11個フィルタがあるとして、うち2つは同じ数字の特徴を捉えている可能性もありますが、2つずつのフィルタの和を取ると1つの数字の特徴を捉えていてもダメということはないはずです。 結局「意図的」の主語が定かでないということです。
diningyo

2017/11/09 11:34

実装者の意図的にという意味では、通常の学習を行う限り各フィルタのパラメータはそうはならないです。 mkgreiさんも書かれていますが、あくまで、訓練用のデータ(画像とラベル(今回だと数字の何という情報))を何百万回と見て、ネットワーク全体として、意図したアプリケーションに最適化を行った結果のフィルタを1枚選んで解析して見たところ、数字の0に最適化されたフィルタ係数になっていた、となります。 そのため学習がうまく行かずに、特定のクラスのみ認識率が上がらなかったパラメータを解析してみたら、実は4に反応するフィルタが2枚あった、ということも起こり得ると思います。(学習データに偏りがあったり、、とか)
1129

2017/11/09 11:36

質問が曖昧ですいません。まだ良く分かっていない事が多いです。 ここで言う「意図的」とは、例えばfilter_sizeと最終的な出力の数をプログラムが比較して、各フィルターを各種類の画像に自動で振り分ける、というような事です(でした)。
1129

2017/11/09 11:43

t_masaさん、mkgreiさん、丁寧な解説ありがとうございます。おかげでかなり理解度が深まった気がします。 mkgreiさん、t_masaさん、そしてoookabeさんのお三方、ありがとうございました。
diningyo

2017/11/09 11:46

一応もう一言だけ。 「意図的に」という言葉に対して書くと、プログラム自身は、数字が10種類だから、フィルタを一つずつに割り当てればいい、、、というような判断は一切しないです。 プログラムが行うのは、ネットワーク最終出力(数字なら10種類のどれかという情報)と実際の答えを比較して、入力された画像N枚の不正解率を下げるということのみです。 そのようにして、より多くの入力画像に対しての正解率を上げていった結果、うまくいったフィルタ係数を摘んで見てみたら、数字の0っぽい形状になっていた、、、と言った具合です。 なので、学習するデータやネットワークの構成によっては、数字の0と8が混ざったようなフィルタも存在していてもおかしくはないです。
guest

0

t_masaさん、1129さん、mkgreiさん
ありがとうございます。
回答は非常に素晴らしかったのです。

ベストアンサーは明確ですね。

ただ、それをつけるの前にどうしても関連質問をさせていただきたいのです。
t_masaさんが提供して下さったリンク:
[可視化の例:人工知能に関する断創録]
(http://aidiary.hatenablog.com/entry/20170216/1487252452)

の中に、最初に出た4行×8列の画像は何の画像でしょうか。
「フィルタの画像」?それとも「フィルタで処理した結果画像」でしょうか?
「フィルタの画像」だと、単にフィルタのサイズ分おフィルタ係数のセットであって、表示してもあまり意味がないでは?

続いて、上記画像の下に赤文字で:
「各フィルタの出力を最大化するような入力画像を生成する手法が提案された。
この「各フィルタの出力を最大化する」は具体にどういう意味でしょうか。

また宜しくお願いします。

投稿2017/11/15 05:10

oookabe

総合スコア126

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

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

diningyo

2017/11/15 15:12 編集

> 4行x8列の画像 これは、学習後のネットワークのとある層のフィルタ係数を画像データで言う輝度値と考えてプロットしたものになります。なので画像の輝度値のみの1次元となるのでモノクロ画像になってます。 すごく大雑把なイメージで言うと、各フィルタに真っ白な画像を入れると、フィルタ画像の白の部分のみがフィルタをパスして出てくるような感じになります(実際には畳み込みが入るので正確ではありません、あくまでイメージとして)。 その動きが、画像の特徴を抽出してることに等しい動作となります。 そのため、入力画像の要素が比較的多く残っている浅いレイヤーにおいては認識するクラス(猫とか犬とか)の輪郭が色濃く出たりします(=人の目で可視化されたフィルタを見ると、ある程度物体がイメージできる感じ) > 「各フィルタの出力を最大化する」は具体にどういう意味でしょうか。 一番わかり易いのはネットワークの出力層なので、それを例にします。 数字10クラスを分類するとすると、ネットワークの出力層は出力が10個で番号をふると、上から順に0, 1, 2 ... 9となります。 通常入力する画像では、画像を一枚入れると、その10個の出力が各々、その数字である確率を示します。 例えば0の画像を入れたら、以下のような出力になる感じです。 0である確率:98% 1である確率:0.00001% 2である確率:0.00001% 3である確率:0.00001% 4である確率:0.00001% 5である確率:0.00001% 6である確率:0.00001% 7である確率:0.00001% 8である確率:1.99990% 9である確率:0.00001% 上記は、「とある数字の画像を入れて、ネットワーク内で複数のフィルタをかけて、最後に確率を出したら0の可能性が98%でした」という順方向の処理になります。 リンク先の記事で述べられている「各フィルタの出力を最大化する」はこの逆で、例として取り上げた最終出力である10出力のうち、0を表す出力の値が1(=100%)となる入力画像はどんなものになるか」を計算するということになります。
oookabe

2017/11/15 16:26 編集

t_masa さん 素晴らしすぎです! それに深夜でこのような非常に明瞭な解説文章を書いてくださいました。 厚く御礼申し上げ ます。
oookabe

2017/11/16 02:29

ただ、少し見て、考えますと、通常,filter size = 3×3 や 5×5 程度のもんで、画像で表現すると一つの点に過ぎないのです。だが、[可視化の例:人工知能に関する断創録] (http://aidiary.hatenablog.com/entry/20170216/1487252452) のあの「filter画像」には豊富な内容が見えますし、中のテクスチャーも滑らかですね。これは縦と横ともに数十pixelの幅でなければ、ならないのです。なので、「filter係数の画像」というより、「実世界の元の画像がfilterによってfiltering処理された結果画像」ではと思います。 原文献にサンプルコードが示されていますが、私にとって自明的ではないコードなので、 「filter係数の画像」の根拠となる具体的なコード文をご指摘いただければ、助かります。
diningyo

2017/11/16 03:24

引用させてもらったブログの文中に別記事へのリンクがあります(http://aidiary.hatenablog.com/entry/20161120/1479640534) その別記事中に「フィルタの可視化」というトピックがあり、その項目に記載されているコードが根拠になりますかね。 具体的に抜粋すると、以下になります。 > W = model.layers[0].get_weights()[0] これはKerasのモデルのlayers[0](要は1番目の層)の重み(=フィルタ係数)を取得していることになり、その後のforループ処理でmatplotlibを使ってこの重みデータを画像化しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問