Kerasのバックエンドの使い方

  • 勾配情報を取得したり、特定のレイヤの出力を得たい場合など、色々な場面でKerasプログラムの中でTensorflowレイヤの操作をしたいことが出てくる。そんな時に使うのがバックエンド。
  • 多くはドキュメント見れば良いが、良く分からないAPI(functionとか)もあるのでメモを残しておく。

インポート

  • バックエンドを使う場合は下記をインポートする。
from keras import backend as K

基本

  • variableやplaceholderなどを定義できる。値を見る場合はget_value、足し算や引き算なども可能。
x = K.variable(np.random.rand(2,2))
y = K.variable(np.random.rand(2,2))
K.get_value(x)
K.get_value(y)
K.get_value(x+y)

function(inputs, outputs)

  • これがはじめ良くわからなかった。
  • まずは引数をしっかり理解する。inputsはplaceholderのリスト、outputsはテンソルのリスト。どっちもリストな点に注意。
  • functionはプレスホルダーinputsを入力として、outputsを計算する関数を返してくれる。outputsは当然何かしらのテンソル計算。もし、引数を取らない場合は空リストを与えれば良い。
  • 呼び出す(call)する場合は、何かプレースホルダに与えて呼び出すだけ。ただし、ここで注意!!Keras(というかTF)のInputsは0次元目がサンプルサイズになっているようなので、バッチデータじゃなくて単一のデータを渡す場合には、expand_dimsとかで次元を増やすことが必要。
in1 = Input(shape=(2, 2))
x = K.variable(np.random.rand(2,2))
y = K.variable(np.random.rand(2,2))
out1 = in1 + x
out2 = in1 + y

# Define function
fn = K.function([in1], [out1, out2])

# Call the defined function
o1, o2 = fn([np.expand_dims(np.random.rand(2, 2), 0)])