pytorch evaluate model(torch.no_grad() and model.eval())

  • 使用 torch.no_grad():这是一个上下文管理器(context manager),用于暂时禁用在其作用域内的所有计算的梯度计算。这在模型评估阶段非常有用,因为它可以减少内存消耗并提高计算效率,因为验证过程中不需要计算梯度信息。

  • 调用 model.eval():这将模型设置为评估模式。在这种模式下,模型中的某些层(如批量归一化层 BatchNorm 和 dropout 层)会改变其行为,以适应评估(例如,BatchNorm 层会使用在训练时收集的运行时统计数据,而 dropout 层会关闭)。

import torch
from torch.utils.data import DataLoader
from sklearn.metrics import accuracy_score

def evaluate_model(model, data_loader, device):
    """
    对给定的模型和数据加载器进行验证。
    
    参数:
    - model: 要验证的PyTorch模型。
    - data_loader: 数据的PyTorch DataLoader。
    - device: 用于模型和数据的设备('cuda' 或 'cpu')。
    """
    # 将模型设置为评估模式,这会关闭dropout和batch normalization层的训练行为
    model.eval()
    
    # 初始化度量指标
    total_correct = 0
    total_samples = 0
    
    # 使用torch.no_grad()上下文管理器来禁用梯度计算
    with torch.no_grad():
       # 遍历数据加载器中的所有批次
        for inputs, targets in data_loader:
            # 将数据移动到指定的设备
            inputs, targets = inputs.to(device), targets.to(device)
            
            # 前向传播,获取模型输出
            outputs = model(inputs)
            
            # 计算预测结果
            _, predicted = torch.max(outputs, 1)
            
            # 计算准确度
            correct = (predicted == targets).sum().item()
            
            total_correct += correct
            total_samples += targets.size(0)
    
    # 计算总体准确度
    accuracy = total_correct / total_samples
    
    return accuracy

# -*- coding: utf-8 -*- import numpy as np import torch import torch.nn as nn import torch.optim as optim from pypuf.simulation import ArbiterPUF from pypuf.io import random_inputs from sklearn.model_selection import train_test_split # ========== 1. 定义神经网络模型 ========== class APUFModel(nn.Module): def __init__(self, input_size): super(APUFModel, self).__init__() self.fc = nn.Sequential( nn.Linear(input_size, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 1), nn.Sigmoid() ) def forward(self, x): return self.fc(x) # ========== 2. 权重保存函数 ========== def save_weights_to_csv(weights, filename): """保存模型权重到CSV文件""" if isinstance(weights, torch.Tensor): weights = weights.detach().numpy() np.savetxt(filename, weights, delimiter=',') # ========== 3. 创建APUF实例 ========== n = 64 apuf = ArbiterPUF(n=n, noisiness=0, seed=1) # ========== 4. 生成CRP数据集 ========== num_crps = 100000 challenges = random_inputs(n=n, N=num_crps, seed=2) responses = apuf.eval(challenges) # 转换为PyTorch Tensor X = challenges.reshape(num_crps, n).astype(np.float32) y = ((responses + 1) // 2).astype(np.float32).reshape(-1, 1) # ========== 5. 划分数据集 ========== X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, random_state=42 ) # 转换为PyTorch Dataset train_dataset = torch.utils.data.TensorDataset( torch.from_numpy(X_train), torch.from_numpy(y_train) ) test_dataset = torch.utils.data.TensorDataset( torch.from_numpy(X_test), torch.from_numpy(y_test) ) # ========== 6. 初始化模型和优化器 ========== model = APUFModel(input_size=n) criterion = nn.BCELoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # ========== 7. 训练前保存初始权重 ========== initial_weights = model.fc[0].weight.data.clone() save_weights_to_csv(initial_weights, "initial_weights.csv") # ========== 8. 训练循环 ========== batch_size = 512 train_loader = torch.utils.data.DataLoader( train_dataset, batch_size=batch_size, shuffle=True ) test_loader = torch.utils.data.DataLoader( test_dataset, batch_size=batch_size ) best_accuracy = 0.0 early_stop = False for epoch in range(100): # 最大100个epoch if early_stop: break # 训练阶段 model.train() for inputs, labels in train_loader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() # 验证阶段 model.eval() correct = 0 total = 0 with torch.no_grad(): for inputs, labels in test_loader: outputs = model(inputs) predicted = (outputs > 0.5).float() total += labels.size(0) correct += (predicted == labels).sum().item() accuracy = correct / total print(f"Epoch {epoch+1}: 准确率 {accuracy:.2%}") # 准确率达标则停止 if accuracy > 0.90: print(f"达到90%准确率,提前终止训练!") early_stop = True # ========== 9. 训练后保存最终权重 ========== final_weights = model.fc[0].weight.data.clone() save_weights_to_csv(final_weights, "final_weights.csv") # ========== 10. 验证最终结果 ========== model.eval() with torch.no_grad(): test_outputs = model(torch.from_numpy(X_test)) test_predicted = (test_outputs > 0.5).float() final_accuracy = (test_predicted.numpy() == y_test).mean() print(f"\n最终测试准确率: {final_accuracy:.2%}") print("初始权重已保存至 initial_weights.csv") print("最终权重已保存至 final_weights.csv") 这些是使用pytorch来实现的,现在将pytorch替换为tensorflow来实现相同的功能
03-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Yuezero_

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值