web-dev-qa-db-ja.com

ケラスに一定の入力を与える方法

私のネットワークには2つの時系列入力があります。入力の1つには、タイムステップごとに繰り返される固定ベクトルがあります。この固定ベクトルをモデルに一度だけロードして計算に使用するエレガントな方法はありますか?

9
Yakku

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)
7

編集:どうやら以下の答えは(今日ではとにかく)うまくいきません。関連する回答については、 Kerasで定数値を作成する を参照してください。


ソース (ドキュメントで参照を見つけることができませんでした)を見ると、Inputを使用して定数Theano/TensorFlowテンソルを渡すことができるようです。

from keras.layers import Input
import tensorflow as tf

fixed_input = Input(tensor=tf.constant([1, 2, 3, 4]))

これはテンソルを「ラップ」し(実際にはメタデータでテンソルを「拡張」するように)、任意のKerasレイヤーで使用できます。

2
jdehesa

追加するもの:モデルをコンパイルするときは、定数入力を入力として指定する必要があります。そうしないと、グラフが切断されます。

#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
1
Andrew Louw