pytorch 加载模型参数后 如何测试数据,应用模型预测数据,然后连续变量转换成 list 或者numpy.array padans并保存到csv文件中

news2024/9/23 9:22:58

在PyTorch中,加载模型参数后测试数据通常涉及以下几个步骤:

1. **加载模型**:首先,你需要定义模型的结构,然后加载预训练的参数。

2. **加载数据**:准备你的测试数据集。确保数据集已经正确地预处理,以匹配训练时的格式。

3. **设置模型为评估模式**:在进行推理之前,将模型设置为评估模式,这会关闭Dropout和Batch Normalization层的训练行为。

4. **进行推理**:遍历测试数据集,使用模型进行预测。

5. **评估模型**:根据模型的输出和测试数据集的真实标签计算性能指标,如准确率、损失等。

下面是一个简化的代码示例,展示了这个过程:

```python
import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets, transforms

# 假设我们有一个预定义的模型结构
class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        # 定义模型层
        # ...

    def forward(self, x):
        # 定义前向传播
        # ...
        return x

# 实例化模型
model = MyModel()

# 加载预训练的模型参数
model.load_state_dict(torch.load('model_parameters.pth'))

# 设置为评估模式
model.eval()

# 准备测试数据集
transform = transforms.Compose([
    transforms.ToTensor(),
    # 其他必要的转换
])
test_dataset = datasets.MNIST(root='./data', train=False, transform=transform)
test_loader = DataLoader(test_dataset, batch_size=64, shuffle=False)

# 测试模型
correct = 0
total = 0
with torch.no_grad():  # 不计算梯度,节省计算资源
    for data in test_loader:
        images, labels = data
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

# 计算准确率
accuracy = 100 * correct / total
print(f'Accuracy of the model on the test images: {accuracy}%')
```

在这个例子中,我们首先定义了一个模型类`MyModel`,然后加载了模型参数。接着,我们设置了模型为评估模式,并准备了一个测试数据集。最后,我们遍历测试数据集,计算模型的准确率。


如何预测呢

在PyTorch中进行预测通常涉及以下步骤:

1. **加载模型**:确保你的模型已经加载了预训练的参数。

2. **设置模型为评估模式**:使用`model.eval()`将模型设置为评估模式,这样可以关闭Dropout和Batch Normalization等仅在训练时使用的层。

3. **准备输入数据**:确保你的输入数据是正确的格式,并且已经进行了适当的预处理,比如缩放、归一化等。

4. **进行预测**:将输入数据传递给模型,获取输出。

5. **处理输出**:根据模型的输出进行后处理,比如转换为概率、选择最可能的类别等。

下面是一个具体的代码示例,展示如何使用PyTorch进行预测:

```python
import torch
from torchvision import transforms
from PIL import Image

# 假设模型已经加载并设置为评估模式
model.eval()

# 定义图像的预处理
transform = transforms.Compose([
    transforms.Resize((224, 224)),  # 调整图像大小
    transforms.ToTensor(),  # 将图像转换为Tensor
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 归一化
])

# 加载图像
image = Image.open("path_to_your_image.jpg")
image = transform(image).unsqueeze(0)  # 增加一个批次维度

# 进行预测
with torch.no_grad():  # 不计算梯度
    outputs = model(image)

# 将输出转换为概率
probabilities = torch.nn.functional.softmax(outputs, dim=1)

# 获取最大概率的索引,即预测的类别
_, predicted = torch.max(probabilities, 1)

# 打印预测结果
print(f"Predicted class: {predicted.item()}")
```

### 详细步骤解释:

1. **加载模型**:
   ```python
   model.eval()
   ```
   使用`model.eval()`将模型设置为评估模式。

2. **定义图像预处理**:
   ```python
   transform = transforms.Compose([
       transforms.Resize((224, 224)),  # 调整图像大小
       transforms.ToTensor(),  # 将图像转换为Tensor
       transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])  # 归一化
   ])
   ```
   使用`transforms.Compose`定义一系列预处理步骤,包括调整图像大小、转换为Tensor和归一化。

3. **加载图像**:
   ```python
   image = Image.open("path_to_your_image.jpg")
   image = transform(image).unsqueeze(0)  # 增加一个批次维度
   ```
   使用`PIL`库加载图像,并应用预处理。`unsqueeze(0)`用于增加一个批次维度,因为模型期望批次维度。

4. **进行预测**:
   ```python
   with torch.no_grad():  # 不计算梯度
       outputs = model(image)
   ```
   使用`torch.no_grad()`禁用梯度计算,这样可以节省内存并加速预测。将处理后的图像传递给模型,获取输出。

5. **处理输出**:
   ```python
   probabilities = torch.nn.functional.softmax(outputs, dim=1)
   _, predicted = torch.max(probabilities, 1)
   ```
   使用`softmax`函数将模型输出转换为概率分布,然后使用`torch.max`获取最大概率的索引,即预测的类别。

6. **打印预测结果**:
   ```python
   print(f"Predicted class: {predicted.item()}")
   ```
   打印预测的类别。

这个示例展示了如何使用PyTorch进行图像分类的预测。如果你有其他类型的数据或任务(如回归、生成任务等),预测步骤可能会有所不同,但基本流程是类似的。如果你有具体的模型或任务,我可以提供更详细的帮助。
 

with torch.no_grad():

   test_result = model(X_test)、

在PyTorch中,使用`with torch.no_grad():`块来执行模型的推理是一种常见的做法,特别是在进行预测或评估模型时。这个上下文管理器的作用是告诉PyTorch在这个代码块内不需要计算梯度,这样可以节省内存和计算资源。

当你写:

```python
with torch.no_grad():
    test_result = model(X_test)
```

这意味着你正在将输入数据`X_test`传递给模型,并获取模型的输出,存储在变量`test_result`中。由于你已经处于`torch.no_grad()`上下文中,PyTorch不会跟踪在这个块内进行的任何操作的梯度,这对于推理阶段是必要的,因为在推理阶段你不需要进行反向传播。

这里的`X_test`应该是你的测试数据,它需要是适当的PyTorch张量格式,并且已经经过了与训练时相同的预处理步骤。

以下是使用这段代码进行预测的完整示例:

```python
import torch
from torch.utils.data import DataLoader

# 假设 model 已经被定义并加载了预训练的参数
model.eval()

# 假设 X_test 是你的测试数据集,这里是一个简化的例子
# 你需要根据你的数据集实际情况来加载和预处理数据
# X_test = ...

# 测试数据加载器
test_loader = DataLoader(X_test, batch_size=64, shuffle=False)

# 存储预测结果
predictions = []

# 不计算梯度,进行预测
with torch.no_grad():
    for data in test_loader:
        outputs = model(data)
        _, predicted = torch.max(outputs.data, 1)
        predictions.extend(predicted.cpu().numpy())

# 现在 predictions 包含了所有测试数据的预测结果
```

在这个例子中,我们遍历了测试数据加载器`test_loader`中的所有数据,对每个批次的数据进行预测,并将预测结果存储在`predictions`列表中。注意,我们使用`.cpu().numpy()`将预测结果从PyTorch张量转换为NumPy数组,以便进一步处理或评估。

请确保你的`X_test`数据是正确预处理的,并且模型`model`已经设置为评估模式(`model.eval()`)。如果你需要进一步的帮助来准备数据或评估模型,请提供更多的信息。


 

转换成文本 保存到csv中

要将模型的预测结果`test_result`转换成文本并保存到CSV文件中,你可以使用Python的`csv`模块或`pandas`库。以下是使用`pandas`库将结果保存到CSV文件的步骤:

首先,确保你已经安装了`pandas`库。如果没有安装,可以使用`pip`安装它:

```bash
pip install pandas
```

然后,你可以使用以下代码将预测结果保存到CSV文件中:

```python
import torch
import pandas as pd

# 假设 model 已经被定义并加载了预训练的参数
model.eval()

# 假设 X_test 是你的测试数据集
# 你需要根据你的数据集实际情况来加载和预处理数据
# X_test = ...

# 进行预测
with torch.no_grad():
    test_result = model(X_test)

# 将预测结果转换成CPU上的numpy数组(如果它们不在CPU上)
# 并且转换成一维数组(如果它们是多维的)
# 这里假设test_result是多维的,我们取每个样本的预测类别
_, predicted = torch.max(test_result, 1)
predicted = predicted.cpu().numpy()

# 将预测结果转换成DataFrame
df = pd.DataFrame(predicted, columns=['Predicted_Class'])

# 保存到CSV文件
df.to_csv('predictions.csv', index=False)
```

在这段代码中,我们首先使用`torch.max`获取每个测试样本的预测类别,然后使用`.cpu().numpy()`将它们转换为NumPy数组。接着,我们创建了一个`pandas` DataFrame,并将这个DataFrame保存到名为`predictions.csv`的CSV文件中。`index=False`参数的作用是在保存时不包括行索引。

如果你的预测结果是概率或其他连续值,你可能需要根据你的需求调整代码来保存这些值。

如果你不想使用`pandas`,也可以使用Python的内置`csv`模块,如下所示:

```python
import torch
import csv

# 进行预测
with torch.no_grad():
    test_result = model(X_test)

# 将预测结果转换成CPU上的numpy数组
test_result = test_result.cpu().numpy()

# 打开一个文件用于写入
with open('predictions.csv', 'w', newline='') as file:
    writer = csv.writer(file)
    # 写入标题(如果有的话)
    writer.writerow(['Predicted_Class'])
    # 写入预测结果
    for row in test_result:
        writer.writerow(row)
```

在这个例子中,我们使用`csv.writer`对象来写入CSV文件。我们首先写入标题行(如果你有多个预测值,可以在这里添加更多的标题),然后遍历`test_result`数组,将每一行写入文件。记得在打开文件时使用`newline=''`参数,以防止在写入时出现额外的空行。
 

y_test.view(batch_size, datalen//batch_size, 1) 如何变成一个维度的张量呢

在PyTorch中,如果你想要将一个多维张量(例如,一个形状为`(batch_size, datalen//batch_size, 1)`的张量)变成一个一维张量,你可以使用`view`方法或者`reshape`方法来改变张量的形状,但要保持总元素数量不变。对于你提到的张量,我们可以通过移除中间的维度来实现这一点。

这里有两种方法可以实现:

### 方法1: 使用`view`方法
`view`方法可以重新排列张量的形状,但要求新形状的元素总数与原形状相同。对于你的例子,如果你想将`(batch_size, datalen//batch_size, 1)`形状的张量变为一维,可以这样做:

```python
# 假设 y_test 是一个形状为 (batch_size, datalen//batch_size, 1) 的张量
y_test_flattened = y_test.view(-1)  # '-1' 让 PyTorch 自动计算这个维度的大小
```

这里,`-1`告诉PyTorch自动计算这个维度的大小,以便保持总元素数量不变。这将使`y_test`变为一个一维张量。

### 方法2: 使用`reshape`方法
`reshape`方法与`view`类似,但`reshape`在某些情况下更灵活,因为它可以处理非连续张量。如果原始张量不是连续的,`reshape`会尝试返回一个视图,如果不可能,它会复制数据到一个新的连续张量。

```python
# 同样假设 y_test 是一个形状为 (batch_size, datalen//batch_size, 1) 的张量
y_test_flattened = y_test.reshape(-1)
```

### 检查结果
无论使用哪种方法,你都可以通过打印`y_test_flattened.shape`来验证结果,确保它现在是一维的。

### 注意
- 确保在调用`view`或`reshape`之前,张量是连续的。如果不是,你可能需要先调用`y_test.contiguous()`。
- 这两种方法都不会改变原始数据,它们只是改变了数据的视图。

这样,你就可以将任何形状的张量转换为一维张量,这对于某些操作(如保存到文件、进行某些类型的计算等)非常有用。
 

然后转换成 list 或者numpy.array 并保存到csv文件中

要将PyTorch张量转换成列表或NumPy数组,并保存到CSV文件中,你可以按照以下步骤操作:

### 1. 将张量转换为NumPy数组

首先,确保你的张量在CPU上(如果它在GPU上),然后使用`.numpy()`方法将其转换为NumPy数组。

```python
import torch

# 假设 y_test_flattened 是一个形状为 (batch_size * (datalen//batch_size),) 的一维张量
y_test_flattened = y_test.view(-1)

# 确保张量在CPU上
y_test_flattened = y_test_flattened.cpu()

# 转换为NumPy数组
y_test_numpy = y_test_flattened.numpy()
```

### 2. 将NumPy数组保存到CSV文件

使用NumPy的`savetxt`函数,你可以将数组保存到CSV文件中。

```python
import numpy as np

# 保存到CSV文件
np.savetxt('output.csv', y_test_numpy, delimiter=',', fmt='%d')
```

在这里,`fmt='%d'`指定了数组中的整数应该以整数格式保存。如果你的数据是浮点数,你可以使用`fmt='%.18e'`(或其他精度)来保存。

### 3. 使用Pandas保存到CSV

如果你更喜欢使用Pandas,这也是一个不错的选择,特别是当你需要更多的格式化选项时。

```python
import pandas as pd

# 将NumPy数组转换为DataFrame
df = pd.DataFrame(y_test_numpy, columns=['Label'])

# 保存到CSV文件
df.to_csv('output.csv', index=False)
```

这里,我们创建了一个单列的DataFrame,并将其保存到CSV文件中。`index=False`参数确保不将行索引写入文件。

### 完整示例

将以上步骤合并,得到一个完整的示例:

```python
import torch
import numpy as np
import pandas as pd

# 假设 y_test 是一个形状为 (batch_size, datalen//batch_size, 1) 的张量
y_test_flattened = y_test.view(-1).cpu()

# 转换为NumPy数组
y_test_numpy = y_test_flattened.numpy()

# 使用Pandas保存到CSV
df = pd.DataFrame(y_test_numpy, columns=['Label'])
df.to_csv('output.csv', index=False)
```

这个示例展示了如何将PyTorch张量转换为NumPy数组,然后使用Pandas将其保存到CSV文件中。这种方法适用于处理任何类型的数值数据,并可以轻松地调整以满足你的特定需求。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2157178.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis数据结构之list列表

一.list列表 列表相当于数组或者顺序表 它里面的元素是有序的,也就是可以通过下标进行访问。这里的有序的含义是要根据上下文区分的,有的时候,有序指的是升序/降序,有的时候有序指的是顺序很关键,俩个元素交换后就不…

Spring6梳理10—— 依赖注入之注入数组类型属性

以上笔记来源: 尚硅谷Spring零基础入门到进阶,一套搞定spring6全套视频教程(源码级讲解)https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 10 依赖注入之注入数组类型属性 10.1 创建Emp实体类,Dept实体类 10.2…

Java 每日一刊(第15期):内部类

文章目录 前言内部类成员内部类(Member Inner Class)静态内部类(Static Nested Class)局部内部类(Local Inner Class)匿名内部类(Anonymous Inner Class) 内部类的详细对比内部类字节…

浅谈Spring Cloud:Nacos的配置

Nacos,一个更易于构建云原生应用的动态服务发现,配置管理和服务管理平台。所以Nacos是⼀个注册中心组件,但它又不仅仅是注册中心组件。 目录 安装 注册 负载均衡 环境隔离 配置管理 搭建集群 安装 在官网下载好安装包解压后&#xf…

深度学习01-概述

深度学习是机器学习的一个子集。机器学习是实现人工智能的一种途径,而深度学习则是通过多层神经网络模拟人类大脑的方式进行学习和知识提取。 深度学习的关键特点: 1. 自动提取特征:与传统的机器学习方法不同,深度学习不需要手动…

手机在网状态查询接口如何用Java进行调用?

一、什么是手机在网状态查询接口? 手机在网状态查询接口,又叫运营商在网状态查询,手机号在网状态查询,传入手机号码,查询该手机号的在网状态,返回内容有正常使用、停机、在网但不可用、不在网(…

【网络】高级IO——epoll版本TCP服务器初阶

目录 前言 一,epoll的三个系统调用接口 1.1.epoll_create函数 1.1.1.epoll_create函数干了什么 1.2. epoll_ctl函数 1.2.1.epoll_ctl函数函数干了什么 1.3.epoll_wait函数 1.3.1.epoll_wait到底干了什么 1.4.epoll的工作过程中内核在干什么 二,…

【Elasticsearch系列廿】Logstash 学习

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

PostgreSQL 的log_hostname 参数测试

PostgreSQL 的log_hostname 参数测试 log_hostname 是 PostgreSQL 配置文件 (postgresql.conf) 中的一个参数,用于控制是否在日志条目中记录客户端主机名。默认情况下,PostgreSQL 只记录客户端的IP地址,而 log_hostname 参数允许数据库管理员…

【最基础最直观的排序 —— 冒泡排序算法】

最基础最直观的排序 —— 冒泡排序算法 冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法,属于交换排序。其基本思想是在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数&am…

农产品商城系统小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,产品分类管理,热销农产品管理,订单管理,系统管理 微信端账号功能包括:系统首页,热销弄产品,网站公告&#…

基于c++实现的简易shell

代码逻辑 核心思想 解析命令行,拆解命令及其选项创建子进程,在子进程中执行命令如果是前台执行命令,则父进程就阻塞等待子进程中命令执行结束后回收子进程的资源如果是后台执行命令,则父进程不进行阻塞等待,可继续向下…

STM32 软件触发ADC采集

0.91寸OLED屏幕大小的音频频谱,炫酷! STM32另一个很少人知道的的功能——时钟监测 晶振与软件的关系(深度理解) STM32单片机一种另类的IO初始化方法 ADC是一个十分重要的功能,几乎任何一款单片机都会包含这个功能&a…

记一次MySQL索引不当引发死锁问题

一、前言 在并发量很低的情况下,mysql 的响应时延一切正常,一旦并发量上去了,mysql就会出现死锁的情况,你有没有遇到过?到底是是什么原因导致的呢,让我们一起看看真实的案例。 二、遇到的问题 先介绍一下…

LabVIEW提高开发效率技巧----利用第三方库和工具

LabVIEW开发不仅依赖于自身强大的图形化编程能力,还得益于其庞大的用户社区和丰富的第三方库。这些工具和库能够帮助开发者快速解决问题,提升开发效率,避免从头开始编写代码。 1. LabVIEW工具网络(NI Tools Network) …

MateBook 16s 2023在Deepin下开启性能模式,调节风扇转速到最大,全网首发!

方法 在Deepin下按住Fnp快捷键,开启性能模式。 验证 首先去debian下载acpi-call-dkms https://packages.debian.org/sid/all/acpi-call-dkms/download 然后使用root用户执行: apt install --simulate ./acpi-call-dkms_1.2.2-2.1_all.deb apt inst…

LeetCode 面试经典150题 191.位1的个数

Java中的算术右移和逻辑右移的区别 题目:编写一个函数,获取一个正整数的二进制形式并返回其二进制表达式中设置位的个数(也被称为汉明重量)。 设置位的个数即二进制中1的个数。 思路:方法一:因为正数的原…

基于阿里云免费部署Qwen1-8B-chat模型并进行lora参数微调从0到1上手操作

文章目录 一、申请资源二、创建实例三、克隆微调数据四、部署Qwen1-8B-chat模型1、环境配置2、模型下载3、本地模型部署 五、模型微调1、拉取Qwen仓库源码2、微调配置3、合并微调参数4、本地部署微调模型 一、申请资源 阿里云账号申请PAI资源详细教程我已于部署ChatGLM3时写过…

Golang | Leetcode Golang题解之第430题扁平化多级双向链表

题目: 题解: func dfs(node *Node) (last *Node) {cur : nodefor cur ! nil {next : cur.Next// 如果有子节点,那么首先处理子节点if cur.Child ! nil {childLast : dfs(cur.Child)next cur.Next// 将 node 与 child 相连cur.Next cur.Chi…

遗传算法与深度学习实战(14)——进化策略详解与实现

遗传算法与深度学习实战(14)——进化策略详解与实现 0. 前言1. 进化策略1.1 进化策略原理1.2 将进化策略应用于函数逼近 2. 实现进化策略小结系列链接 0. 前言 进化策略 (Evolutionary Strategies, ES) 是进化计算和遗传方法的扩展,增加了控…