回答編集履歴

2

2018/09/28 17:00

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -136,14 +136,8 @@
136
136
 
137
137
 
138
138
 
139
- * リサイズする。
140
-
141
- * 分割してミニバッして流す。
139
+ GPU メモリが大量に使える環境ならモデルの入力サイズを大きくして、流してもいいですが、そうでないなら大きくとも 512x512 ぐらいまでリサイズもしくは分割しャンネル方向で結合して流したほうがよさそうです。
142
140
 
143
141
 
144
142
 
145
- GPU メモリが大量に使える環境ならモデルの入力サイズを大きくして、流してもいいですが、そうでないなら大きくとも 512x512 ぐらいまでリサイズもしくは分割して流したほうがよさそうです。
146
-
147
-
148
-
149
- 分割して流した場合、パディングにより大きい画像のまま流した場合と微妙に計算結果が違ってきますが、あまり気にしなくてもいいと思います。
143
+ 分割した場合、パディングにより大きい画像のまま流した場合と微妙に計算結果が違ってきますが、あまり気にしなくてもいいと思います。

1

a

2018/09/28 17:00

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -35,3 +35,115 @@
35
35
 
36
36
 
37
37
  1x1 畳み込みでしたら、Conv2D のフィルターサイズを (1, 1) にするだけでできます。
38
+
39
+
40
+
41
+ ## 追記
42
+
43
+
44
+
45
+ 大きな画像を分割して畳み込んだ場合に、元の画像に対して畳み込んだ場合と同じ結果を得るには、
46
+
47
+
48
+
49
+ 1. ゼロパディングする。
50
+
51
+ 2. パディング分重複するように分割する。
52
+
53
+ 3. 分割した各画像に対して畳み込みを行う。
54
+
55
+
56
+
57
+ これで大きい画像に対して、畳み込みだ場合と同じ結果が得られるはずです。
58
+
59
+ 以下は分割するところまで示してあります。
60
+
61
+
62
+
63
+ ```
64
+
65
+ import numpy as np
66
+
67
+ from numpy.lib.stride_tricks import as_strided
68
+
69
+
70
+
71
+ # 入力画像
72
+
73
+ x = np.arange(30000).reshape(100, 100, 3)
74
+
75
+
76
+
77
+ # フィルター画像
78
+
79
+ kernel_h, kernel_w = 3, 3
80
+
81
+ kernel = np.random.randn(kernel_h, kernel_w, 3)
82
+
83
+
84
+
85
+ # 1. zero padding する。
86
+
87
+ x_padded = np.pad(x, [(1,), (1,), (0,)], mode='constant', constant_values=0)
88
+
89
+ print('x_padded.shape', x_padded.shape) # x_padded.shape (102, 102, 3)
90
+
91
+ #print(x_padded[:, :, 0])
92
+
93
+
94
+
95
+ # 2. 入力を分割する。
96
+
97
+ h, w, c = x.shape # 入力画像の形状 (100, 100, 3)
98
+
99
+ split_h, split_w = 10, 10 # 分割数
100
+
101
+ cell_h = h // split_h # 分割した画像の高さ 10
102
+
103
+ cell_w = w // split_w # 分割した画像の幅 10
104
+
105
+
106
+
107
+ out_h = cell_h + np.ceil(kernel_h / 2).astype(int) # 10 + 2
108
+
109
+ out_w = cell_w + np.ceil(kernel_w / 2).astype(int) # 10 + 2
110
+
111
+
112
+
113
+ offset_h, offset_w, offset_c = x_padded.strides
114
+
115
+ print(offset_h, offset_w, offset_c) # 2448 24 8
116
+
117
+ stride_h = out_h - 1
118
+
119
+ stride_w = out_w - 1
120
+
121
+ x_grid = as_strided(x_padded,
122
+
123
+ (split_h, split_w, out_h, out_w, 3),
124
+
125
+ (offset_h * stride_h, offset_w * stride_w,
126
+
127
+ offset_h, offset_w, offset_c))
128
+
129
+ print(x_grid.shape) # (10, 10, 12, 12, 3)
130
+
131
+ ```
132
+
133
+
134
+
135
+ ## 実際大きい画像はどう扱かう場合が多いか
136
+
137
+
138
+
139
+ * リサイズする。
140
+
141
+ * 分割してミニバッチにして流す。
142
+
143
+
144
+
145
+ GPU メモリが大量に使える環境ならモデルの入力サイズを大きくして、流してもいいですが、そうでないなら大きくとも 512x512 ぐらいまでリサイズもしくは分割して流したほうがよさそうです。
146
+
147
+
148
+
149
+ 分割して流した場合、パディングにより大きい画像のまま流した場合と微妙に計算結果が違ってきますが、あまり気にしなくてもいいと思います。