質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

3008閲覧

kerasで途中で計算処理をしたい場合について

unramapomg

総合スコア14

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/09/09 09:40

現在tensorflowをバックエンドとしたkerasを用いてネットワークを組んでいます。

簡単な処理はkerasのlayers.core.Lambdaと、Keras backendsで行っています。

しかし、Keras backendsだけでは行いない処理がしたいです。

こういった場合の対処方を教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
tiitoi

総合スコア21954

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unramapomg

2018/09/10 02:01

回答ありがとうございます。 Lambda内でそのようなことができることは知っています。 ただ、APIではできない処理があって困っています。 どうかよろしくおねがいします。
tiitoi

2018/09/10 03:08

具体的には、どのような処理でしょうか?
unramapomg

2018/09/10 03:36 編集

(none, 10, 10, 1)の形のテンソルと、(None, 10, 5, 1)の形のテンソルを入力として受け取ります。 したい処理を明確にするために、aを(10, 10, 1)、bを(10, 5, 1)の形のnumpyと仮定して以降計算します。 data = np.arange(500).reshape(10, 10, 5, 1) for k in range(5):  for j in range(10):   for i in range(10):    data[k, j, i]= (a[j,i] + b[j,4-k]) と言う処理をしたいです。 最終的には、(None, 10, 10 ,5, 1)というテンソルを出力したいです。 よろしくお願いします。
tiitoi

2018/09/10 05:00

data.shape=(None, 10, 10 ,5, 1) と辻褄が合わないので、`data[k, j, i]` は、data[j, i, k] の間違いでしょうか? そうだとした場合の解法を追記しましたので、もし意図と違う場合は教えてください。
unramapomg

2018/09/10 06:12

指摘いただいた通り、間違えていました。 そして、解答ありがとうございます。 現在自分で実行し確認してみます。 本当に感謝しています。
unramapomg

2018/09/10 09:10

動作確認できました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問