Pytorch框架详解之一
作者:互联网
Pytorch基础操作
numpy基础操作
- 定义数组(一维与多维)
- 寻找最大值
- 维度上升与维度下降
- 数组计算
- 矩阵reshape
- 矩阵维度转换
代码实现
import numpy as np
a = np.array([1, 2, 3, 4, 5, 6]) # array数组
b = np.array([8, 7, 6, 5, 4, 3])
print(a.shape, b.shape) # shape为数组的格式
aa = np.reshape(a, (2, 3)) # reshape为格式转换,格式转换为2行3列的二维数组
print(aa, aa.shape)
bb = np.reshape(b, (1, 1, 1, 6)) # 转换为 1*1*1*6 格式的数组
print(bb, bb.shape)
a1 = np.squeeze(aa) # squeeze方法会将只有 1 的维度去掉,只保留大于 1 的维度
b1 = np.squeeze(bb)
print(a1, a1.shape)
print(b1, b1.shape)
a2 = np.transpose(aa, (1, 0)) # transpose数组转置,原行列式形式为(0,1),后面的参数(1,0)表示将行列交换位置变为(1,0)格式
print(a2, a2.shape)
b_index = np.argmax(b) # argmax函数表示获取该数组中的最大值索引
bb_index = np.argmax(bb)
aa_index = np.argmax(aa[0]) # argmax函数可以获取多维数组中任意维度中最大值的索引,没有输入维度时会将多维数组转换为一维获取索引
print(b_index, b[b_index])
print(bb_index, bb[0][0][0][bb_index])
print(aa_index)
a3 = np.reshape(aa, -1) # 参数-1表示恢复成一维数组
print(a3, a3.shape)
# zeros函数以0填充生成指定行列大小的数组,数组数值类型默认为float64,可手动设置int8,uint8(无符号二进制整型),float16,float32,float64等
m1 = np.zeros((6, 6), dtype=np.uint8)
m2 = np.linspace(6, 10, 100) # linspace函数,以均匀步长生成数字序列,linspace(start,end,nums)
print(m1)
print(m2)
OpenCV-Python基础操作
- 读写图像与灰度转换
- 读取视频与显示
- 归一化与显示
- 创建空白图像
- 提取ROI与分离、合并通道
代码实现
import cv2 as cv
import numpy as np
src = cv.imread("D:/images/lena.jpg")
h, w, c = src.shape # 获取到图像的类型为HWC
print(h, w, c)
src1 = np.transpose(src, (2, 0, 1)) # 将输入图像的通道类型进行转置
print(src1.shape)
float_src = np.float32(src) / 255.0 # 将图像变成0-1的浮点数类型
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
rgb = cv.cvtColor(src, cv.COLOR_BGR2RGB) # opencv读取的图像默认为BGR三通道,转换为RGB三通道图像
dst = cv.resize(src, (224, 224))
cv.imshow("input", src)
cv.imshow("float_src", float_src)
cv.imshow("GRAY", gray)
cv.imshow("GRAY_0", src[:, :, 0]) # 进入图像第一个通道,前面两个:表示尺寸512
# cv.imshow("GRAY_1", src[:, :, 1]) # 进入图像第一个通道
# cv.imshow("GRAY_2", src[:, :, 2]) # 进入图像第一个通道
# cv.imshow("GRAY_3", src[:, :, :]) # 获取图像三个通道
cv.imshow("zoom out", dst) # zoom in放大,zoom out缩小
box = [50, 50, 100, 100] # x, y, w, h
roi = src[200:400, 200:400, :] # 截取目标区域 src[y1:y2, x1:x2, :] 灰度图则不需要最后的通道数:
cv.imshow("roi", roi)
m1 = np.zeros((512, 512), dtype=np.uint8) # 创建空白单通道灰度图像
m2 = np.zeros((512, 512, 3), dtype=np.uint8) # 创建空白三通道彩色图像
m2[:, :, :] = (127, 0, 0) # 对图像的三通道进行赋值
cv.imshow("m1", m1)
cv.imshow("m2", m2)
cv.rectangle(src, (200, 200), (400, 400), (0, 255, 0), 2, 8) # 对选定的左上角坐标与右下角坐标之间绘制矩形
cv.imshow("rect_src", src)
cap = cv.VideoCapture("D:/images/video/face_detect.mp4")
while True:
ret, frame = cap.read()
if ret is not True: # ret为布尔类型,表示是否获取到下一帧图像
break
cv.imshow("video", frame)
c = cv.waitKey(50) # waitKey方法是等待一定的时间获取键盘输入,参数为等待的毫秒数,默认可设为1
# c = cv.waitKey(1)
if c == 27: # 如果按下ESC则退出循环
break
cv.waitKey(0)
cv.destroyWindow()
效果:
Pytorch基础操作
- 定义常量与变量
- Tensor与numpy转换
- 数据reshape与最大值索引
- 随机数据生成
- 基本算术操作
- 基本卷积操作
- GPU检测与支持
- 网格化与cat
代码实现
import torch
import numpy
x = torch.empty(2, 2)
x1 = torch.zeros(2, 2)
x2 = torch.randn(2, 2) # 随机生成指定大小的tensor
print(x)
print(x1)
print(x2)
y = torch.tensor([1, 2, 3, 4, 5, 6, 7, 8, 9, 0])
z = torch.tensor([11, 12, 13, 14, 15, 16, 17, 18, 19, 20])
print(y)
print(z)
res01 = torch.add(y, z)
res02 = y.add(z)
print(res01)
print(res02)
# x = x.view(-1, 4) # -1为自动补充,4表示转置为4列的tensor,最终转置成1行4列的tensor
x = torch.view_copy(x, (4, -1)) # 将x转置为4行1列
print(x)
print(x.size()) # 获取x的维度信息
nx = x.numpy() # tensor转换为numpy数组
print(nx)
tensor_x = torch.from_numpy(nx.reshape((2, 2))) # numpy数组转换为tensor
print(tensor_x)
if torch.cuda.is_available(): # 使用GPU对tensor进行运算
print("GPU Detected")
result = x.cuda() + y.cuda()
print(result)
else:
print("GPU is not available")
训练过程中关于LOSS的一些说明
- train loss 不断下降,test loss 不断下降,说明网络正在学习
- train loss 不断下降,test loss 趋于不变,说明网络过拟合
- train loss 趋于不变,test loss 趋于不变,说明学习遇到瓶颈,需要减小学习率或者批处理大小
- train loss 趋于不变,test loss 不断下降,说明数据集100%有问题
- train loss 不断上升,test loss 不断上升(最终变为NaN),可能是网络结构设计不当,训练超参数设置不当,程序bug等某个问题引起
自动梯度与回归
自动梯度
函数式的编程方式
- 所见即所得,定义类、方法、函数、参数
- 先检查语法错误
- 再编译与链接
- 生成可执行文件
- 支持各种参数输入与输出,界面的交互操作