Deepラーニングのメモです
772 views
コンボリューション層のカーネルサイズを3×3から1×1に変更した(10行目)
# coding:UTF-8
import numpy as np
import torch
import torch.nn as nn
def conv_test_net():
number_net = nn.Sequential(
nn.Conv2d(3, 1, 1, padding=1),
)
return number_net
if __name__ == '__main__':
# 3チャネル 3×3の画像データを1枚作成
virtual_img = [
[
[
[0,0,0],
[0,1,0],
[0,0,0]
],
[
[0,0,0],
[1,0,0],
[0,0,0]
],
[
[0,1,0],
[0,0,0],
[0,0,0]
],
]
]
t = torch.tensor(virtual_img, dtype=torch.float)
net = conv_test_net()
conv = net[0]
print("[weight]")
print(conv.weight)
print("[bias]")
print(conv.bias)
y = net(t)
print(y.size())
print(y)
出力結果は以下。
[weight]
Parameter containing:
tensor([[[[ 0.5352]],
[[-0.0041]],
[[-0.4606]]]], requires_grad=True)
[bias]
Parameter containing:
tensor([0.0567], requires_grad=True)
torch.Size([1, 1, 5, 5])
tensor([[[[ 0.0567, 0.0567, 0.0567, 0.0567, 0.0567],
[ 0.0567, 0.0567, -0.4039, 0.0567, 0.0567],
[ 0.0567, 0.0525, 0.5918, 0.0567, 0.0567],
[ 0.0567, 0.0567, 0.0567, 0.0567, 0.0567],
[ 0.0567, 0.0567, 0.0567, 0.0567, 0.0567]]]],
grad_fn=<MkldnnConvolutionBackward>)
前ページからの計算方法で単純に計算させてみると、以下のようになり、入力データのセルをフィルターの値で合計していることになる。
もしも、フィルターの値がすべて0.333333…だとしたら、画素が均等に足されるため、グレースケールの画像になる。
実際にはconv1×1の層を複数設けた場合、赤色が強めの画像、青色が強めの画像、緑色が強めの画像など、チャンネルを強調した画像が複数生成されることになる。
3×3のフィルターは画像のエッジ検出に使えているのに対して、1×1は色情報を分解するのに役に立っている?
Page 11 of 29.
マッスル
本サイトの作成者。
趣味:プログラム/水耕栽培/仮想通貨/激辛好き
プログラムは趣味と勉強を兼ねて、のんびり本サイトを作っています。
フレームワークはdjango。
仮想通貨はNEMが好き。
水耕栽培は激辛好きが高じて、キャロライナ・リーパーの栽培にチャレンジ中。
https://www.osumoi-stdio.com/pyarticle/