都说人工智能生成式AI无所不能,今天来小测验一下,看它能否教会我们学会人工智能自己。首先向它提一个AI领域经典问题,写一段手写字识别的Python代码,我们可以看到AI帮我们生成代码了,但是由于我们还没有AI知识,我们并不理解这些代码的含义,看不懂。

AI自动生成代码
import torchimport torch.nn as nnimport torchvision.transforms as transformsimport torchvision.datasets as datasetsimport torch.optim as optim# 定义超参数 learning_rate = 0.001batch_size = 64epochs = 10# 加载MNIST数据集 train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor(), download=True)# 定义数据加载器 train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)# 定义神经网络模型 class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(28 * 28, 128) self.fc2 = nn.Linear(128, 10) def forward(self, x): x = x.view(-1, 28 * 28) x = torch.relu(self.fc1(x)) x = self.fc2(x) return x # 实例化模型对象 model = Net()# 定义损失函数和优化器 criterion = nn.CrossEntropyLoss()optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 训练模型 for epoch in range(epochs): running_loss = 0.0 for i, (inputs, labels) in enumerate(train_loader): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print('Epoch %d loss: %.3f' % (epoch + 1, running_loss / len(train_loader)))# 测试模型 correct = 0total = 0with torch.no_grad(): for inputs, labels in test_loader: outputs = model(inputs) _, predicted = torch.max(outputs.data, 1) total += labels.size(0) correct += (predicted == labels).sum().item()print('Accuracy on test set: %.2f%%' % (100 * correct / total))```
接下来,就该使用以其人之道治其人之身的办法了。我们对它进行追问,让它把每一行代码都加上注释,我们看看生成式AI会给出怎样的答案。

对AI进行追问
# 导入PyTorch库 import torch# 导入PyTorch中的线性函数nn.Linear,用于构建全连接神经网络层 import torch.nn as nn# 导入PyTorch中的优化器optim.Adam,用于更新网络参数 import torch.optim as optim# 导入PyTorch的vision库中的datasets和transforms模块,用于载入和处理图像数据 from torchvision import datasets, transforms# 定义超参数,学习率learning_rate为0.001,批处理大小batch_size为32,训练轮数epochs为10 learning_rate = 0.001batch_size = 32epochs = 10# 载入手写字数据集,root参数指定数据集存储路径,transform参数用于对数据进行预处理,这里使用ToTensor()将数据转换为张量形式,并下载数据集(如果尚未下载) train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)# 载入测试集,与训练集类似,但train参数设置为False,表示这是一个测试集,而不是训练集 test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor(), download=True)# 定义一个名为Net的神经网络类,继承自nn.Module类class Net(nn.Module): # 定义类的初始化函数,执行父类的初始化操作后,定义网络的结构和参数 def __init__(self): super(Net, self).__init__() # 执行父类的初始化操作 # 定义一个全连接层fc1,输入特征维度为28*28(MNIST数据集的每个图像为28x28像素),输出维度为128 self.fc1 = nn.Linear(28 * 28, 128) # 定义一个全连接层fc2,输入特征维度为128,输出维度为10(因为有10个类别) self.fc2 = nn.Linear(128, 10) # 定义网络的前向传播函数,将输入数据x通过全连接层得到输出结果 def forward(self, x): x = x.view(-1, 28 * 28) # 将输入数据x重新整形为二维张量,第一维为批处理大小(batch_size),第二维为图像的像素值(28*28) x = torch.relu(self.fc1(x)) # 将输入数据通过全连接层fc1并应用ReLU激活函数得到输出结果 x = self.fc2(x) # 将输出结果通过全连接层fc2得到最终输出结果 return x # 返回最终输出结果# 实例化神经网络模型对象model,并定义损失函数criterion为交叉熵损失函数nn.CrossEntropyLoss()model = Net()criterion = nn.CrossEntropyLoss()# 定义优化器optimizer为Adam优化器,并传入模型参数和学习率learning_rate进行初始化 optimizer = optim.Adam(model.parameters(), lr=learning_rate)# 进行训练循环,对每个epoch进行迭代,直到完成指定的训练轮数epochs for epoch in range(epochs): running_loss = 0.0 # 定义当前epoch的损失值为0 # 对每个batch进行迭代,每次从train_loader中获取一批次的图像数据和标签数据(inputs和labels) for i, (inputs, labels) in enumerate(train_loader): # 清空优化器的梯度信息(zero_grad()) optimizer.zero_grad() # 清空优化器的梯度信息(zero_grad())是为了防止梯度累积导致错误的更新方向。 # 这是Adam优化器的特点。每次更新前都需要清零梯度。这是梯度下降法中常用的操作。 # 类似于重置状态。这样每个batch的梯度都是独立的。不会相互影响。每个batch都有自己的梯度。所以每次更新前都需要清零之前的梯度。 # 这就是zero_grad()的作用。这是Adam优化器的特点。每次更新前都需要清零梯度。这是梯度下降法中常用的操作。类似于重置状态。 # 这样每个batch的梯度都是独立的。不会相互影响。每个batch都有自己的梯度。所以每次更新前都需要清零之前的梯度。这就是zero
我们可以看到代码注释非常详细,不用去看长篇论文了,只用对着注释逐行看代码就能明白整个AI从数据集下载,数据准备,模型定义,模型训练,模型评估,到模型推理预测全过程了。如果觉得注释里有些专业术语不懂,没关系,我们可以继续追问。比如代码中提到清空优化器的梯度信息,那么梯度在AI里面是什么意思呢?我们对AI进行追问。

追问梯度的含义
我们可以看到生成式AI给出了一个详细解释,梯度其实微分导数的概念,用来评估抛物线上升或下降方向的。遗憾的是我本来是让他图文结合的方式来解释,结果它没法直接给出图,而是给出一段画梯度图的代码,让我自己去运行,看来生成式AI也是一个理工男,没学过素描,啥事都直接上代码,我们帮一下这个理工男,将这段代码拷贝到pycharm中,运行一下看看。

画图代码

抛物线梯度
如果我们对代码中的交叉熵损失函数不明白,那我们也可以直接来追问一下,从答案中我们可以很清楚的知道,它是用来计算目标分类概率的。

交叉熵损失函数
遇到不明白的词汇或术语,我们就如此这般的追问,把这段代码吃透了,基本上就掌握了人工智能入门所需要的知识了。同理,用AI来学其它知识,例如数理化,金融,法律等,那更是易如反掌了,大家都尽快去掌握用AI来学习知识的方法吧,否则就要落伍于时代了。

评论留言