侧边栏壁纸
博主头像
Zeeland

The mixture of software dev+Iot+ml+anything

  • 累计撰写 60 篇文章
  • 累计创建 45 个标签
  • 累计收到 7 条评论

目 录CONTENT

文章目录

当我用ChatGPT中学习CNN卷积神经网络

Zeeland
2022-12-10 / 0 评论 / 0 点赞 / 348 阅读 / 1,757 字

Introduction

ChatGPT大火,在这一段时间并没有觉得ChatGPT特别厉害,最多就是一个基于生成式对话的NLP模型罢了,直到我看到了AI扮演Linux虚拟机,能管理文件&编程&开浏览器,还能跟自己「套娃」聊天 | ChatGPT新玩法,于是好奇的我打算去讨教一下ChatGPT,于是就有了以下的场面。

我和ChatGPT的对话

Q: 现在你需要给出一个详细基于CNN和Pytorch预测mnist的过程和解释,并附上一个example

ChatGPT:
让我们来讲解一下如何使用CNN和PyTorch来预测MNIST数据集。

首先,MNIST数据集是一个手写数字识别数据集,包含60000张训练图片和10000张测试图片。每张图片都是28x28像素的灰度图片,并且包含0到9的数字。

首先,我们需要安装PyTorch。要安装PyTorch,请执行以下操作:

  1. 安装Anaconda(如果您还没有安装)。
  2. 打开终端/命令提示符,并使用以下命令安装PyTorch:
conda install pytorch torchvision -c pytorch

安装完成后,我们可以开始编写代码。首先,我们需要导入一些必要的库,如下所示:

import torch
import torchvision
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim

然后,我们需要准备MNIST数据集。为此,我们可以使用PyTorch的 torchvision 库来下载和加载MNIST数据集,如下所示:

train_dataset = torchvision.datasets.MNIST(root='./data', train=True, transform=torchvision.transforms.ToTensor(), download=True)
test_dataset = torchvision.datasets.MNIST(root='./data', train=False, transform=torchvision.transforms.ToTensor(), download=True)

接下来,我们需要将数据集分成两部分,一部分用于训练,另一部分用于验证。为此,我们可以使用PyTorch中的 DataLoader 函数,

Q: 继续

ChatGPT:
好的,接下来我们需要使用PyTorch的DataLoader函数来将数据集分成训练集和验证集,如下所示:

train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=64, shuffle=False)

现在,我们需要定义一个网络模型来进行图像分类。为此,我们可以定义一个继承自nn.Module的类,并定义其中的前向传播函数,如下所示:

class CNN(nn.Module):
    def __init__(self):
        super(CNN, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=16, kernel_size=5, stride=1, padding=2)
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=5, stride=1, padding=2)
        self.fc1 = nn.Linear(32 * 7 * 7, 10)
    
    def forward(self, x):
        x = self.pool(F.relu(self.conv1(x)))
        x = self.pool(F.relu(self.conv2(x)))
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        return x

这里我们定义了一个包含两个卷积层和两个池化层的网络,并使用一个全连接层将最后的特征映射到输出类别。

接下来,我们需要定义一个损失函数来计算预测和真实值之间的差距。在这里,我们使用交叉熵损失函数,如下所示:

Q: 继续

ChatGPT:
好的,接下来我们定义交叉熵损失函数,如下所示:

criterion = nn.CrossEntropyLoss()

接下来,我们需要定义一个优化器来更新网络参数。在这里,我们使用随机梯度下降(SGD)优化器,并指定学习率为0.01,如下所示:

optimizer = optim.SGD(model.parameters(), lr=0.01)

现在我们已经准备好训练网络了。为此,我们需要迭代训练数据集中的每一个批次,并在每个批次上运行以下步骤:

  1. 将数据输入网络,并使用前向传播函数计算预测值。
  2. 计算损失函数的值。
  3. 计算损失函数的梯度。
  4. 使用优化器更新网络参数。

下面是完整的训练过程:

# 训练网络
for epoch in range(5):
    for batch_idx, (data, targets) in enumerate(train_loader):
        # 计算预测值
        outputs = model(data)
        # 计算损失函数
        loss = criterion(outputs, targets)
        # 梯度清零
        optimizer.zero_grad()
        # 反向传播
        loss.backward()
        # 更新参数
        optimizer.step()

最后,我们可以使用测试数据集来评估网络的性能。为此,我们可以迭代测试数据集中的每一个批次。

Q: 继续

ChatGPT:
好的,接下来我们使用测试数据集来评估网络的性能。为此,我们可以迭代测试数据集中的每一个批次,并在每个批次上运行以下步骤:

  1. 将数据输入网络,并使用前向传播函数计算预测值。
  2. 计算损失函数的值。
  3. 计算精度。

下面是完整的评估过程:

# 评估网络
model.eval()
with torch.no_grad():
    correct = 0
    total = 0
    for data, targets in test_loader:
        outputs = model(data)
        _, predicted = torch.max(outputs.data, 1)
        total += targets.size(0)
        correct += (predicted == targets).sum().item()
    print('精度:{}%'.format(100 * correct / total))

这就是使用CNN和PyTorch预测MNIST数据集的一个完整示例。希望这对你有所帮助。

Summary

事实上我被震惊到了,从上文的对话可以看到,我唯一做的事情就是“继续”,所有的工作都是ChatGPT做完的,从ChatGPT介绍了数据预处理、CNN构建、训练到预测的一整套方法论,从一定程度上说,他就是一个知识渊博的人,所以是否可以将它作为一个搜索引擎+老师的复合体,使用ChatGPT进行学习呢?

我曾经一直很关注人工智能的伦理问题,包括如果人工智能拥有类人的智慧,它是否可以被定义为人等问题,我想未来几年人工智能的伦理问题会越来越凸显,事实上,我们可以看到,基本每年机器学习领域都会有一些让人意向不到的扩展面技术出来,这些技术和运用不仅在某些程度上会取代一部分人类的工作,更会催生出一些新的领域和行业,从一个方面说,这或许是创新驱动发展的一种体现?从另外一个方面来说,当前人类社会的价值观是否能够跟上这样高速发展地科技水平呢?

在未来,人工智能的伦理问题及其带来的矛盾会逐渐凸显,一方面,这是一个很好的发展机遇,另一方面,人类更需要好好地审视一下人类社会发展的意义,审视一下哲学三问,以及我们需要构建一个怎样的科技树?

0

评论区