系统相关
首页 > 系统相关> > Pytorch框架详解之一

Pytorch框架详解之一

作者:互联网

Pytorch基础操作

numpy基础操作

代码实现

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基础操作

代码实现

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基础操作

代码实现

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的一些说明

  1. train loss 不断下降,test loss 不断下降,说明网络正在学习
  2. train loss 不断下降,test loss 趋于不变,说明网络过拟合
  3. train loss 趋于不变,test loss 趋于不变,说明学习遇到瓶颈,需要减小学习率或者批处理大小
  4. train loss 趋于不变,test loss 不断下降,说明数据集100%有问题
  5. train loss 不断上升,test loss 不断上升(最终变为NaN),可能是网络结构设计不当,训练超参数设置不当,程序bug等某个问题引起

自动梯度与回归

自动梯度

函数式的编程方式

标签:Python,php,MySQL,数据,系统,连接器,筛选,
来源: