pytorc加载模型后,修改最后一层的分类输出层,in_features,out_features,东接层,不同层学习率调整

    def forward(self, inputs):
        """ Calls extract_features to extract features, applies final linear layer, and returns logits. """

        # Convolution layers
        x = self.extract_features(inputs)

        # Pooling and final linear layer
        x = F.adaptive_avg_pool2d(x, 1).squeeze(-1).squeeze(-1)
        if self._dropout:
            x = F.dropout(x, p=self._dropout, training=self.training)
        x = self._fc(x)
        return x

修改分类输出层1、,用in_features,得到,该层的输入,重写这一层

from efficientnet_pytorch import EfficientNet
from torch import nn
model = EfficientNet.from_pretrained('efficientnet-b5')
feature = model._fc.in_features
model._fc = nn.Linear(in_features=feature,out_features=45,bias=True)
print(model)

修改分类输出层2、 用 out_features,得到该层的输出,直接修改分类输出个数

from efficientnet_pytorch import EfficientNet
model = EfficientNet.from_pretrained('efficientnet-b5')
model._fc.out_features = 9
print(model)

不同层,不同学习率设置

class net(nn.Module):
    def __init__(self):
        super(net, self).__init__()
        self.conv1 = nn.Conv2d(3, 64, 1)
        self.conv2 = nn.Conv2d(64, 64, 1)
        self.conv3 = nn.Conv2d(64, 64, 1)
        self.conv4 = nn.Conv2d(64, 64, 1)
        self.conv5 = nn.Conv2d(64, 64, 1)
    def forward(self, x):
        out = conv5(conv4(conv3(conv2(conv1(x)))))
        return out
————————————————
版权声明:本文为CSDN博主「BinWang-cvlab」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wangbin12122224/article/details/79949824
某个层,学习率更大一点,其他层,用统一的学习率
net = net()
lr = 0.1
conv5_params = list(map(id, net.conv5.parameters()))  #这一层学习率,不一样,lr * 100
base_params = filter(lambda p: id(p) not in conv5_params,   ##过滤  conv5
                     net.parameters())
optimizer = torch.optim.SGD([
            {'params': base_params},
            {'params': net.conv5.parameters(), 'lr': lr * 100} ],
, lr=lr, momentum=0.9)

多个层,写法conv5 conv4是定义结构的网络的名字,根据不同的网络结构自己修改名字

conv5_params = list(map(id, net.conv5.parameters()))
conv4_params = list(map(id, net.conv4.parameters()))
base_params = filter(lambda p: id(p) not in conv5_params + conv4_params,
                     net.parameters()) ##注意写法是这样的 用 + 
optimizer = torch.optim.SGD([
            {'params': base_params},
            {'params': net.conv5.parameters(), 'lr': lr * 100},
            {'params': net.conv4.parameters(), 'lr': lr * 100},
            , lr=lr, momentum=0.9)

学习率设置完成后的学习率衰减,操作
####################
#  model structure
#-------------------
model = Mymodel()
if use_gpu:
    model = model.cuda()
 
####################
#        loss
#-------------------
criterion = nn.CrossEntropyLoss()
 
####################
#    optimizer
#-------------------
ignored_params = list(map(id, model.ViewModel.viewclassifier.parameters())) + list(map(id, model.Block.parameters()))
base_params = filter(lambda p: id(p) not in ignored_params, model.parameters())
optimizer_ft = optim.SGD([
        {'params': base_params, 'lr': 0.01},
        {'params': model.ViewModel.viewclassifier.parameters(), 'lr': 0.001},
        {'params': model.Block.parameters(), 'lr': 0.03}],  
    weight_decay=1e-3, momentum=0.9, nesterov=True)
 
 
####################
#**  Set lr_decay  **
#-------------------
 ##能分别设定不同层的衰减率
def adjust_lr(epoch):
    step_size = 60
    lr = args.lr * (0.1 ** (epoch // 30))  #epoch // 30取整操作, 0 1 2 3 .。。。。
    for g in optimizer.param_groups:
        g['lr'] = lr * g.get('lr')
 
    ######################################
    ###  optimizer.param_groups 类型与内容
    [
        { 'params': base_params, 'lr': 0.01, 'momentum': 0.9, 'dampening': 0,
        'weight_decay': 0.001, 'nesterov': True, 'initial_lr': 0.01 }, 
        { 'params': model.ViewModel.viewclassifier.parameters(), 'lr': 0.001, 
        'momentum': 0.9, 'dampening': 0, 'weight_decay': 0.001, 'nesterov': True, 
        'initial_lr': 0.001 },
        { 'params': model.Block.parameters(), 'lr': 0.03, 'momentum': 0.9, 
        'dampening': 0, 'weight_decay': 0.001, 'nesterov': True, 'initial_lr': 
        0.03 }
    ]
    ###  optimizer.param_groups 类型与内容
    ######################################
 
 
for epoch in range(start_epoch, args.epochs):
    adjust_lr(epoch)   # 每epoch更新一次。
    model.train(True)  # Set model to training mode
    ....
#### 或者
exp_lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=60, gamma=0.1)
for epoch in range(start_epoch, args.epochs):
	scheduler.step()   # put it before model.train(True)
	model.train(True)  # Set model to training mode


学习率设置,其他方式

def lr_poly(base_lr, iter, max_iter, power):
    return base_lr*((1-float(iter)/max_iter)**(power))
            
def adjust_learning_rate(optimizer, learning_rate, i_iter, max_iter, power):
    """Sets the learning rate to the initial LR divided by 5 at 60th, 120th and 160th epochs"""
    lr = lr_poly(learning_rate, i_iter, max_iter, power)
    optimizer.param_groups[0]['lr'] = lr
    return lr
————————————————
版权声明:本文为CSDN博主「咆哮的阿杰」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34914551/article/details/87699317

冻结某个层的写法,优化器需要filter 冻结的层

for name, p in net.named_parameters():  #两种循环网络的名字

for p in net.parameters():

##冻结,参数
model = EfficientNet.from_pretrained(args.arch,num_classes=29)
for param in model._bn0.parameters():   #网络结构的名字,想冻结到哪里就写那一层的名字
	param.requires_grad = False  #直接设置 false
optimizer = optim.SGD(  #优化器 需要过滤掉所有的 梯度为0 的东接层
            filter(lambda p: p.requires_grad, model.parameters()),  # 记住一定要加上filter(),不然会报错
            lr=0.01,
            weight_decay=1e-5, momentum=0.9, nesterov=True)

https://blog.csdn.net/qq_34914551/article/details/87699317 Adam 优化器,写法,以及model.module打印

  • 16
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个利用单感知器完成线性可分的二分类模型设计的程序代码: ```python import numpy as np # 定义单感知器类 class Perceptron(object): def __init__(self, learning_rate=0.01, n_iter=1000): self.learning_rate = learning_rate # 学习率 self.n_iter = n_iter # 迭代次数 self.weights = None # 权重 self.bias = None # 偏置 # 训练模型 def fit(self, X, y): n_samples, n_features = X.shape # 样本数量和特征维度 self.weights = np.zeros(n_features) # 初始化权重为0 self.bias = 0 # 初始化偏置为0 # 随机梯度下降 for _ in range(self.n_iter): for i in range(n_samples): # 计算输出 linear_output = np.dot(self.weights, X[i]) + self.bias y_predicted = self.activation_function(linear_output) # 更新权重和偏置 update = self.learning_rate * (y[i] - y_predicted) self.weights += update * X[i] self.bias += update # 预测样本标签 def predict(self, X): linear_output = np.dot(X, self.weights) + self.bias y_predicted = self.activation_function(linear_output) return y_predicted # 定义激活函数(这里使用步函数) def activation_function(self, x): return np.where(x >= 0, 1, -1) # 初始化四个坐标点 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([-1, 1, 1, 1]) # 用标签-1表示左下和其他三个点组成一类,用标签1表示其他三个点组成另一类 # 创建感知器对象 perceptron = Perceptron() # 训练模型 perceptron.fit(X, y) # 预测样本标签 print(perceptron.predict(X)) ``` 运行上述代码,得到的输出为`[-1 1 1 1]`,表示模型成功地将四个坐标点分成了两类:左下和其他三个点组成一类,其他三个点组成另一类。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值