人工智能
人工智能是类人思考、类人行为,理性的思考、理性的行动。人工智能的基础是哲学、数学、经济学、神经科学、心理学、计算机工程、控制论、语言学。人工智能的发展,经过了孕育、诞生、早期的热情、现实的困难等数个阶段;
人工智能是什么?
机器学习
根据有无标记(label)机器学习可分为:
机器学习入门好文,强烈推荐
神经网络
神经网络是一门重要的机器学习技术,是机器学习中的一种模型,是一种模仿动物神经网络行为特征,进行分布式并行信息处理的算法数学模型。这种网络依靠系统的复杂程度,通过调整内部大量节点之间相互连接的关系,从而达到处理信息的目的。
神经网络按照层数多少可分为:
感知机
感知机是最简单的人工神经网络——只有一个神经元的单层神经网络,可以完成简单的线性分类任务。
可以看到,一个感知器有如下组成部分:
通过6个问题进一步理解
(1) 感知机的定义是什么?
感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别。
(2) 感知机的取值是什么?
取+1和-1二值。
(3) 感知机对应于输入空间(特征空间)中的什么?
感知机对应于输入空间中将实例划分为正负两类的分离超平面,属于判别模型。
(4) 感知机学习的目的是什么?
感知机学习旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。
(5) 感知机学习算法有什么特点?
感知机学习算法具有简单,并且易于实现的特点,分为原始形式和对偶形式。
(6) 什么是感知机预测?
感知机预测是用学习得到的感知机模型对新的输入实例进行分类。它是神经网络与支持向量机的基础。
说明:
上述超平面
是指在N维线性空间中维度为N-1的子空间。二维空间中的超平面是一条线,三位空间的超平面是一个二维平面,四维空间的超平面是一个三位体。
什么是感知机?
零基础入门深度学习(1) - 感知器
神经网络——最易懂最清晰的一篇文章
四种基本的神经网络
深度学习
深度学习是源于人工神经网络的研究,是基于人工神经网络的机器学习方法族的一部分。学习可以是有监督的、半监督的或无监督的,通常以发现数据的分布式特征表示。
一文看懂深度学习(白话解释+8个优缺点+4个典型算法)
通过调整隐层和输出层的参数,使得神经网络的计算结果与真是结果尽量接近
训练过程:
【深度学习】正向传播、反向传播与优化函数
激活函数和损失函数
过拟合是指模型过度逼近训练数据,影响力模型的泛化能力。表现为:在训练集上误差很小,在验证数据集上误差很大。一般可以通过正则化来解决。
除了过拟合外,还有欠拟合
,即训练特征过少,拟合函数无法有效逼近训练集,造成误差很大。欠拟合一般可以通过增加训练样本或者模型复杂的来解决。
由上图可以看出:
假设上面过拟合图中的曲线方程如下
图4就是一个9次多项式,为了防止过拟合,将其转化为三次多项式,即设法将高次项系数变为0。此时需要给损失函数中增加对高次项的惩罚,即在原损失函数上添加 C4w42 + C5w52 + … + C9w92 ,C为常数。此时用损失函数训练出来的结果w4 - w9都约等于0,即可以认为是一个三次多项式。
正则化就是在损失函数中对不想要的部分加入惩罚项,常见的正则化有L1 和 L2
过拟合
过拟合(定义、出现的原因4种、解决方案7种)
【深度学习】正则化(超详解)
一个简单的神经网络模型
import time
import torch
import torchvision.datasets
from torch import nn
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
# 自定义网络
class MyNN(nn.Module):
def __init__(self) -> None:
super().__init__()
self.model = Sequential(
Conv2d(3, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 32, 5, padding=2),
MaxPool2d(2),
Conv2d(32, 64, 5, padding=2),
MaxPool2d(2),
Flatten(),
Linear(1024, 64),
Linear(64, 10)
)
def forward(self, x):
x = self.model(x)
return x
# 搭建网络进行训练
# 1. 准备数据集
train_data = torchvision.datasets.CIFAR10("dataset", train=True, transform=torchvision.transforms.ToTensor(),
download=True)
test_data = torchvision.datasets.CIFAR10("dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
# 查看数据长度
print("训练数据集长度为:{}".format(len(train_data)))
print("测试数据集长度为:{}".format(len(test_data)))
# 2. 加载数据集
train_dataLoader = DataLoader(train_data, batch_size=64)
test_dataLoader = DataLoader(test_data, batch_size=64)
# 3. 创建网络模型
demo_nn = MyNN()
# 4. 损失函数
loss_fn = nn.CrossEntropyLoss()
# 5. 优化器
learning_rate = 0.01
# 随机梯度下降
optimal = torch.optim.SGD(demo_nn.parameters(), lr=learning_rate)
# 记录训练次数
count_train = 0
# 记录测试次数
total_test = 0
# 训练轮数
epoch = 50
# 使用tensorboard
writer = SummaryWriter("loss-train")
start_time = time.time()
for i in range(epoch):
print("---------开始第{}轮训练---------".format(i + 1))
# 训练步骤开始
demo_nn.train() # 将网络设置为训练模式,当网络包含 Dropout, BatchNorm时必须设置,其他时候无所谓
for data in train_dataLoader:
imgs, targets = data
output = demo_nn(imgs)
# 优化模型
loss = loss_fn(output, targets)
# 梯度清零
optimal.zero_grad()
# 反向传播
loss.backward()
# 训练
optimal.step()
# 纪录训练次数
count_train += 1
# item()函数会直接输出值,比如tensor(5),会输出5
if count_train % 100 == 0:
# 记录时间
end_time = time.time()
print(end_time - start_time)
print("训练次数为{}时,loss值为{}".format(count_train, loss.item()))
# 记录训练loss值
writer.add_scalar("train_loss", loss.item(), count_train)
total_test = 0
total_accuracy = 0
# 将网络设置为测试模式,当网络包含 Dropout, BatchNorm时必须设置,其他时候无所谓
demo_nn.eval()
with torch.no_grad():
for data in test_dataLoader:
imgs, targets = data
output = demo_nn(imgs)
loss = loss_fn(output, targets)
# 记录测试数据集loss和
total_test += loss.item()
# 求预测结果精确度之和
# argmax:求最大值的下标,1按行求,0按列求
accuracy = (output.argmax(1) == targets).sum()
total_accuracy += accuracy
print("测试集的整体loss为{}".format(total_test))
print("测试集的整体准确度为{}".format(total_accuracy / len(test_data)))
writer.add_scalar("accuracy", total_accuracy / len(test_data), i)
# 记录测试loss,
writer.add_scalar("test_loss", total_test, i)
# 保存每一步训练的模型
torch.save(demo_nn, "train-model/train_model_{}.pth".format(i))
print("第{}次训练模型已保存".format(i + 1))
writer.close()
注:本博客内容来教材和自网络整理,仅作为学习笔记记录,不用做其他用途。