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