【问题标题】:How to train Keras model with Image AND separate value as input? Mixed input如何使用图像和单独的值作为输入来训练 Keras 模型?混合输入
【发布时间】:2018-04-04 03:51:59
【问题描述】:

我正在为我的自主直升机构建强化学习代理。我用于纯图像输入的 Keras (1.0.7) 模型如下所示:

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

Merge 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) 样式不起作用。

另外我不知道如何在actions = Dense(nb_actions, activation='linear')(img)(value) 中整合流

【问题讨论】:

    标签: python image-processing keras deep-learning reinforcement-learning


    【解决方案1】:

    为此,您必须使用模型类 API,而不是 Sequential。

    不知道你想在这里实现什么,我希望下面的代码对你有帮助

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

    编辑 如果你需要 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'))
    

    【讨论】:

    • 没错,Model 类 API 正是我所需要的。您的示例代码描述了一个输入和两个输出。我会将其调整为 2 个输入(图像和单独的状态值)和一个输出(nb_actions)。
    • 请参阅编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-12
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    • 2020-01-22
    相关资源
    最近更新 更多