私のネットワークには2つの時系列入力があります。入力の1つには、タイムステップごとに繰り返される固定ベクトルがあります。この固定ベクトルをモデルに一度だけロードして計算に使用するエレガントな方法はありますか?
Jdehesaで説明されているように、テンソル引数を使用して静的入力を作成できますが、テンソルはKeras(テンソルフローではない)変数である必要があります。これは次のように作成できます。
from keras.layers import Input
from keras import backend as K
constants = [1,2,3]
k_constants = K.variable(constants)
fixed_input = Input(tensor=k_constants)
編集:どうやら以下の答えは(今日ではとにかく)うまくいきません。関連する回答については、 Kerasで定数値を作成する を参照してください。
ソース (ドキュメントで参照を見つけることができませんでした)を見ると、Input
を使用して定数Theano/TensorFlowテンソルを渡すことができるようです。
from keras.layers import Input
import tensorflow as tf
fixed_input = Input(tensor=tf.constant([1, 2, 3, 4]))
これはテンソルを「ラップ」し(実際にはメタデータでテンソルを「拡張」するように)、任意のKerasレイヤーで使用できます。
追加するもの:モデルをコンパイルするときは、定数入力を入力として指定する必要があります。そうしないと、グラフが切断されます。
#your input
inputs = Input(shape = (input_shape,))
# an array of ones
constants = [1] * input_shape
# make the array a variable
k_constants = K.variable(constants, name = "ones_variable")
# make the variable a tensor
ones_tensor = Input(tensor=k_constants, name = "ones_tensor")
# do some layers
inputs = (Some_Layers())(inputs)
# get the complementary of the outputs
output = Subtract()([ones_tensor,inputs])
model = Model([inputs, ones_tensor],output)
model.complie(some_params)
トレーニングするときは、持っているデータをフィードするだけでよく、定数レイヤーはもう必要ありません。
何を試しても、通常はカスタムレイヤーを使用してnumpyの機能を利用する方が簡単であることがわかりました。
class Complementry(Layer):
def __init__(self, **kwargs):
super(Complementry, self).__init__(**kwargs)
def build(self, input_shape):
super(Complementry, self).build(input_shape) # Be sure to call this at the end
def call(self, x):
return 1-x # here use MyArray + x