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

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

ただいまの
回答率

90.75%

  • Keras

    165questions

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

解決済

回答 2

投稿

  • 評価
  • クリップ 3
  • VIEW 1,782

oookabe

score 77

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

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/09 18:28 編集

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

    キャンセル

  • 2017/11/09 18:56 編集

    おっしゃる通り、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が多い気が。

    キャンセル

  • 2017/11/09 19:02 編集

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

    キャンセル

  • 2017/11/09 19:18

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

    [可視化の例:人工知能に関する断創録](http://aidiary.hatenablog.com/entry/20170216/1487252452)

    キャンセル

  • 2017/11/09 20:03

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

    キャンセル

  • 2017/11/09 20:24

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

    結局「意図的」の主語が定かでないということです。

    キャンセル

  • 2017/11/09 20:34

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

    キャンセル

  • 2017/11/09 20:36

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

    キャンセル

  • 2017/11/09 20:43

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

    キャンセル

  • 2017/11/09 20:46

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

    キャンセル

0

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

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

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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/16 00:11 編集

    > 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%)となる入力画像はどんなものになるか」を計算するということになります。

    キャンセル

  • 2017/11/16 01:20 編集

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

    キャンセル

  • 2017/11/16 11:29

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

    キャンセル

  • 2017/11/16 12:24

    引用させてもらったブログの文中に別記事へのリンクがあります(http://aidiary.hatenablog.com/entry/20161120/1479640534)
    その別記事中に「フィルタの可視化」というトピックがあり、その項目に記載されているコードが根拠になりますかね。

    具体的に抜粋すると、以下になります。

    > W = model.layers[0].get_weights()[0]

    これはKerasのモデルのlayers[0](要は1番目の層)の重み(=フィルタ係数)を取得していることになり、その後のforループ処理でmatplotlibを使ってこの重みデータを画像化しています。

    キャンセル

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

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

関連した質問

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

  • Keras

    165questions