現在tensorflowをバックエンドとしたkerasを用いてネットワークを組んでいます。
簡単な処理はkerasのlayers.core.Lambdaと、Keras backendsで行っています。
しかし、Keras backendsだけでは行いない処理がしたいです。
こういった場合の対処方を教えてください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答1件
0
ベストアンサー
Keras の Lambda 内で Keras backend API の他、tensorflow の API が利用できます。
python
1import numpy as np 2import tensorflow as tf 3from keras.models import Model 4from keras.layers import Lambda 5 6inputs = Input(shape=(10,)) 7# 平均を計算する自作レイヤー 8outputs = Lambda(lambda x: tf.reduce_sum(x))(inputs) 9model = Model(inputs=inputs, outputs=outputs) 10 11x = np.arange(1, 11) 12x = np.expand_dims(x, axis=0) # バッチの次元追加 13print(x.shape) # (1, 10) 14 15print(model.predict(x)) # [55.] 16
追記
処理したい内容
python
1data = np.empty((10, 10, 5, 1)) 2for i in range(10): 3 for j in range(10): 4 for k in range(5): 5 data[i, j, k] = a[i, j] + b[i, 4 - k]
numpy の API を利用した書き方
python
1import numpy as np 2 3# 入力を作成する。 4########################################### 5# Tensorflow では、値の型はデフォルトで float32 で扱われるのでそれに合わせる。 6a = np.random.randn(10, 10, 1).astype(np.float32) 7b = np.random.randn(10, 5, 1).astype(np.float32) 8 9# for style 10########################################### 11A1 = np.empty((10, 10, 5, 1)) 12B1 = np.empty((10, 10, 5, 1)) 13data1 = np.empty((10, 10, 5, 1)) 14for i in range(10): 15 for j in range(10): 16 for k in range(5): 17 A1[i, j, k] = a[i, j] 18 B1[i, j, k] = b[i, 4 - k] 19 data1[i, j, k] = a[i, j] + b[i, 4 - k] 20 21# numpy style 22########################################### 23A2 = np.tile(a.reshape(10, 10, 1, 1), (1, 1, 5, 1)) 24B2 = np.tile(np.flip(b, axis=1).reshape(10, 1, 5, 1), (1, 10, 1, 1)) 25data2 = A2 + B2 26 27# for style と numpy style が一致するかどうか 28print(np.all(np.isclose(A1, A2))) # True 29print(np.all(np.isclose(B1, B2))) # True 30print(np.all(np.isclose(data1, data2))) # True
a[i, j]
は k in range(5)
中は同じ値になるので、np.tile()
で axis=3 を 5 回繰り返す。
b[i, 4 - k]
は、(10, 5, 1) の numpy 配列を axis=1 で反転させ、j in range(10)
中は同じ値になるので、np.tile()
で axis=2 を 10 回繰り返す。
Keras Backedn API を利用した書き方
python
1import tensorflow as tf 2from keras.models import Model 3from keras.layers import Input, Lambda 4from keras import backend as K 5 6# numpy の関数を Keras Backend API で置き換えた 7# バッチの次元が1つ増えていることに注意。 8def process(x): 9 """Args: 10 x: [(None, 10, 10, 1) のテンソル、(None, 10, 5, 1) のテンソル] 11 12 Returns: 13 (None, 10, 10, 5, 1) のテンソル 14 """ 15 t1 = K.tile(K.reshape(x[0], (-1, 10, 10, 1, 1)), (1, 1, 1, 5, 1)) 16 17 t2 = K.reverse(x[1], axes=2) 18 t2 = K.tile(K.reshape(t2, (-1, 10, 1, 5, 1)), (1, 1, 10, 1, 1)) 19 20 return t1 + t2 21 22# モデルを作成する。 23input_a = Input(shape=(10, 10, 1)) 24input_b = Input(shape=(10, 5, 1)) 25outputs = Lambda(process)([input_a, input_b]) 26model = Model(inputs=[input_a, input_b], outputs=outputs) 27 28# a, b はバッチの次元を追加する。順伝搬して結果を計算する。 29data3 = model.predict([a[np.newaxis, ...], b[np.newaxis, ...]]) 30 31# numpy で計算した値と一致するかどうか 32print(np.all(np.isclose(data1, data3))) # True
numpy の API でできることは Keras Backend API または Tensorflow の API でできるかと思います。
投稿2018/09/09 14:44
編集2018/09/10 05:04総合スコア21954
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/10 02:01
2018/09/10 03:08
2018/09/10 03:36 編集
2018/09/10 05:00
2018/09/10 06:12
2018/09/10 09:10