我很难找到正确的权重映射,以便将密集层转换为卷积层。
这是我正在研究的ConvNet的摘录:
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(4096, activation='relu'))
MaxPooling之后,输入的形状为(512,7,7)。我想将密集层转换为卷积层,使其看起来像这样:
model.add(Convolution2D(512, 3, 3, activation='relu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Convolution2D(4096, 7, 7, activation='relu'))
但是,我不知道如何重新调整权重才能正确地将展平的权重映射到卷积层所需的(4096,512,7,7)结构?目前,致密层的权重为(25088,4096)。我需要以某种方式将这25088个元素映射到(512,7,7)的维度,同时保留权重到神经元的正确映射。到目前为止,我已经尝试了多种重塑然后移调的方法,但是我还没有找到正确的映射。
我一直在尝试的一个例子是:
weights[0] = np.transpose(np.reshape(weights[0],(512,7,7,4096)),(3,0,1,2))
但它无法正确映射权重。通过比较两个模型的输出,我验证了映射是否正确。如果正确完成,我希望输出应该是相同的。
还在寻找解决方案吗?这里是:
new_conv_weights = dense_weights.transpose(1,0).reshape(new_conv_shape)[:,:,::-1,::-1]
在您的情况下:
weights[0] = weights[0].transpose(1,0).reshape((4096,512,7,7))[:,:,::-1,::-1]
棘手的部分是conv过滤器翻转[:,:,::-1,::-1]。Theano确实进行卷积而不是相关(例如,与caffe不同)。因此,在Keras过滤器中,如下所示:
1 0
0 0
应用于矩阵:
1 2 3 4 5
6 7 8 9 0
1 2 3 4 5
结果为矩阵:
7 8 9 0
2 3 4 5
不是这样,正如人们期望的那样:
1 2 3 4
6 7 8 9
为了使事情按预期工作,您需要将滤镜旋转180度。刚刚为自己解决了这个问题,希望对您或其他人有帮助。干杯。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句