基于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 函数构建这些张量
我有一个用 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 函数构建这些张量