I use vgg19 as encoder and I want to load the weight and bias of conv layers of pytorch pretrained model. how should I do for achieving it?
If you want to just use the pretrained model from
torchvision, you could just initialize the model with:
import torchvision.models as models model = models.vgg16(pretrained=True)
Alternatively, if you would like to get the
bias directly from a particular layer, this should work:
Well, I want to use its 1~3blocks and first of 4block conv layers’ parameters since I changed the MaxPool2d with “return _indices=True “. I have defined my network, and I really don’t know how to utilise the pretrained vgg19 in my network.
You could load the pretrained parameters into your model with some code like this:
with torch.no_grad(): new_model.conv1.weight.copy_(vgg.features.weight) new_model.conv1.bias.copy_(vgg.features.bias) ...
Would that work for you?
should I change the “new_model.conv1.bias.copy_(vgg.features.bias)” to “new_model.conv1.bias.copy_(vgg.features.bias)”
Yes, that is a typo in my code sample and you should index the layer directly.
but it goes wrong:
RuntimeError: a leaf Variable that requires grad has been used in an in-place operation.
when I use the same way as you referred in pre-reflection by
nn.ReflectionPad2d((1, 1, 1, 1)), # block 4 nn.Conv2d(256, 512, 3, 1, 0)
instead of using
nn.Conv2d(256, 512, 3, 1, 1)
Do you get this error message even if you warp the manipulation into the
If so, could you post some code so that we can have a look?
Thank you! I’m not sure about that. What I did in init() of my net class shows as following:
- Loading vgg pre-trained model with:
vgg_pretrained_features = models.vgg19(pretrained=True).features
- Defining my net in nn.Sequential() where different from origin vgg in using "nn.ReflectionPad((1,1,1,1)) "and “nn.Conv2d(in_channels, out_channels, 3, 1, 0)” instead of “nn.Conv2d(in_channels, out_channels, 3, 1, 1)”. Meanwhile, changing the nn.MaxPool2d(2,2) to nn.MaxPool2d(2,2,return_indices=True).
- Loading the conv layers weights and biases to my net with:
- freezing the grad refer to examples/fast_neural_style
So far, I don’t the no_grad() to forbid computing the grad.
Could you wrap all parameter manipulations, e.g.
.weight.copy_(), in a
with torch.np_grad() block and run your code again?
you can directly
import torchvision.models as models
model = models.vgg16(pretrained = True)
you can directly
weight_data.requires_grad = False
Hi, thank you so much. It can load parameters to my network.