首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多尺度CNN

多尺度CNN
EN

Stack Overflow用户
提问于 2021-03-08 14:38:01
回答 1查看 153关注 0票数 2

我正在尝试创建一个类似于图像的网络,但我不知道它是如何实现的。

我希望它只接收一个输入,然后将它提供给包含卷积块的两个子网络。这段代码是我写的,但不起作用。

代码语言:javascript
复制
main_model = Sequential()
main_model.add(Convolution2D(filters=16, kernel_size=(2, 2), input_shape=(32, 32, 3)))
main_model.add(BatchNormalization())
main_model.add(Activation('relu'))
main_model.add(MaxPooling2D(pool_size=(2, 2)))

main_model.add(Convolution2D(filters=32, kernel_size=(2, 2)))
main_model.add(BatchNormalization())
main_model.add(Activation('relu'))
main_model.add(MaxPooling2D(pool_size=(2, 2)))

main_model.add(Convolution2D(filters=64, kernel_size=(2, 2)))
main_model.add(BatchNormalization())
main_model.add(Activation('relu'))
main_model.add(MaxPooling2D(pool_size=(2, 2)))

main_model.add(Flatten())

# lower features model - CNN2
lower_model = Sequential()
lower_model.add(Convolution2D(filters=16, kernel_size=(1, 1), input_shape=(32, 32, 3)))
lower_model.add(BatchNormalization())
lower_model.add(Activation('relu'))
lower_model.add(MaxPooling2D(pool_size=(2, 2)))
lower_model.add(Flatten())

lower_model.add(Convolution2D(filters=32, kernel_size=(1, 1)))
lower_model.add(BatchNormalization())
lower_model.add(Activation('relu'))
lower_model.add(MaxPooling2D(pool_size=(2, 2)))

lower_model.add(Convolution2D(filters=64, kernel_size=(1, 1)))
lower_model.add(BatchNormalization())
lower_model.add(Activation('relu'))
lower_model.add(MaxPooling2D(pool_size=(2, 2)))

lower_model.add(Flatten())

# merged model
merged_model = concatenate([main_model, lower_model])

final_model = Sequential()
final_model.add(merged_model)
final_model.add(Dense(32))
final_model.add(Activation('relu'))
final_model.add(Dropout(0.5))
final_model.add(Dense(1))
final_model.add(Activation('sigmoid'))

final_model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

我得到了一个错误:

代码语言:javascript
复制
ValueError: Input 0 of layer conv2d_4 is incompatible with the layer: expected ndim=4, found ndim=2. Full shape received: [None, 4096]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-08 16:54:03

通过使用Keras函数API,这是可能的,您可以这样做

代码语言:javascript
复制
img_inputs = keras.Input(shape=(32, 32, 3))

branchA = Convolution2D(filters=32, kernel_size=(1, 1))(img_inputs)
branchA = BatchNormalization()(branchA)
branchA = Activation('relu')(branchA)
branchA = MaxPooling2D(pool_size=(2, 2))(branchA)
branchA = Model(inputs=img_inputs, outputs=branchA)

branchB = Convolution2D(filters=32, kernel_size=(1, 1))(img_inputs)
branchB = BatchNormalization()(branchB)
branchB = Activation('relu')(branchB)
branchB = MaxPooling2D(pool_size=(2, 2))(branchB)
branchB = Model(inputs=img_inputs, outputs=branchB)

#you may need to make sure output size of branchA and branchB are same size
combined = concatenate([branchA.output, branchB.output])

combined = Dense(2, activation="relu")(combined)
combined = Dense(1, activation="softmax")(combined)

model = Model(inputs=[branchA.input, branchB.input], outputs=combined)

这里是另一个教程,它使用多个分支,但使用两个不同的输入,但粗略的过程是相同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66531781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档