<从零开始pytorch>:03-torch构建模型实现鸢尾花数据分类

Mnist数据集进行分类

主要内容:
数据读取 – 路径设置、数据加载
自定义模型MyMnist_NN
自定义损失函数loss_func
自定义fit
[详情看目录]

# 1.读取Mnist数据集
%matplotlib inline
from pathlib import Path
import requests
from matplotlib import pyplot
import numpy as np

1.获取数据

  • 路径设置和怎样加载数据要多回顾!!

1.1 路径设置

DATA_PATH = Path("data")
PATH = DATA_PATH / "mnist"

PATH.mkdir(parents=True, exist_ok=True)

URL = "http://deeplearning.net/data/mnist/"
FILENAME = "mnist.pkl.gz"

if not (PATH / FILENAME).exists():
        content = requests.get(URL + FILENAME).content
        (PATH / FILENAME).open("wb").write(content)

1.2 加载读取数据

import pickle
import gzip

with gzip.open((PATH / FILENAME).as_posix(), "rb") as f:
        ((x_train, y_train), (x_valid, y_valid), _) = pickle.load(f, encoding="latin-1")

1.3 展示数据

# x_train[i]是一个784维的向量,将其转换为28 * 28的二维矩阵显示出来,是图像形式
# imshow()可以传入二维矩阵(M,N) / 三维(M,N,3) /三维(M.N,4)
pyplot.imshow(x_train[1].reshape((28, 28)), cmap="gray") 
print(x_train.shape)
(50000, 784)

# 此时x_train是ndarray数组
x_train 
array([[0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.]], dtype=float32)
  • 将其转换为tensor后才能进行建模训练
import torch 
x_train,y_train,x_valid,y_valid = map(
    torch.tensor,(x_train,y_train,x_valid,y_valid)
)
x_train # 此时是tensor
tensor([[0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        ...,
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.],
        [0., 0., 0.,  ..., 0., 0., 0.]])
# 查看下标签值的范围最大值和最小值的函数!第一次见
y_train.min(),y_train.max()
(tensor(0), tensor(9))

2.torch.nn.functional的层和函数功能展示

import torch
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是利用 PyTorch 构建神经网络,实现尾花分类的代码和步骤。 ## 数据载入 首先,我们需要载入尾花数据集。PyTorch 提供了一个内置的 `torchvision.datasets` 模块,可以轻松地下载和使用许多常见的数据集。 ```python import torch import torchvision.datasets as datasets # 下载并载入尾花数据集 iris_data = datasets.Iris(root='data/', train=True, transform=None, target_transform=None, download=True) ``` ## 数据处理 接下来,我们需要对数据进行处理。我们需要将数据集分成训练集和测试集,并将每个样本的特征标准化,以便神经网络更好地进行学习。 ```python from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler # 将数据集分成训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(iris_data.data, iris_data.target, test_size=0.2, random_state=42) # 对特征进行标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 将数据转换为 PyTorch 张量 X_train = torch.tensor(X_train, dtype=torch.float32) X_test = torch.tensor(X_test, dtype=torch.float32) y_train = torch.tensor(y_train, dtype=torch.long) y_test = torch.tensor(y_test, dtype=torch.long) ``` ## 构建模型 接下来,我们需要构建神经网络模型。我们将使用一个简单的三层全连接神经网络,其中包含两个隐藏层。 ```python import torch.nn as nn import torch.nn.functional as F class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(4, 16) self.fc2 = nn.Linear(16, 16) self.fc3 = nn.Linear(16, 3) def forward(self, x): x = F.relu(self.fc1(x)) x = F.relu(self.fc2(x)) x = self.fc3(x) return x model = Net() ``` ## 训练模型 现在我们已经准备好训练我们的模型了。我们将使用交叉熵损失函数和随机梯度下降优化器进行训练。 ```python import torch.optim as optim criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=0.1) for epoch in range(100): running_loss = 0.0 for i in range(len(X_train)): optimizer.zero_grad() outputs = model(X_train[i]) loss = criterion(outputs.unsqueeze(0), y_train[i].unsqueeze(0)) loss.backward() optimizer.step() running_loss += loss.item() print('[%d] loss: %.3f' % (epoch + 1, running_loss / len(X_train))) ``` ## 测试模型 最后,我们使用测试集上的数据来评估我们的模型的性能。 ```python correct = 0 total = 0 with torch.no_grad(): for i in range(len(X_test)): outputs = model(X_test[i]) _, predicted = torch.max(outputs.data, 0) total += 1 correct += (predicted == y_test[i]).sum().item() print('Accuracy: %d %%' % (100 * correct / total)) ``` 完成!我们现在已经成功地使用 PyTorch 构建了一个神经网络模型,并使用它对尾花数据集进行了分类
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值