用指定的Tensor数据来初始化model的参数

很多时候我们都想用自己的参数(数据)来初始化我们的model,代码如下:

>>> model=torch.nn.Linear(10,5)
>>> for ii in model.modules():
...     ii.weight=torch.nn.Parameter(torch.randn(10,5))
...
>>> a=torch.randn(10,5)
>>> a
tensor([[-0.8402, -1.3473,  0.9593, -0.1408,  0.2504],
        [-0.5642,  0.5420, -1.6001, -0.9807,  0.6935],
        [ 0.5199,  0.7962,  0.1486,  2.1762, -0.1486],
        [-0.9331,  0.7782,  0.7501, -0.0087, -0.3033],
        [-0.9602,  2.0800,  0.9486,  0.9825,  1.8542],
        [-0.7316, -0.7301,  0.8184, -1.1840,  1.1499],
        [-2.6392,  0.4696, -1.0079,  0.6272, -0.0083],
        [ 1.0821, -0.3723,  1.3923, -0.6589, -0.4807],
        [ 0.2141, -0.2910,  2.6941,  0.3908,  0.0870],
        [ 0.3787, -3.2251,  1.6406, -0.4179, -0.4480]])
>>> for ii in model.modules():
...     ii.weight=torch.nn.Parameter(a)
...
>>> for ii in model.modules():
...     print(ii.weight)
...
Parameter containing:
tensor([[-0.8402, -1.3473,  0.9593, -0.1408,  0.2504],
        [-0.5642,  0.5420, -1.6001, -0.9807,  0.6935],
        [ 0.5199,  0.7962,  0.1486,  2.1762, -0.1486],
        [-0.9331,  0.7782,  0.7501, -0.0087, -0.3033],
        [-0.9602,  2.0800,  0.9486,  0.9825,  1.8542],
        [-0.7316, -0.7301,  0.8184, -1.1840,  1.1499],
        [-2.6392,  0.4696, -1.0079,  0.6272, -0.0083],
        [ 1.0821, -0.3723,  1.3923, -0.6589, -0.4807],
        [ 0.2141, -0.2910,  2.6941,  0.3908,  0.0870],
        [ 0.3787, -3.2251,  1.6406, -0.4179, -0.4480]], requires_grad=True)
>>> for ii in model.modules():
...     print(ii.bias)
...
Parameter containing:
tensor([-0.3115, -0.0643, -0.0982,  0.1830, -0.1755], requires_grad=True)
>>>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
初始化VGG网络的参数,可以按照以下步骤: 1. 导入必要的库和模块: ``` import numpy as np import theano import theano.tensor as T import lasagne ``` 2. 定义VGG网络的结构,可以参考如下代码: ``` def build_model(input_var=None): network = lasagne.layers.InputLayer(shape=(None, 3, 224, 224), input_var=input_var) network = lasagne.layers.Conv2DLayer(network, num_filters=64, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.Conv2DLayer(network, num_filters=64, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.MaxPool2DLayer(network, pool_size=(2, 2), stride=2) network = lasagne.layers.Conv2DLayer(network, num_filters=128, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.Conv2DLayer(network, num_filters=128, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.MaxPool2DLayer(network, pool_size=(2, 2), stride=2) network = lasagne.layers.Conv2DLayer(network, num_filters=256, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.Conv2DLayer(network, num_filters=256, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.Conv2DLayer(network, num_filters=256, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.MaxPool2DLayer(network, pool_size=(2, 2), stride=2) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.MaxPool2DLayer(network, pool_size=(2, 2), stride=2) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.Conv2DLayer(network, num_filters=512, filter_size=(3, 3), stride=1, pad=1, nonlinearity=lasagne.nonlinearities.rectify, W=lasagne.init.GlorotUniform()) network = lasagne.layers.MaxPool2DLayer(network, pool_size=(2, 2), stride=2) return network ``` 这里定义了一个包含13个卷积层和5个最大池化层的VGG网络,每个卷积层都使用了GlorotUniform初始化方法。 3. 加载预训练的权重文件: ``` def load_weights(): # Load the pre-trained weights url = 'https://s3.amazonaws.com/lasagne/recipes/pretrained/imagenet/vgg19_normalized.pkl' filename = 'vgg19_normalized.pkl' if not os.path.exists(filename): urllib.urlretrieve(url, filename) with open(filename, 'rb') as f: model = pickle.load(f) return model['param values'] ``` 这里使用了pickle库来加载预训练的权重文件,并返回其中的参数。 4. 初始化参数: ``` input_var = T.tensor4('inputs') target_var = T.ivector('targets') network = build_model(input_var) weights = load_weights() lasagne.layers.set_all_param_values(network, weights) ``` 这里首先定义了输入和目标变量,然后调用了前面定义的build_model函数来构建VGG网络,接着调用load_weights函数加载预训练的权重文件,并使用lasagne.layers.set_all_param_values函数将参数设置到网络中。 5. 编译模型: ``` prediction = lasagne.layers.get_output(network) loss = lasagne.objectives.categorical_crossentropy(prediction, target_var) loss = loss.mean() params = lasagne.layers.get_all_params(network, trainable=True) updates = lasagne.updates.momentum(loss, params, learning_rate=0.01, momentum=0.9) train_fn = theano.function([input_var, target_var], loss, updates=updates) ``` 这里首先定义了预测和损失函数,然后使用lasagne.layers.get_all_params函数获取所有可训练的参数,接着使用lasagne.updates.momentum函数定义更新规则,最后使用theano.function函数编译模型。 现在,我们就完成了VGG网络参数初始化

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值