1

자율 헬리콥터에 대한 보강 학습 에이전트를 구축 중입니다. 순수한 이미지 입력에 대한 나의 Keras (1.0.7) 모델은 다음과 같습니다이미지가있는 Keras 모델을 훈련시키고 입력 값을 분리하는 방법은 무엇입니까? 혼합 입력

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

을 나는 순수한 이미지 외에 내 모델 (방향의 위치에 몇 가지 추가 값을 전달해야 제대로 배우기 위해 내 헬리콥터 등). 나는 하나의 단일 출력 레이어 또는 여러 출력 레이어를 생성하는 네트워크 아키텍처의 흐름을 따라야한다고 생각합니다.

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은 내가 이해할 수 있도록 이미지와 이미지를 병합하기위한 것입니다. 이러한 유형의 입력을 어떻게 모으는가?

편집 : 여기서 내 시도는 내 뜻입니다. 하나의 이미지와 하나의 별도 값으로 매 시간마다 에이전트를 훈련시키고 싶습니다. 이후 conv 네트워크 스트림에서 이미지와 함께 별도의 값을 전달해서는 안된다 고 생각하기 때문에 값의 두 번째 스트림을 가져온 다음 이미지와 값 네트워크를 함께 가져 오려고합니다.

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) 스타일이 작동하지 않습니다.

또한 난 당신이 순차하지만 모델 클래스 API하지를 사용해야합니다 그렇게하기 위해서는 actions = Dense(nb_actions, activation='linear')(img)(value)

답변

0

에서 함께 스트림을 가지고하는 방법을 모르겠어요. 당신이 개 입력 모델과 1 출력이 필요한 경우

당신이 여기 달성하려는 무엇인지, 내가 다음 코드는 당신에게

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

편집 도움이 될 것입니다 희망하지,이 시도 :

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가 필요한 것입니다. 예제 코드는 하나의 입력과 두 개의 출력을 설명합니다. 이것을 2 개의 입력 (이미지와 분리 된 상태 값)과 하나의 출력 (nb_actions)에 적용 할 것입니다. –

+0

편집을 참조하십시오. –