如何从同一个 Keras 层获得不同的输出,然后将它们组合起来?
How to get different outputs from the same Keras layer and then combine them?
所以基本上,我正在创建一个带有 Keras 和 Tensorflow 后端的 CNN。我现在想插入两个具有相同输入层的层,然后将它们连接起来,如下所示:
model = Sequential()
model.add(Convolution1D(128, (4), activation='relu',input_shape=(599,128))
model.add(MaxPooling1D(pool_size=(4)))
model.add(Convolution1D(256, (4), activation='relu')
model.add(MaxPooling1D(pool_size=(2)))
model.add(Convolution1D(256, (4), activation='relu')
model.add(MaxPooling1D(pool_size=(2)))
model.add(Convolution1D(512, (4), activation='relu')
# output 1 = GlobalMaxPooling1D() # from last conv layer
# output 2 = GlobalAveragePooling1D() # from last conv layer
# model.add(Concatenate((output 1, output 2))
# at this point output should have a shape of 1024,1 (from 512 * 2)
model.add(Dense(1024))
model.add(Dense(512))
以简单的方式以图形方式显示:
...
cv4
/ \
/ \
gMaxP|gAvrgP (each 512,)
\ /
\ /
dense(1024,)
我觉得我错过了一些非常明显的东西。谁能叫醒我?
使用Model class API,那么应该是这样的:
inputs = Input(shape=(599,128), name='image_input')
x = Convolution1D(128, (4), activation='relu')(inputs)
x = MaxPooling1D(pool_size=(4))(x)
x = Convolution1D(256, (4), activation='relu')(x)
x = MaxPooling1D(pool_size=(2))(x)
x = Convolution1D(256, (4), activation='relu')(x)
x = MaxPooling1D(pool_size=(2))(x)
x = Convolution1D(512, (4), activation='relu')(x)
output_1 = GlobalMaxPooling1D()(x) # from last conv layer
output_2 = GlobalAveragePooling1D()(x) # from last conv layer
x = concatenate([output_1, output_2])
# at this point output should have a shape of 1024,1 (from 512 * 2)
x = Dense(1024)(x)
x = Dense(512)(x)
所以基本上,我正在创建一个带有 Keras 和 Tensorflow 后端的 CNN。我现在想插入两个具有相同输入层的层,然后将它们连接起来,如下所示:
model = Sequential()
model.add(Convolution1D(128, (4), activation='relu',input_shape=(599,128))
model.add(MaxPooling1D(pool_size=(4)))
model.add(Convolution1D(256, (4), activation='relu')
model.add(MaxPooling1D(pool_size=(2)))
model.add(Convolution1D(256, (4), activation='relu')
model.add(MaxPooling1D(pool_size=(2)))
model.add(Convolution1D(512, (4), activation='relu')
# output 1 = GlobalMaxPooling1D() # from last conv layer
# output 2 = GlobalAveragePooling1D() # from last conv layer
# model.add(Concatenate((output 1, output 2))
# at this point output should have a shape of 1024,1 (from 512 * 2)
model.add(Dense(1024))
model.add(Dense(512))
以简单的方式以图形方式显示:
...
cv4
/ \
/ \
gMaxP|gAvrgP (each 512,)
\ /
\ /
dense(1024,)
我觉得我错过了一些非常明显的东西。谁能叫醒我?
使用Model class API,那么应该是这样的:
inputs = Input(shape=(599,128), name='image_input')
x = Convolution1D(128, (4), activation='relu')(inputs)
x = MaxPooling1D(pool_size=(4))(x)
x = Convolution1D(256, (4), activation='relu')(x)
x = MaxPooling1D(pool_size=(2))(x)
x = Convolution1D(256, (4), activation='relu')(x)
x = MaxPooling1D(pool_size=(2))(x)
x = Convolution1D(512, (4), activation='relu')(x)
output_1 = GlobalMaxPooling1D()(x) # from last conv layer
output_2 = GlobalAveragePooling1D()(x) # from last conv layer
x = concatenate([output_1, output_2])
# at this point output should have a shape of 1024,1 (from 512 * 2)
x = Dense(1024)(x)
x = Dense(512)(x)