本文节选自本人博客:https://www.blog.zeeland.cn/archives/chatgpt-asoihgoihrx
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,请执行以下操作:
- 安装Anaconda(如果您还没有安装)。
- 打开终端/命令提示符,并使用以下命令安装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)
现在我们已经准备好训练网络了。为此,我们需要迭代训练数据集中的每一个批次,并在每个批次上运行以下步骤:
- 将数据输入网络,并使用前向传播函数计算预测值。
- 计算损失函数的值。
- 计算损失函数的梯度。
- 使用优化器更新网络参数。
下面是完整的训练过程:
# 训练网络
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:
好的,接下来我们使用测试数据集来评估网络的性能。为此,我们可以迭代测试数据集中的每一个批次,并在每个批次上运行以下步骤:
- 将数据输入网络,并使用前向传播函数计算预测值。
- 计算损失函数的值。
- 计算精度。
下面是完整的评估过程:
# 评估网络
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进行学习呢?
我曾经一直很关注人工智能的伦理问题,包括如果人工智能拥有类人的智慧,它是否可以被定义为人等问题,我想未来几年人工智能的伦理问题会越来越凸显,事实上,我们可以看到,基本每年机器学习领域都会有一些让人意向不到的扩展面技术出来,这些技术和运用不仅在某些程度上会取代一部分人类的工作,更会催生出一些新的领域和行业,从一个方面说,这或许是创新驱动发展的一种体现?从另外一个方面来说,当前人类社会的价值观是否能够跟上这样高速发展地科技水平呢?
在未来,人工智能的伦理问题及其带来的矛盾会逐渐凸显,一方面,这是一个很好的发展机遇,另一方面,人类更需要好好地审视一下人类社会发展的意义,审视一下哲学三问,以及我们需要构建一个怎样的科技树?