回答編集履歴

2

reshape() がバッチを考慮していなかったので修正

2018/09/10 05:04

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -180,13 +180,13 @@
180
180
 
181
181
  """
182
182
 
183
- t1 = K.tile(K.reshape(x[0], (1, 10, 10, 1, 1)), (1, 1, 1, 5, 1))
183
+ t1 = K.tile(K.reshape(x[0], (-1, 10, 10, 1, 1)), (1, 1, 1, 5, 1))
184
184
 
185
185
 
186
186
 
187
187
  t2 = K.reverse(x[1], axes=2)
188
188
 
189
- t2 = K.tile(K.reshape(t2, (1, 10, 1, 5, 1)), (1, 1, 10, 1, 1))
189
+ t2 = K.tile(K.reshape(t2, (-1, 10, 1, 5, 1)), (1, 1, 10, 1, 1))
190
190
 
191
191
 
192
192
 

1

実現したい処理を Keras で実行する方法を追記

2018/09/10 05:04

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -4,7 +4,7 @@
4
4
 
5
5
 
6
6
 
7
- ```
7
+ ```python
8
8
 
9
9
  import numpy as np
10
10
 
@@ -39,3 +39,185 @@
39
39
 
40
40
 
41
41
  ```
42
+
43
+
44
+
45
+ ----
46
+
47
+
48
+
49
+ 追記
50
+
51
+
52
+
53
+ ### 処理したい内容
54
+
55
+
56
+
57
+ ```python
58
+
59
+ data = np.empty((10, 10, 5, 1))
60
+
61
+ for i in range(10):
62
+
63
+ for j in range(10):
64
+
65
+ for k in range(5):
66
+
67
+ data[i, j, k] = a[i, j] + b[i, 4 - k]
68
+
69
+ ```
70
+
71
+
72
+
73
+ ### numpy の API を利用した書き方
74
+
75
+
76
+
77
+ ```python
78
+
79
+ import numpy as np
80
+
81
+
82
+
83
+ # 入力を作成する。
84
+
85
+ ###########################################
86
+
87
+ # Tensorflow では、値の型はデフォルトで float32 で扱われるのでそれに合わせる。
88
+
89
+ a = np.random.randn(10, 10, 1).astype(np.float32)
90
+
91
+ b = np.random.randn(10, 5, 1).astype(np.float32)
92
+
93
+
94
+
95
+ # for style
96
+
97
+ ###########################################
98
+
99
+ A1 = np.empty((10, 10, 5, 1))
100
+
101
+ B1 = np.empty((10, 10, 5, 1))
102
+
103
+ data1 = np.empty((10, 10, 5, 1))
104
+
105
+ for i in range(10):
106
+
107
+ for j in range(10):
108
+
109
+ for k in range(5):
110
+
111
+ A1[i, j, k] = a[i, j]
112
+
113
+ B1[i, j, k] = b[i, 4 - k]
114
+
115
+ data1[i, j, k] = a[i, j] + b[i, 4 - k]
116
+
117
+
118
+
119
+ # numpy style
120
+
121
+ ###########################################
122
+
123
+ A2 = np.tile(a.reshape(10, 10, 1, 1), (1, 1, 5, 1))
124
+
125
+ B2 = np.tile(np.flip(b, axis=1).reshape(10, 1, 5, 1), (1, 10, 1, 1))
126
+
127
+ data2 = A2 + B2
128
+
129
+
130
+
131
+ # for style と numpy style が一致するかどうか
132
+
133
+ print(np.all(np.isclose(A1, A2))) # True
134
+
135
+ print(np.all(np.isclose(B1, B2))) # True
136
+
137
+ print(np.all(np.isclose(data1, data2))) # True
138
+
139
+ ```
140
+
141
+
142
+
143
+ `a[i, j]` は `k in range(5)` 中は同じ値になるので、`np.tile()` で axis=3 を 5 回繰り返す。
144
+
145
+ `b[i, 4 - k]` は、(10, 5, 1) の numpy 配列を axis=1 で反転させ、`j in range(10)` 中は同じ値になるので、`np.tile()` で axis=2 を 10 回繰り返す。
146
+
147
+
148
+
149
+ ### Keras Backedn API を利用した書き方
150
+
151
+
152
+
153
+ ```python
154
+
155
+ import tensorflow as tf
156
+
157
+ from keras.models import Model
158
+
159
+ from keras.layers import Input, Lambda
160
+
161
+ from keras import backend as K
162
+
163
+
164
+
165
+ # numpy の関数を Keras Backend API で置き換えた
166
+
167
+ # バッチの次元が1つ増えていることに注意。
168
+
169
+ def process(x):
170
+
171
+ """Args:
172
+
173
+ x: [(None, 10, 10, 1) のテンソル、(None, 10, 5, 1) のテンソル]
174
+
175
+
176
+
177
+ Returns:
178
+
179
+ (None, 10, 10, 5, 1) のテンソル
180
+
181
+ """
182
+
183
+ t1 = K.tile(K.reshape(x[0], (1, 10, 10, 1, 1)), (1, 1, 1, 5, 1))
184
+
185
+
186
+
187
+ t2 = K.reverse(x[1], axes=2)
188
+
189
+ t2 = K.tile(K.reshape(t2, (1, 10, 1, 5, 1)), (1, 1, 10, 1, 1))
190
+
191
+
192
+
193
+ return t1 + t2
194
+
195
+
196
+
197
+ # モデルを作成する。
198
+
199
+ input_a = Input(shape=(10, 10, 1))
200
+
201
+ input_b = Input(shape=(10, 5, 1))
202
+
203
+ outputs = Lambda(process)([input_a, input_b])
204
+
205
+ model = Model(inputs=[input_a, input_b], outputs=outputs)
206
+
207
+
208
+
209
+ # a, b はバッチの次元を追加する。順伝搬して結果を計算する。
210
+
211
+ data3 = model.predict([a[np.newaxis, ...], b[np.newaxis, ...]])
212
+
213
+
214
+
215
+ # numpy で計算した値と一致するかどうか
216
+
217
+ print(np.all(np.isclose(data1, data3))) # True
218
+
219
+ ```
220
+
221
+
222
+
223
+ numpy の API でできることは Keras Backend API または Tensorflow の API でできるかと思います。