fc12 use step by step

本文介绍了如何在VMWARE6.5中安装并配置FC12系统环境,包括网络配置、五笔输入法安装及Windows共享目录访问方法。此外,还提供了修改VNC访问密码的具体步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

确认FC12为使用环境

1.安装在VMWARE6.5中;

2.配置一下网络,自动即可.

3.安装五笔输入法

    su 

    yum install ibus-table-wubi

 

 

访问windows的共享目录

  查看: smbclient -L //192.168.0.xxx/xxx -U userxxx

 

  挂载:

    su

    mkdir /mnt/share 

    mount -t cifs -o username=xxx,password=xxx //hostname/dir /mnt/share

 

修改vnc访问密码

    vncpasswd

<think>我们遇到了两个主要问题: 1. 在训练循环中,我们使用了`scheduler.step(val_acc)`,但是根据PyTorch最新版本,`StepLR`调度器应该在每个epoch后不带参数调用。此外,我们可能使用了错误的调度器(`StepLR`需要的是步数,而不是验证准确率)。 2. 在保存最佳模型时,变量`best_val_acc`未定义。 解决方案: 1. 对于学习率调度器:我们有两种选择: a) 如果使用`StepLR`,则应该不带参数调用,即`scheduler.step()`,并且它会在每`step_size`个epoch后降低学习率。 b) 如果我们想根据验证准确率来调整学习率(例如当验证准确率不再提升时降低学习率),则应该使用`ReduceLROnPlateau`调度器,这时调用方式为`scheduler.step(val_acc)`。 2. 初始化`best_val_acc`为0(或一个很小的数),然后在每个epoch后比较并更新。 此外,代码中还有几个小问题: - 混合精度训练部分:`autocast`上下文管理器应该放在训练循环内部,并且每个训练批次都要使用。但是我们在训练循环外部使用了`with autocast`,这是不对的。应该将`with autocast`放在每个训练批次的内部。 - 在训练循环中,我们使用了`scheduler.step(val_acc)`,但是我们的调度器是`StepLR`,它不需要参数。因此,我们需要根据需求选择合适的调度器。 修改步骤: 1. 将混合精度训练的`autocast`移到训练批次内部。 2. 初始化`best_val_acc = 0.0`。 3. 根据需求调整学习率调度器: - 如果我们想每30个epoch降低一次学习率,则保留`StepLR`,并在每个epoch后调用`scheduler.step()`(不带参数)。 - 如果我们想根据验证准确率来调整学习率,则改用`ReduceLROnPlateau`,并相应地调用`scheduler.step(val_acc)`。 这里,我们根据原代码的意图(每30个epoch降低学习率)使用`StepLR`,所以我们将使用不带参数的`scheduler.step()`。 另外,在训练循环中,我们计算验证准确率后,原代码使用`scheduler.step(val_acc)`,这会导致错误(因为`StepLR`不需要参数),所以我们改为`scheduler.step()`。 同时,我们注意到在训练循环中,我们使用了`train_test_split`,但返回的是numpy数组,然后转换为tensor,这没有问题。 最后,在保存模型时,我们使用了字符串'best_mlp_model.pth',但我们的模型是ResNet,建议改为更有意义的名字。 修改后的代码: 1. 初始化`best_val_acc`。 2. 将调度器的调用改为`scheduler.step()`(不带参数)。 3. 移动混合精度上下文到训练批次内部(已经在那里,但注意缩进)。 4. 修复训练循环中的调度器调用位置:在训练完一个epoch后(即训练循环结束后)调用调度器。 注意:原代码中,调度器是在每个epoch的验证后调用的,这没有问题,因为`StepLR`是基于epoch的。 具体修改如下: ```python # ...(前面的代码保持不变) # 2. 训练配置(使用混合精度加速) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = FatigueResNet().to(device) criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3) scaler = GradScaler() # 用于混合精度训练 scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=30, gamma=0.1) # 初始化最佳验证准确率 best_val_acc = 0.0 # 3. 训练循环 for epoch in range(50): model.train() train_loss = 0 for inputs, labels in train_loader: inputs, labels = inputs.to(device), labels.to(device) optimizer.zero_grad() # 使用混合精度前向传播 with autocast(device_type='cuda'): outputs = model(inputs) # 注意:train_y是one-hot编码,所以用argmax得到类别索引 loss = criterion(outputs, labels.argmax(dim=1)) # 混合精度反向传播 scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() train_loss += loss.item() # 每个epoch结束后,更新学习率调度器(StepLR) scheduler.step() # 注意:这里不再传入val_acc,因为StepLR不需要 # 验证 model.eval() val_correct = 0 with torch.no_grad(): for inputs, labels in val_loader: inputs, labels = inputs.to(device), labels.to(device) outputs = model(inputs) preds = outputs.argmax(dim=1) targets = labels.argmax(dim=1) val_correct += (preds == targets).sum().item() val_acc = val_correct / len(val_dataset) print(f'Epoch {epoch+1}: Train Loss={train_loss/len(train_loader):.4f}, Val Acc={val_acc:.4f}') # 保存最佳模型 if val_acc > best_val_acc: best_val_acc = val_acc torch.save(model.state_dict(), 'best_resnet_model.pth') # 修改文件名以反映模型类型 # 5. 测试评估 model.load_state_dict(torch.load('best_resnet_model.pth')) model.eval() test_correct = 0 with torch.no_grad(): for inputs, labels in test_loader: inputs, labels = inputs.to(device), labels.to(device) outputs = model(inputs) preds = outputs.argmax(dim=1) targets = labels.argmax(dim=1) test_correct += (preds == targets).sum().item() test_acc = test_correct / len(test_dataset) print(f'Test Accuracy: {test_acc:.4f}') ``` 这样修改后,应该可以解决未定义`best_val_acc`的问题,并且避免了调度器调用时的警告(因为StepLR现在不带参数调用)。 注意:关于调度器调用的位置,原代码是在验证之前调用的,但这样使用的是上一个epoch的学习率。我们通常在一个epoch的训练结束后,验证之前或之后更新调度器都是可以的,但StepLR是按epoch调度的,所以只要在每个epoch结束后调用一次即可。这里我们在训练循环结束后立即调用,然后进行验证,没有问题。 另外,关于学习率调度器的弃用警告(如果使用旧版本的PyTorch,StepLR的step函数带参数会警告),我们已经修复。 最后,我们修改了保存模型的文件名为'best_resnet_model.pth',以符合模型类型。</think>### 解决 PyTorch 学习率调度器警告 EPOCH_DEPRECATION_WARNING PyTorch 在最新版本中弃用了学习率调度器中的 `epoch` 参数,导致出现 `EPOCH_DEPRECATION_WARNING` 警告。以下是完整的修复方案: #### 问题原因与修复方法 1. **弃用警告原因**: - PyTorch 1.4+ 版本移除了 `scheduler.step(epoch)` 中的 `epoch` 参数 - 新版本要求使用无参数的 `scheduler.step()` 调用方式 - 旧代码示例(会触发警告): ```python scheduler.step(epoch) # 已弃用 ``` 2. **正确修复方法**: ```python # 在训练循环中调用调度器时移除 epoch 参数 scheduler.step() # 正确用法 ``` #### 完整修复代码示例 ```python import torch from torch.optim.lr_scheduler import StepLR # 初始化模型和优化器 model = ... optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 创建调度器 - 每30个epoch将学习率乘以0.1 scheduler = StepLR(optimizer, step_size=30, gamma=0.1) for epoch in range(100): # 训练过程... train_model(model, optimizer) # 验证过程... val_acc = validate_model(model) # 关键修复:移除epoch参数 scheduler.step() # ✅ 正确用法 # 保存最佳模型逻辑... if val_acc > best_val_acc: best_val_acc = val_acc torch.save(model.state_dict(), 'best_model.pth') ``` #### 不同调度器的修复方案 | 调度器类型 | 弃用前代码 | 修复后代码 | 适用场景 | |-----------|------------|------------|----------| | `StepLR` | `scheduler.step(epoch)` | `scheduler.step()` | 固定步长调整 | | `ReduceLROnPlateau` | `scheduler.step(val_loss)` | `scheduler.step(val_loss)` | 基于指标调整 | | `CosineAnnealingLR` | `scheduler.step(epoch)` | `scheduler.step()` | 余弦退火 | | `MultiStepLR` | `scheduler.step(epoch)` | `scheduler.step()` | 多阶段调整 | > **注意**:`ReduceLROnPlateau` 是唯一需要参数的调度器,它基于验证指标调整学习率,应保留参数调用[^1]。 #### 迁移学习中的冻层处理 当使用预训练模型时,结合学习率调度和冻层技术: ```python # 初始化预训练模型 model = resnet18(pretrained=True) # 冻层处理(保留特征提取层权重) set_parameter_requires_grad(model, feature_extracting=True) # [^3] # 仅优化最后一层 optimizer = optim.SGD([ {'params': model.fc.parameters(), 'lr': 1e-3} ], momentum=0.9) # 调度器配置 scheduler = StepLR(optimizer, step_size=10, gamma=0.1) for epoch in range(epochs): # 训练... scheduler.step() # ✅ 正确调用 ``` #### 量化训练的特殊处理 进行量化感知训练(QAT)时,调度器调用方式相同: ```python for nepoch in range(8): train_one_epoch(qat_model, criterion, optimizer, data_loader) # 冻结量化器参数 if nepoch > 3: qat_model.apply(torch.ao.quantization.disable_observer) scheduler.step() # ✅ 正确调用[^2] ``` #### 学习率调试技巧 1. **实时监控学习率**: ```python print(f"Epoch {epoch}: LR = {optimizer.param_groups[0]['lr']:.6f}") ``` 2. **自定义学习率调整**: ```python def adjust_learning_rate(optimizer, epoch): """手动调整学习率示例""" lr = 0.01 * (0.1 ** (epoch // 30)) for param_group in optimizer.param_groups: param_group['lr'] = lr for epoch in range(100): adjust_learning_rate(optimizer, epoch) # 自定义调整[^1] # 不再需要 scheduler.step() ``` #### 版本兼容性建议 | PyTorch 版本 | 调度器调用方式 | 注意事项 | |-------------|---------------|----------| | <1.4 | `scheduler.step(epoch)` | 旧版本兼容 | | ≥1.4 | `scheduler.step()` | 推荐方式 | | ≥2.0 | `scheduler.step()` | 必须使用 | > **最佳实践**:始终使用无参数的 `scheduler.step()` 调用方式,这是 PyTorch 官方推荐的标准做法[^1][^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李大数

工作如蚂蚁,生活似蝴蝶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值