精确学习时间(09点35分开始)
深度学习
- torch.nn
- torch.utils.data
- numpy
- torchvision中的模块有哪些
- os 模块
- PIL(Python Imaging Library)
- tqdm
- matplotlib
- nn.ReLU inplace参数设为True
- nn.relu
- 训练的迭代过程
- 梯度清零
- loss指标计算
- 为什么要加上item?
- 分割预测图像的理解
- 在计算损失时,使用 len(trainloader.dataset) 的目的是为了得到整个训练集的样本数量,从而计算出平均损失(average loss)。这是因为损失值通常是单个样本的损失之和,然后再除以样本数量来得到平均损失。
- 在计算 epoch 中的准确率(epoch_acc)时,使用 total(total 是一个累加变量,用于记录已经处理过的样本数量。) 是更加准确的做法,因为它记录了实际处理过的样本数量,而不是简单地依赖于数据集的总样本数。
torch.nn
Module:所有神经网络模块的基类。如果你想自定义一个神经网络模块,需要继承自 torch.nn.Module,并实现其中的 forward 方法。
Linear:全连接层,也称为仿射层。它接收输入特征并输出通过学习得到的权重和偏置进行线性变换后的结果。
Conv2d:二维卷积层。用于处理二维图像数据,通过滑动卷积核在输入图像上提取特征。
MaxPool2d 和 AvgPool2d:分别为二维最大池化层和平均池化层,用于减小输入特征图的尺寸并提取最显著的特征
ReLU:修正线性单元激活函数。用于引入非线性性质,增加神经网络的拟合能力。
Sequential:一个容器,按顺序包含了一系列神经网络层。可以通过将各种层组合在一起来构建更复杂的神经网络。
CrossEntropyLoss:交叉熵损失函数。常用于多分类任务的损失函数。
torch.utils.data
Dataset 类:定义了一个抽象的数据集类,所有自定义数据集都应该继承自该类,并实现 len 和 getitem 方法。这些方法用于获取数据集的长度和索引对应位置的数据样本。
DataLoader 类:用于将数据集划分为小批量并提供多进程数据加载功能。它可以指定批量大小、是否随机洗牌、是否使用多进程加载等参数,从而方便地将数据提供给神经网络进行训练。
numpy
NumPy 是 Python 中用于数值计算和数据处理的核心库,提供了高效的多维数组对象(ndarray)、广播功能、数学函数、线性代数运算等工具,为科学计算和数据分析提供了强大的支持。
torchvision中的模块有哪些
transforms:用于对图像进行预处理和数据增强的模块,包括常见的操作如裁剪、缩放、旋转、翻转、归一化等。
os 模块
Python 中用于与操作系统进行交互的标准库之一,它提供了许多与文件系统和操作系统交互的功能。
1.文件和目录操作:
os.getcwd():获取当前工作目录的路径。
os.chdir(path):改变当前工作目录为指定路径。
os.listdir(path=‘.’):返回指定目录下的所有文件和目录的列表。
os.mkdir(path):创建一个新目录。
os.makedirs(path):递归创建多层目录。
os.remove(path):删除指定路径的文件。
os.rmdir(path):删除指定路径的空目录。
os.removedirs(path):递归删除多层目录。
2.路径操作:
os.path.join(path1, path2, …):拼接路径。
os.path.exists(path):判断路径是否存在。
os.path.isfile(path):判断路径是否为文件。
os.path.isdir(path):判断路径是否为目录。
os.path.basename(path):返回路径中的文件名部分。
os.path.dirname(path):返回路径中的目录部分。
os.path.split(path):将路径分割成目录和文件名两部分。
os.path.splitext(path):分割路径的扩展名。
3.系统环境和变量:
os.environ:一个包含环境变量的字典。
os.getenv(name, default=None):获取指定环境变量的值。
4.执行系统命令:
os.system(command):在操作系统上执行命令。
os.popen(command):以读模式打开一个管道,从而可以读取命令的输出。
5.其他功能:
os.getpid():获取当前进程的进程号。
os.kill(pid, signal):向进程发送信号。
os.path.getsize(path):获取文件大小。
os.path.abspath(path):返回绝对路径。
os.path.normpath(path):规范化路径。
PIL(Python Imaging Library)
Python 中用于图像处理的常用库之一。
1.Image 类:用于表示图像的类,提供了许多图像处理的方法和属性。
open():打开图像文件。
save():保存图像到文件。
show():显示图像。
resize(size, resample=0):调整图像大小。
crop(box):裁剪图像。
rotate(angle, resample=0, expand=False):旋转图像。
transpose(method):转置图像。
convert(mode=None, matrix=None, dither=None, palette=0, colors=256):转换图像的色彩模式。
paste(im, box, mask=None):粘贴图像到另一个图像上。
2.ImageFilter 类:用于应用滤波器和增强图像的类。
BLUR:模糊滤波器。
CONTOUR:轮廓滤波器。
DETAIL:细节滤波器。
EDGE_ENHANCE:边缘增强滤波器。
EMBOSS:浮雕滤波器。
FIND_EDGES:边缘检测滤波器。
SHARPEN:锐化滤波器。
3.ImageDraw 类:用于在图像上绘制各种形状和文本。
point(xy, fill=None):在指定位置绘制点。
line(xy, fill=None, width=0):绘制直线。
rectangle(xy, fill=None, outline=None, width=0):绘制矩形。
ellipse(xy, fill=None, outline=None, width=0):绘制椭圆。
polygon(xy, fill=None, outline=None):绘制多边形。
text(xy, text, fill=None, font=None):在指定位置绘制文本。
4.ImageFont 类:用于加载和操作字体文件的类。
load_default():加载默认字体。
truetype(font, size):加载 TrueType 字体文件。
5.ImageEnhance 类:用于增强图像的亮度、对比度和锐度。
Brightness(image):亮度增强。
Contrast(image):对比度增强。
Sharpness(image):锐度增强。
6.ImageOps 模块:提供了一些图像操作的函数。
autocontrast(image, cutoff=0):自动调整图像的对比度。
colorize(image, black, white):对图像进行着色。
grayscale(image):将图像转换为灰度图像。
invert(image):反转图像的颜色。
mirror(image):镜像图像。
tqdm
tqdm 是一个用于在 Python 中添加进度条的库,它提供了一种简单而灵活的方式来监视循环的进度。tqdm 的全称是 “taqaddum”,是阿拉伯语,意思是 “进步” 或 “前进”。使用 tqdm 可以为循环迭代过程添加一个美观的进度条,帮助用户了解循环的进度以及估计剩余时间。
tdqm 可以用于任何可迭代对象的循环,例如列表、元组、集合等,以及文件读取、网络请求等耗时操作。你只需要将你的迭代对象作为参数传递给 tqdm 函数即可。tqdm 会自动估计迭代的总体进度,并显示进度条、完成百分比、已完成的迭代次数、以及每秒处理的迭代次数等信息。
matplotlib
import matplotlib.pyplot as plt #导入Matplotlib库,Matplotlib是Python中用于绘制图表的库,pyplot模块提供了类似于MATLAB的绘图接口。
%matplotlib inline#这是一个IPython魔术命令,用于在Jupyter Notebook中内联显示Matplotlib绘图,使得绘图结果直接显示在单元格中。
nn.ReLU inplace参数设为True
在创建 nn.ReLU 实例时,可以选择设置参数 inplace 的值。**当 inplace=True 时,ReLU 函数将会直接修改输入张量,而不会分配新的内存来存储输出。**这样可以节省一些内存空间,但是也会修改输入张量的值,可能会影响计算图的后续操作。
nn.relu
1.作用:ReLU 是神经网络中常用的激活函数之一,用于增加神经网络的非线性特性。它的输出等于输入的正值部分,小于零的部分被置为零。即,对于输入 x,ReLU 函数的输出为 max(0, x)。
2.非线性特性:ReLU 的主要作用是引入非线性性质,使神经网络能够学习非线性函数。这有助于网络更好地拟合复杂的数据分布和模式。
3.梯度:ReLU 在正值部分的导数为 1,而在负值部分的导数为 0。这意味着当输入为正时,梯度为 1,可以有效地传播梯度;而当输入为负时,梯度为 0,可能会导致梯度消失问题。
4.稀疏激活:由于 ReLU 在负值部分输出为零,因此会导致网络中一部分神经元处于非激活状态,从而产生稀疏激活性质,有助于减少模型过拟合的可能性。
5.适用性:ReLU 在实践中被广泛使用,并且通常在隐藏层中使用。但需要注意的是,对于输出层,根据具体问题的要求,可能需要选择其他类型的激活函数,如 sigmoid、softmax 等。
训练的迭代过程
1.求损失:首先计算模型的输出与真实标签之间的损失。
2.梯度清零:然后将之前计算的梯度清零,这是因为 PyTorch 中梯度是累积的,所以每次迭代前需要将之前的梯度清零。
3.反向传播:接着进行反向传播,计算损失对模型参数的梯度。
4.梯度更新:最后使用优化器根据计算得到的梯度更新模型的参数。
梯度清零
在进行反向传播之前,必须清除(归零)旧的梯度。因为如果不清除,新的梯度会和旧的梯度累加,这会导致错误的更新方向。这是因为每次迭代应只考虑当前批次的数据。
loss指标计算
为什么要加上item?
将张量转换成python数值
分割预测图像的理解
correct = 0total = 0running_loss = 0epoch_iou = []model.train()for x, y in tqdm(trainloader):if torch.cuda.is_available():x, y = x.to('cuda'), y.to('cuda')y_pred = model(x) #[128, 2, 128, 128]y= torch.squeeze(y).long()loss = loss_fn(y_pred,y)optimizer.zero_grad() #清零梯度loss.backward()optimizer.step() #使用优化器更新权重with torch.no_grad():y_pred = torch.argmax(y_pred, dim=1) #torch.Size([128, 128, 128])#print(y_pred.shape) correct += (y_pred == y).sum().item()total += y.size(0) #torch.Size([16, 128, 128])#print(y.size)running_loss += loss.item()##iouintersection = torch.logical_and(y, y_pred)union = torch.logical_or(y, y_pred)batch_iou = torch.sum(intersection) / torch.sum(union)batch_iou=batch_iou.cpu().numpy()epoch_iou.append(batch_iou)epoch_loss = running_loss / len(trainloader.dataset)epoch_acc = correct / (total*128*128) #预测正确像素点/总共像素点