基于Theano的Lasagne的ElemwiseSumLayer在Keras中是如何转换的

How is Theano based ElemwiseSumLayer of Lasagne converted in Keras

我有一个用 Theano 构建的网络。我正在尝试将其转换为 Keras。

net['voxres2_out'] = ElemwiseSumLayer([net['conv1c'], net['voxres2_conv2']])

现在,我想将 Theano 中的这条语句转换为 Keras。但是,我不确定哪一层可以替代 Keras 中的相同功能。最初,认为连接是一个选项,但我不确定。

下面是theano中的原代码

net = {}
net['input'] = InputLayer((None, 1, 110, 110, 110), input_var=input_var)
net['conv1a'] = Conv3DDNNLayer(net['input'], 32, 3, pad='same',
                               nonlinearity=identity)
net['bn1a'] = BatchNormLayer(net['conv1a'])
net['relu1a'] = NonlinearityLayer(net['bn1a'])
net['conv1b'] = Conv3DDNNLayer(net['relu1a'], 32, 3, pad='same',
                               nonlinearity=identity)
net['bn1b'] = BatchNormLayer(net['conv1b'])
net['relu1b'] = NonlinearityLayer(net['bn1b'])
net['conv1c'] = Conv3DDNNLayer(net['relu1b'], 64, 3, stride=(2, 2, 2),
                               pad='same', nonlinearity=identity)
# VoxRes block 2
net['voxres2_bn1'] = BatchNormLayer(net['conv1c'])
net['voxres2_relu1'] = NonlinearityLayer(net['voxres2_bn1'])
net['voxres2_conv1'] = Conv3DDNNLayer(net['voxres2_relu1'], 64, 3,
                                      pad='same', nonlinearity=identity)
net['voxres2_bn2'] = BatchNormLayer(net['voxres2_conv1'])
net['voxres2_relu2'] = NonlinearityLayer(net['voxres2_bn2'])
net['voxres2_conv2'] = Conv3DDNNLayer(net['voxres2_relu2'], 64, 3,
                                      pad='same', nonlinearity=identity)
net['voxres2_out'] = ElemwiseSumLayer([net['conv1c'],
                                       net['voxres2_conv2']])
# VoxRes block 3
net['voxres3_bn1'] = BatchNormLayer(net['voxres2_out'])

以下是我对 Keras 的转换

classifier = Sequential()
classifier.add(Conv3D(32, (3, 3, 3), input_shape = (128, 128, 128, 1), padding = 'same', activation = 'relu'))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))

classifier.add(Conv3D(32, (3, 3, 3), input_shape = (128, 128, 128, 1), padding = 'same', activation = 'relu'))
classifier.add(BatchNormalization())
classifier.add(Activation('relu'))
classifier.add(Conv3D(64, (3, 3, 3), input_shape = (128, 128, 128, 1), padding = 'same', activation = 'relu',  strides = (2, 2, 2)))

classifier_1 = Sequential()#comment
classifier_1 = classifier
classifier_1.add(BatchNormalization())
classifier_1.add(Activation('relu'))
classifier_1.add(Conv3D(64, (3, 3, 3), input_shape = (128, 128, 128, 1), padding = 'same', activation = 'relu'))
classier_added_1 = Add()([classifier.output, classifier_1.output])

classifier_2 = Sequential()
classifier_2 = classier_added_1
classifier_2.add(BatchNormalization())
classifier_2.add(Activation('relu'))
classifier_2.add(Conv3D(64, (3, 3, 3), padding = 'same', activation = 'relu'))

所以我使用了Keras的Add功能部分。但是,它 returns 是一个张量,在使用返回的张量执行与 classifier_2 关联的语句时,出现以下错误。

AttributeError: 'Tensor' object has no attribute 'add'

我明白这个错误,但我不知道解决方法。

你能帮忙吗?

为了解决这个问题,我自己搭建了模型,那边张量加法。

classifier_added_2 = Add()([classifier_2, classifier_3])

其中 classifier_2 和 classifier_3 是输入张量,classifier_added_2 是输出张量。

现在,可以使用 Keras

中的 Model 函数构建这些张量