Image processing 固定Gabor滤波器卷积神经网络

Image processing 固定Gabor滤波器卷积神经网络,image-processing,keras,conv-neural-network,pytorch,gabor-filter,Image Processing,Keras,Conv Neural Network,Pytorch,Gabor Filter,我正在尝试用一些conv层构建一个CNN,其中层中的一半过滤器是固定的,另一半在训练模型时是可学习的。但是我没有发现任何关于这个的东西 我试图做的和他们在本文中做的相似 在Keras,Pytorch,有没有办法做到这一点…我问了一个有点相关的问题,你可以参考并找到其他信息 为了避免构建允许部分冻结的自定义层,最好创建两个层,其中一个冻结,另一个不冻结。然后,下一层可以连接到它们,网络的其余部分将是相同的。然后,您可以使用一点转移学习,将第一层从预先训练的网络转移到冻结层。你可以用这个 下面是一个

我正在尝试用一些conv层构建一个CNN,其中层中的一半过滤器是固定的,另一半在训练模型时是可学习的。但是我没有发现任何关于这个的东西

我试图做的和他们在本文中做的相似


在Keras,Pytorch,有没有办法做到这一点…

我问了一个有点相关的问题,你可以参考并找到其他信息

为了避免构建允许部分冻结的自定义层,最好创建两个层,其中一个冻结,另一个不冻结。然后,下一层可以连接到它们,网络的其余部分将是相同的。然后,您可以使用一点转移学习,将第一层从预先训练的网络转移到冻结层。你可以用这个

下面是一个简单的示例,说明了如何实现这一点

from tensorflow.python.keras import layers, Model
from tensorflow.python.keras.applications import InceptionV3

# Sample CNN
input_layer = layers.Input(shape=(224, 224, 3))
frozen_layer = layers.Conv2D(32, kernel_size=(3, 3), use_bias=False, trainable=False, name="frozen_layer")(input_layer)
thawed_layer = layers.Conv2D(32, kernel_size=(3, 3), trainable=True)(input_layer)
concat = layers.concatenate([frozen_layer, thawed_layer])
another_layer = layers.Conv2D(64, kernel_size=(3, 3), trainable=True)(concat)
output_layer = layers.Dense(10)(another_layer)
model = Model(inputs=[input_layer], outputs=[output_layer])

# Build a pre-trained model to extract weights from
transfer_model = InceptionV3(weights='imagenet', include_top=False)

assert transfer_model.layers[1].get_weights()[0].shape == model.get_layer(name="frozen_layer").get_weights()[0].shape

# Transfer the weights 
model.get_layer(name="frozen_layer").set_weights(transfer_model.layers[1].get_weights())

当然。在PyTorch中,您可以使用和

  • 将其
    权重
    参数手动设置为所需的过滤器
  • 从学习中排除这些权重
  • 一个简单的例子是:

    import torch
    import torch.nn as nn
    
    class Model(nn.Module):
        def __init__(self):
            super(Model, self).__init__()
    
            self.conv_learning = nn.Conv2d(1, 5, 3, bias=False)
            self.conv_gabor = nn.Conv2d(1, 5, 3, bias=False)
            # weights HAVE TO be wrapped in `nn.Parameter` even if they are not learning
            self.conv_gabor.weight = nn.Parameter(torch.randn(1, 5, 3, 3))
    
        def forward(self, x):
            y = self.conv_learning(x)
            y = torch.sigmoid(y)
            y = self.conv_gabor(y)
    
            return y.mean()
    
    model = Model()
    xs = torch.randn(10, 1, 30, 30)
    ys = torch.randn(10)
    loss_fn = nn.MSELoss()
    
    # we can exclude parameters from being learned here, by filtering them
    # out based on some criterion. For instance if all your fixed filters have
    # "gabor" in name, the following will do
    learning_parameters = (param for name, param in model.named_parameters()
                                 if 'gabor' not in name)
    optim = torch.optim.SGD(learning_parameters, lr=0.1)
    
    epochs = 10
    for e in range(epochs):
        y = model(xs)
        loss = loss_fn(y, ys)
    
        model.zero_grad()
        loss.backward()
        optim.step()