2017-03-26 11 views
0

私はKerasで事前に訓練されたモデルを持っています。既に訓練されたモデルに対してモデルの出力が入力され、既に訓練されたモデルの出力が訓練されていないモデルの損失関数に使用されている別のモデルを訓練したい。トレーニング済みのモデルを使用してモデルをトレーニング

in_a + mod_b(some kind of feedback from B here) --> Model A --> out_a --> Model B --> out_b 

error = (in_a - out_b)**2 

ような何かして、モデルA. in_aを訓練するために、このエラーを使用して、このシステムでは定数として扱うことができ、フィードバックループが同様に存在し

任意のアイデアkerasでこれを行う方法またはテンソルフロー

+0

「モデルA」と一緒に、あらかじめ訓練されたモデルである「モデルB」も訓練しますか?いずれにせよ、「モデルB」の損失からの勾配は、「モデルB」および「モデルA」に流れる必要がある。そのため、 'Model B'の設定をそのままにして、その入力を' Model A'の出力として設定するだけです。 – vega

+0

いいえいいえモデルBを訓練したくありません – arrhhh

+0

テンソルフローを使用する場合は、https://www.tensorflow.org/tutorials/image_retraining – Jack

答えて

0

ここにアイデアがあります。モデルAを出力レイヤーまで構築します。出力レイヤーはモデルBの入力レイヤーと互換性があると仮定します。また、あなたはあなたがpretrained重みを持つモデルをロードしますモデルB.としてpretrained VGG16を使用していると仮定しましょう:

from keras.applications.vgg16 import VGG16 

# Model A is trainable 
x = Input(shape=(32,)) 
x_d = Dense(10)(x) 
model_a_out = Dense(10)(x_d) 

# Model B 
model_b = VGG16(weights='imagenet', include_top=True) 
# Freeze Model B 
for layer in model_b.layers: 
    layer.trainable = False 

# Set input to Model B as output from A 
model_b.input = model_a_out 

# Train as usual 
model_b.compile... and model_b.fit ... 

それを行うための別の方法は、あなたが、その後A.とを構築したい最初のものである:

for layer in model_b.layers: 
    new_layer = layer 
    new_layer.trainable = False 
    model_a.add(new_layer) 

いくつかのアイデアについては、Keras Applicationsのページをご覧ください。

+0

を参照してください。方法1の場合、モデルAの損失関数はモデルBの出力です。どのように事前に構築されたものもそうするように指定します。質問でエラーを計算するために自分自身の損失関数を指定すると、どの値が渡されるのでしょうか。私はout_bの値を渡したいと思いますが、モデルAはout_aを損失関数に渡します – arrhhh

+0

メソッド2では、モデルBをモデルAに追加し、訓練可能な値をfalseに設定すると、フィードバック事象out_a +を行うことができません(いくつかの追加) model_Bに入力します。いくつかの種類のカスタムレイヤー(out_a +いくつかの追加がいくつかの種類のスタックからいくつかの追加ポイントを追加しています)が動作するかもしれません – arrhhh

+0

私はそれがkerasで機能的なAPIを使用して行うことができると思います – arrhhh

関連する問題