kerasにおけるpaddingはconv操作の前に実行されますか?それともconv操作後に実行されますか?
畳み込みの前です。
stride(224, 224)のconv層の入力のfilterは大サイズ画像を8*8ブロック分割の枚数分の数(つまり64)であっていますでしょうか。それとも扱う画像が3チャネルのカラー画像なのでさらにfilter数は3倍必要ですか?
カラー画像であれば、64 * 3 必要です。
元画像を 8x8 のセルに分割したとした場合、
[1セル目のRGB|2セル目のRGB|3セル目のRGB|...]
kerasでpointwise(1*1conv)を実装する方法を教えてください。
1x1 畳み込みでしたら、Conv2D のフィルターサイズを (1, 1) にするだけでできます。
追記
大きな画像を分割して畳み込んだ場合に、元の画像に対して畳み込んだ場合と同じ結果を得るには、
- ゼロパディングする。
- パディング分重複するように分割する。
- 分割した各画像に対して畳み込みを行う。
これで大きい画像に対して、畳み込みだ場合と同じ結果が得られるはずです。
以下は分割するところまで示してあります。
import numpy as np
from numpy.lib.stride_tricks import as_strided
# 入力画像
x = np.arange(30000).reshape(100, 100, 3)
# フィルター画像
kernel_h, kernel_w = 3, 3
kernel = np.random.randn(kernel_h, kernel_w, 3)
# 1. zero padding する。
x_padded = np.pad(x, [(1,), (1,), (0,)], mode='constant', constant_values=0)
print('x_padded.shape', x_padded.shape) # x_padded.shape (102, 102, 3)
#print(x_padded[:, :, 0])
# 2. 入力を分割する。
h, w, c = x.shape # 入力画像の形状 (100, 100, 3)
split_h, split_w = 10, 10 # 分割数
cell_h = h // split_h # 分割した画像の高さ 10
cell_w = w // split_w # 分割した画像の幅 10
out_h = cell_h + np.ceil(kernel_h / 2).astype(int) # 10 + 2
out_w = cell_w + np.ceil(kernel_w / 2).astype(int) # 10 + 2
offset_h, offset_w, offset_c = x_padded.strides
print(offset_h, offset_w, offset_c) # 2448 24 8
stride_h = out_h - 1
stride_w = out_w - 1
x_grid = as_strided(x_padded,
(split_h, split_w, out_h, out_w, 3),
(offset_h * stride_h, offset_w * stride_w,
offset_h, offset_w, offset_c))
print(x_grid.shape) # (10, 10, 12, 12, 3)
実際大きい画像はどう扱かう場合が多いか
GPU メモリが大量に使える環境ならモデルの入力サイズを大きくして、流してもいいですが、そうでないなら大きくとも 512x512 ぐらいまでリサイズもしくは分割し、チャンネル方向で結合して流したほうがよさそうです。
分割した場合、パディングにより大きい画像のまま流した場合と微妙に計算結果が違ってきますが、あまり気にしなくてもいいと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/09/28 11:37
2018/09/28 11:52
2018/09/28 11:53
退会済みユーザー
2018/09/28 12:04
2018/09/28 17:01
退会済みユーザー
2018/10/02 03:54
2018/10/02 17:56