1

私は自律型ヘリコプター用の強化学習エージェントを構築しています。私は純粋なイメージ(オリエンテーション、私の位置以外にも、私のモデルにいくつかの追加の値を渡す必要があり、適切に学ぶためにイメージでケラスモデルを訓練し、値を入力とする方法は?混合入力

image_model = Sequential() 
image_model.add(Convolution2D(32, 8, 8, subsample=(4, 4), input_shape=(1, 120, 215))) 
image_model.add(Activation('relu')) 
image_model.add(Convolution2D(64, 4, 4, subsample=(2, 2))) 
image_model.add(Activation('relu')) 
image_model.add(Convolution2D(64, 3, 3, subsample=(1, 1))) 
image_model.add(Activation('relu')) 
image_model.add(Flatten()) 
image_model.add(Dense(512)) 
image_model.add(Activation('relu')) 
image_model.add(Dense(nb_actions)) 
image_model.add(Activation('linear')) 

:純粋な画像入力のための私のKeras(1.0.7)モデルは次のようになりますヘリコプターなど)。私は、1つの出力レイヤーまたは複数の出力レイヤーをもたらすネットワークアーキテクチャーのストリームにしなければならないと思います。

image_model = Sequential() 
image_model.add(Convolution2D(32, 8, 8, subsample=(4, 4), input_shape=input_shape)) 
image_model.add(Activation('relu')) 
image_model.add(Convolution2D(64, 4, 4, subsample=(2, 2))) 
image_model.add(Activation('relu')) 
image_model.add(Convolution2D(64, 3, 3, subsample=(1, 1))) 
image_model.add(Activation('relu')) 
image_model.add(Flatten()) 
image_model.add(Dense(512)) 
image_model.add(Activation('relu')) 


value_model = Sequential() 
value_model.add(Flatten(input_shape=values)) 
value_model.add(Dense(16)) 
value_model.add(Activation('relu')) 
value_model.add(Dense(16)) 
value_model.add(Activation('relu')) 
value_model.add(Dense(16)) 
value_model.add(Activation('relu')) 



model = Sequential() 

#merge together somehow 

model.add(Dense(nb_actions)) 
model.add(Activation('linear')) 

マージAPI of Kerasは、わかっていればイメージとイメージをマージするためのものです。これらの異なるタイプのインプットをどのように集めるのですか?

編集:私のやりたいことに私の試み。私は1つのイメージと1つの別個の値で、各タイムステップでエージェントを訓練したい。私はコンバートネットワークストリームの画像と別の値を一緒に渡すべきではないと思うので、値の第2ストリームを持って、最後に画像と値のネットワークをまとめたいと思っています。

INPUT_SHAPE = (119, 214) 
WINDOW_LENGTH = 1 

img_input = (WINDOW_LENGTH,) + INPUT_SHAPE 

img = Convolution2D(32, 8, 8, subsample=(4, 4), activation='relu', input_shape=img_input) 
img = Convolution2D(64, 4, 4, subsample=(2, 2), activation='relu', input_shape=img) 
img = Convolution2D(64, 3, 3, subsample=(1, 1), activation='relu', input_shape=img) 
img = Flatten(input_shape=img) 
img = Dense(512, activation='relu', input_shape=img) 


value_input = (1,2) 
value = Flatten()(value_input) 
value = Dense(16, activation='relu')(value) 
value = Dense(16, activation='relu')(value) 
value = Dense(16, activation='relu')(value) 

actions = Dense(nb_actions, activation='linear')(img)(value) 


model = Model([img_input, value_input], [actions]) 

どちらかimg = Convolution2D(32, 8, 8, subsample=(4, 4), activation='relu', input_shape=img_input)またはimg = Convolution2D(32, 8, 8, subsample=(4, 4), activation='relu')(img_input) スタイルは動作しません。

また、私はあなたがいないシーケンシャルなく、ModelクラスのAPIを使用する必要がありますことを行うためにはactions = Dense(nb_actions, activation='linear')(img)(value)

答えて

0

で一緒に流れを持ってする方法がわかりません。

ないあなたはここで達成しようとしているのかわから、私は次のコードを願ってあなたを助ける

inp = Input((1, 120, 215)) 
x = Convolution2D(32, 8, 8, subsample=(4, 4), activation='relu')(inp) 
x = Convolution2D(64, 4, 4, subsample=(2, 2), activation='relu')(x) 
x = Convolution2D(64, 3, 3, subsample=(1, 1), activation='relu')(x) 
x = Flatten()(x) 
x = Dense(512, activation='relu')(x) 

x_a = Dense(nb_actions, name='a', activation='linear')(x) 
x_b = Dense(nb_classes, activation='softmax', name='b')(x) 

model = Model([inp], [x_a, x_b]) 
model.compile(Adam(lr=0.001), loss=['mse', 'categorical_crossentropy'], metrics=['accuracy'], 
     loss_weights=[.0001, 1.]) #adjust loss-Weights 
model.fit(train_feat, [train_labels_a, train_labels_b], batch_size=batch_size, nb_epoch=3, 
     validation_data=(val_feat, [val_labels_a, val_labels_b])) 

EDIT あなたが2つの入力モデルと1つの出力が必要な場合は、これを試してみてください。

from keras.models import Sequential 
from keras.layers import Dense, Concatenate 

image_model = Sequential() 
image_model.add(Convolution2D(32, 8, 8, subsample=(4, 4), input_shape=input_shape)) 
image_model.add(Activation('relu')) 
image_model.add(Convolution2D(64, 4, 4, subsample=(2, 2))) 
image_model.add(Activation('relu')) 
image_model.add(Convolution2D(64, 3, 3, subsample=(1, 1))) 
image_model.add(Activation('relu')) 
image_model.add(Flatten()) 
image_model.add(Dense(512)) 
image_model.add(Activation('relu')) 


value_model = Sequential() 
value_model.add(Flatten(input_shape=values)) 
value_model.add(Dense(16)) 
value_model.add(Activation('relu')) 
value_model.add(Dense(16)) 
value_model.add(Activation('relu')) 
value_model.add(Dense(16)) 
value_model.add(Activation('relu')) 

merged = Concatenate([image_model, value_model]) 

final_model = Sequential() 
final_model.add(merged) 
final_model.add(Dense(nb_actions, activation='linear')) 
+0

実際、ModelクラスAPIが必要です。あなたのサンプルコードは1つの入力と2つの出力を記述します。これを2つの入力(イメージと独立したステータス値)と1つの出力(nb_actions)に適合させます。 –

+0

編集をご覧ください –

関連する問題