用AI学AI,以其人之道治其人之身

人工智能
后台-插件-广告管理-内容页头部广告(手机)

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

用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学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,以其人之道治其人之身

追问梯度的含义

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

用AI学AI,以其人之道治其人之身

画图代码

用AI学AI,以其人之道治其人之身

抛物线梯度

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

用AI学AI,以其人之道治其人之身

交叉熵损失函数

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

用AI学AI,以其人之道治其人之身
后台-插件-广告管理-内容页尾部广告(手机)
标签:

评论留言

我要留言

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。