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

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

ただいまの
回答率

87.37%

im2colのアルゴリズムについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,131

score 79

Numpyを使ったim2colのアルゴリズムで分からない部分があります。
以下のコードで、
col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
という行があるのですが、これが具体的にどんな処理を行っているのか、そしてVisual Basicや、JavaScriptのFor loopで書くとどんなコードになるのか知りたいです。宜しくお願い致します。

引用
リンク内容

import numpy as np

def im2col(input_data, filter_h, filter_w, stride=1, pad=0):
    N, C, H, W = input_data.shape
    out_h = (H + 2*pad - filter_h)//stride + 1
    out_w = (W + 2*pad - filter_w)//stride + 1

    img = np.pad(input_data, [(0,0), (0,0), (pad, pad), (pad, pad)], 'constant')
    col = np.zeros((N, C, filter_h, filter_w, out_h, out_w))

    for y in range(filter_h):
        y_max = y + stride*out_h
        for x in range(filter_w):
            x_max = x + stride*out_w

            # この行をFor Loopで実装したい
            col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]


    print("Result 1 --------------------------------")
    print(col)

    col = col.transpose(0, 4, 5, 1, 2, 3)
    print("Result 2 --------------------------------")
    print(col)

    col = col.reshape(N*out_h*out_w, -1)
    print("Result 3 --------------------------------")
    print(col)

    #return col

x= [
    [1,2,3,4],
    [5,6,7,8],
    [9,10,11,12],
    [13,14,15,16]
    ]
x= np.array([[x]])

im2col(x,3,3,stride=1,pad=0)

実行結果

Result 1 --------------------------------
[[[[[[  1.   2.]
     [  5.   6.]]

    [[  2.   3.]
     [  6.   7.]]

    [[  3.   4.]
     [  7.   8.]]]


   [[[  5.   6.]
     [  9.  10.]]

    [[  6.   7.]
     [ 10.  11.]]

    [[  7.   8.]
     [ 11.  12.]]]


   [[[  9.  10.]
     [ 13.  14.]]

    [[ 10.  11.]
     [ 14.  15.]]

    [[ 11.  12.]
     [ 15.  16.]]]]]]
Result 2 --------------------------------
[[[[[[  1.   2.   3.]
     [  5.   6.   7.]
     [  9.  10.  11.]]]


   [[[  2.   3.   4.]
     [  6.   7.   8.]
     [ 10.  11.  12.]]]]



  [[[[  5.   6.   7.]
     [  9.  10.  11.]
     [ 13.  14.  15.]]]


   [[[  6.   7.   8.]
     [ 10.  11.  12.]
     [ 14.  15.  16.]]]]]]
Result 3 --------------------------------
[[  1.   2.   3.   5.   6.   7.   9.  10.  11.]
 [  2.   3.   4.   6.   7.   8.  10.  11.  12.]
 [  5.   6.   7.   9.  10.  11.  13.  14.  15.]
 [  6.   7.   8.  10.  11.  12.  14.  15.  16.]]
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • meg_

    2019/09/28 17:29

    掲載のコードはご自身で書かれたものではないということですか?
    引用元は何でしょうか?

    キャンセル

  • teefpc

    2019/09/28 20:18

    はい。ゼロから作るDeep Learning のサンプルコードです。
    https://github.com/oreilly-japan/deep-learning-from-scratch/blob/master/common/util.py

    キャンセル

回答 1

checkベストアンサー

+1

NumPy配列のスライス表現については下記サイトが参考になるかと思います。

NumPy配列ndarrayのスライスによる部分配列の選択と代入

「y:y_max:stride」なら、yからy_max-1までの間でstride毎の値 となります。
「:」は全部を表します。

colの対象の各次元に対してループ処理をすれば良いでしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/09/28 21:31

    ありがとうございました。

    キャンセル

  • 2019/09/28 22:16

    col[:, :, y, x, :, :] = img[:, :, y:y_max:stride, x:x_max:stride]
    の部分についてですが、左辺と右辺の次元が合っていませんが、これはどのように実装すべきでしょうか。

    キャンセル

  • 2019/09/28 22:39

    numpyのブロードキャストかと思われます。具体的な数値についてはデバッグして確かめるか、書籍に解説がないか確認してみてください。
    参考サイト[DeepAge]:https://deepage.net/features/numpy-broadcasting.html

    キャンセル

  • 2019/09/28 22:54

    ありがとうございました。

    キャンセル

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

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

関連した質問

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