pytorch01:概念、张量操作、线性回归与逻辑回归

目录

  • 一、pytorch介绍
    • 1.1pytorch简介
    • 1.2发展历史
    • 1.3pytorch优点
  • 二、张量简介与创建
    • 2.1什么是张量?
    • 2.2Tensor与Variable
    • 2.3张量的创建
      • 2.3.1 直接创建torch.tensor()
      • 2.3.2 从numpy创建tensor
    • 2.4根据数值创建
      • 2.4.1 torch.zeros()
      • 2.4.2 torch.zeros_like()
      • 2.4.3 torch.ones()和torch.ones_like()
      • 2.4.4 torch.full()和torch.full_like()
      • 2.4.5 torch.arange()
      • 2.4.6 torch.linspace()
      • 2.4.7 torch.logspace()
      • 2.4.8 torch.eye()
    • 2.5依概率分布创建张量
      • 2.5.1 torch.normal()
      • 2.5.2 torch.randn()和torch.randn_like()
      • 2.5.3 torch.randint ()和torch.randint_like()
      • 2.5.4 torch.randperm()
      • 2.5.5 torch.bernoulli()
  • 三、张量的操作
    • 3.1 张量拼接与切分
      • 3.1.1 torch.cat()
      • 3.1.2 torch.stack()
      • 3.1.3 torch.chunk()
      • 3.1.4 torch.split()
    • 3.2 张量索引
      • 3.2.1 torch.index_select()
      • 3.2.2 torch.masked_select()
    • 3.3 张量变换
      • 3.3.1 torch.reshape()
      • 3.3.2 torch.transpose()
      • 3.3.3 torch.t()
      • 3.3.4 torch.squeeze()
      • 3.3.5 torch.unsqueeze()
  • 四、张量的运算
    • torch.add()
  • 五、线性回归
    • 5.1线性回归概念
    • 5.2 求解步骤
    • 5.3线性回归代码实现
  • 六、动态图机制
    • 6.1计算图基本概念
    • 6.2 计算图梯度求导
    • 6.3 叶子结点
    • 代码实现
      • 查看叶子结点
      • 查看梯度
      • 查看梯度计算方法
    • 6.4 动态图
      • 6.4.1pytorch动态图
      • 6.4.2TensorFlow静态图
  • 七、逻辑回归
    • 7.1 torch.autograd自动求导系统
      • 7.1.1 torch.autograd.backward
      • 7.1.2 torch.autograd.grad
      • 7.1.3 自动求导系统注意事项
    • 7.2逻辑回归
      • 7.2.1 线性回归与对数回归的区别
      • 7.2.2 逻辑回归代码实现

一、pytorch介绍

1.1pytorch简介

2017年1月,FAIR (FacebookAI Research) 发布PyTorch,PyTorch是在Torch基础上用python语言重新打造的一款深度学习框架,Torch 是采用Lua语言为接口的机器学习框架,但因Lua语言较为小众导致Torch知名度不高。

1.2发展历史

  • 2017年1月正式发布PyTorch
  • 2018年4月更新0.4.0版,支持Windows系统,caffe2正式并入PyTorch
  • 2018年11月更新1.0稳定版,已GitHub 增长第二快的开源项目
  • 2019年5月更新1.1.0版,支持TensorBoard,增强可视化功能
  • 2019年8月更新1.2.0版,更新torchvision,torchaudio 和torchtext,增加更多功能
    2014年10月至2018年02月arXiv论文中深度学习框架提及次数统计,PyTorch的增长速度与TensorFlow一致。
    在这里插入图片描述

1.3pytorch优点

  • 上手快: 掌握Numpy和基本深度学习概念即可上手
  • 代码简洁灵活: 用nn.module封装使网络搭建更方便;基于动态图机制,更灵活
  • Debug方便: 调试PyTorch就像调试 Python 代码一样简单
  • 文档规范:https://pytorch.org/docs/可查各版本文档
  • 资源多: arXiv中的新算法大多有PyTorch实现
  • 开发者多:GitHub上贡献者(Contributors)已超过1100+
  • 背靠大树: FaceBook维护开发

二、张量简介与创建

2.1什么是张量?

张量是一个多维数组,它是标量、向量、矩阵的高维拓展
在深度学习中,张量(tensor)是一个广泛使用的数学和计算工具,它是多维数组的泛化。以下是对深度学习中张量的一些解释:

1.数据结构: 张量是一个多维数组,可以是一个标量(0维张量,即一个数)、向量(1维张量,例如一行或一列数字)、矩阵(2维张量,例如一个表格或图像)、或者更高维度的数组。
2.Rank(秩): 张量的秩表示张量的维度数量。例如,标量的秩是0,向量的秩是1,矩阵的秩是2。通常,深度学习中的张量秩是可以很大的,因为神经网络中的数据通常是高维的。
3.形状: 张量的形状描述了它每个维度上的大小。例如,一个形状为 (3, 4) 的张量表示一个 3 行 4 列的矩阵。
4.类型: 张量可以包含不同类型的数据,例如整数、浮点数等。在深度学习中,通常使用浮点数张量。
5.操作: 张量上可以进行各种数学运算,如加法、减法、乘法等。这些操作是深度学习中神经网络的基础。
6.自动微分: 在深度学习中,张量通常与自动微分结合使用。自动微分是通过计算图和链式法则来计算梯度,用于训练神经网络。
7.存储和计算优化: 张量在内存中的存储方式通常是连续的,这有助于在硬件上进行高效的计算。深度学习框架使用张量来表示神经网络的参数和输入输出。
8.GPU 加速: 张量的并行性和规则结构使得深度学习中的许多计算可以受益于 GPU 的并行计算能力。因此,深度学习框架通常支持在 GPU 上进行张量操作。

在常见的深度学习框架(如 TensorFlow、PyTorch等)中,张量是核心数据结构,它们提供了丰富的操作和函数来处理张量,支持自动微分、梯度下降等算法,使得深度学习模型的实现更加方便和高效。

在这里插入图片描述

2.2Tensor与Variable

Variable是torch.autograd中的数据类型主要用于封装Tensor,进行自动求导

data: 被包装的Tensor
grad: data的梯度
grad fn: 创建Tensor的Function,是自动求导的关键
requires_grad: 指示是否需要梯度
is leaf: 指示是否是叶子结点 (张量)

在这里插入图片描述

2.3张量的创建

2.3.1 直接创建torch.tensor()

torch.tensor()
功能:从data创建tensor
在这里插入图片描述
• data: 数据, 可以是list, numpy
• dtype : 数据类型,默认与data的一致
• device : 所在设备, cuda/cpu
• requires_grad:是否需要梯度
• pin_memory:是否存于锁页内存

2.3.2 从numpy创建tensor

torch.from_numpy(ndarray)

注意事项: 从torch.from_numpy创建的tensor于原ndarray共享内存,当修改其中一个的数据,另外一个也将会被改动

在这里插入图片描述

2.4根据数值创建

2.4.1 torch.zeros()

功能:依size创建全0张量
在这里插入图片描述
• size: 张量的形状, 如(3, 3)、(3, 224,224)
• out : 输出的张量
• layout : 内存中布局形式, 有strided,sparse_coo等
• device : 所在设备, gpu/cpu
• requires_grad:是否需要梯度

2.4.2 torch.zeros_like()

功能:依input形状创建全0张量
在这里插入图片描述

• intput: 创建与input同形状的全0张量
• dtype : 数据类型
• layout : 内存中布局形式

2.4.3 torch.ones()和torch.ones_like()

功能:依input形状创建全1张量
在这里插入图片描述
在这里插入图片描述
• size: 张量的形状, 如(3, 3)、(3, 224,224)
• dtype : 数据类型
• layout : 内存中布局形式
• device : 所在设备, gpu/cpu
• requires_grad:是否需要梯度

2.4.4 torch.full()和torch.full_like()

功能:依input形状创建指定数据的张量
在这里插入图片描述

• size: 张量的形状, 如(3, 3)
• fill_value : 张量的值

2.4.5 torch.arange()

功能:创建等差的1维张量
在这里插入图片描述

注意事项:数值区间为[start, end)
• start : 数列起始值
• end : 数列“结束值”
• step: 数列公差,默认为1

2.4.6 torch.linspace()

功能:创建均分的1维张量
在这里插入图片描述

注意事项:数值区间为[start, end]
• start : 数列起始值
• end : 数列结束值
• steps: 数列长度

2.4.7 torch.logspace()

功能:创建对数均分的1维张量
在这里插入图片描述
注意事项:长度为steps, 底为base
• start : 数列起始值
• end : 数列结束值
• steps: 数列长度
• base : 对数函数的底,默认为10

2.4.8 torch.eye()

功能:创建单位对角矩阵( 2维张量)

在这里插入图片描述
注意事项:默认为方阵
• n: 矩阵行数
• m : 矩阵列数

2.5依概率分布创建张量

2.5.1 torch.normal()

功能:生成正态分布(高斯分布)
在这里插入图片描述

• mean : 均值
• std : 标准差

2.5.2 torch.randn()和torch.randn_like()

功能:生成标准正态分布
功能:在区间[0, 1)上,生成均匀分布
在这里插入图片描述
• size : 张量的形状

2.5.3 torch.randint ()和torch.randint_like()

功能:区间[low, high)生成整数均匀分布
在这里插入图片描述

• size : 张量的形状

2.5.4 torch.randperm()

功能:生成生成从0到n-1的随机排列
在这里插入图片描述

• n : 张量的长度

2.5.5 torch.bernoulli()

功能:以input为概率,生成伯努力分布(0-1分布,两点分布)
在这里插入图片描述
• input : 概率值

三、张量的操作

3.1 张量拼接与切分

3.1.1 torch.cat()

功能:将张量按维度dim进行拼接
在这里插入图片描述

• tensors: 张量序列
• dim : 要拼接的维度

3.1.2 torch.stack()

功能:在新创建的维度dim上进行拼接
在这里插入图片描述

• tensors:张量序列
• dim :要拼接的维度

3.1.3 torch.chunk()

功能:将张量按维度dim进行平均切分
在这里插入图片描述

返回值:张量列表
注意事项:若不能整除,最后一份张量小于其他张量
• input: 要切分的张量
• chunks : 要切分的份数
• dim : 要切分的维度

3.1.4 torch.split()

功能:将张量按维度dim进行切分
在这里插入图片描述

返回值:张量列表
• tensor: 要切分的张量
• split_size_or_sections : 为int时,表示每一份的长度;为list时,按list元素切分
• dim : 要切分的维度

3.2 张量索引

3.2.1 torch.index_select()

功能:在维度dim上,按index索引数据
在这里插入图片描述
返回值:依index索引数据拼接的张量
• input: 要索引的张量
• dim: 要索引的维度
• index : 要索引数据的序号

3.2.2 torch.masked_select()

功能:按mask中的True进行索引
在这里插入图片描述

返回值:一维张量
• input: 要索引的张量
• mask: 与input同形状的布尔类型张量

3.3 张量变换

3.3.1 torch.reshape()

功能:变换张量形状
在这里插入图片描述

注意事项:当张量在内存中是连续时,新张量与input共享数据内存
• input: 要变换的张量
• shape: 新张量的形状

3.3.2 torch.transpose()

功能:交换张量的两个维度
在这里插入图片描述

• input: 要变换的张量
• dim0: 要交换的维度
• dim1: 要交换的维度

3.3.3 torch.t()

功能:2维张量转置,对矩阵而言,等价于torch.transpose(input, 0, 1)
在这里插入图片描述

3.3.4 torch.squeeze()

功能:压缩长度为1的维度(轴)
在这里插入图片描述

• dim: 若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除;

3.3.5 torch.unsqueeze()

功能:依据dim扩展维度
在这里插入图片描述

• dim: 扩展的维度

四、张量的运算

在这里插入图片描述

torch.add()

功能:逐元素计算 input+alpha×other
• input: 第一个张量
• alpha: 乘项因子
• other: 第二个张量

五、线性回归

5.1线性回归概念

在这里插入图片描述

5.2 求解步骤

在这里插入图片描述

5.3线性回归代码实现

# -*- coding:utf-8 -*-import torch
import matplotlib.pyplot as plttorch.manual_seed(10)lr = 0.05  # 学习率# 创建训练数据
x = torch.rand(20, 1) * 10  # x data (tensor), shape=(20, 1)
y = 2 * x + (5 + torch.randn(20, 1))  # y data (tensor), shape=(20, 1)# 构建线性回归参数
w = torch.randn((1), requires_grad=True)
b = torch.zeros((1), requires_grad=True)for iteration in range(1000):# 前向传播  y=wx+bwx = torch.mul(w, x)y_pred = torch.add(wx, b)# 计算 MSE lossloss = (0.5 * (y - y_pred) ** 2).mean()# 损失反向传播来得到梯度gradloss.backward()# 更新参数b.data.sub_(lr * b.grad)  # sub_:原地减法操作w.data.sub_(lr * w.grad)# 清零张量的梯度w.grad.zero_()b.grad.zero_()# 绘图if iteration % 20 == 0:plt.scatter(x.data.numpy(), y.data.numpy())plt.plot(x.data.numpy(), y_pred.data.numpy(), 'r-', lw=5)plt.text(2, 20, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})plt.xlim(1.5, 10)plt.ylim(8, 28)plt.title("Iteration: {}\nw: {} b: {}".format(iteration, w.data.numpy(), b.data.numpy()))plt.pause(0.5)# 设置一个终止条件,当loss小于1的时候停止更新if loss.data.numpy() < 1:break

结果展示:
在这里插入图片描述
在这里插入图片描述

六、动态图机制

6.1计算图基本概念

计算图是用来描述运算的有向无环图计算图有两个主要元素:结点(Node)和边(Edge)结点表示数据,如向量,矩阵,张量边表示运算,如加减乘除卷积等用计算图表示:y = (x+ w) * (w+1);a = x + w ;b = w + 1 ;y = a * b
在这里插入图片描述

6.2 计算图梯度求导

在这里插入图片描述
求导流程如下:
在这里插入图片描述

6.3 叶子结点

叶子结点:用户创建的结点称为叶子结点,如X 与 W;在torch中有如下图属性,is_leaf: 指示张量是否为叶子结点。
grad_fn: 记录创建该张量时所用的方法(函数)
当x,w使用torch方法创建之后,该属性会保留grad属性,a、b、y都是通过x,w计算得到的,在反向传播之后就会释放梯度,减少内存开销。

在这里插入图片描述
在这里插入图片描述

代码实现

查看叶子结点

import torchw = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)a = torch.add(w, x)     # retain_grad()
b = torch.add(w, 1)
y = torch.mul(a, b)y.backward()
print(w.grad)# 查看叶子结点
print("is_leaf:\n", w.is_leaf, x.is_leaf, a.is_leaf, b.is_leaf, y.is_leaf)输出结果:
tensor([5.])
is_leaf:True True False False False

查看梯度

# -*- coding:utf-8 -*-import torchw = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)a = torch.add(w, x)     # retain_grad()
a.retain_grad()b = torch.add(w, 1)
b.retain_grad()
y = torch.mul(a, b)y.backward()
print(w.grad)
print("gradient:\n", w.grad, x.grad, a.grad, b.grad, y.grad)输出结果:
tensor([5.])
gradient:tensor([5.]) tensor([2.]) tensor([2.]) tensor([3.]) None

注意:a,b,y非叶子结点,所以反向传播之后会清除梯度,所以使用a.grad方法结果是none,需要在中间使用a.retain_grad()方法将a的梯度保留下来。

查看梯度计算方法

import torchw = torch.tensor([1.], requires_grad=True)
x = torch.tensor([2.], requires_grad=True)a = torch.add(w, x)     # retain_grad()
# a.retain_grad()b = torch.add(w, 1)
# b.retain_grad()
y = torch.mul(a, b)y.backward()
print(w.grad)
# 查看 grad_fn
print("grad_fn:\n", w.grad_fn, x.grad_fn, a.grad_fn, b.grad_fn, y.grad_fn)输出结果:
tensor([5.])
grad_fn:None None <AddBackward0 object at 0x00000217F70B1330> <AddBackward0 object at 0x00000217F70B1300> <MulBackward0 object at 0x00000217F70B13F0>

从上面结果可以看出,a和b的梯度计算使用的是加法,y梯度使用的是乘法。

6.4 动态图

为什么近几年TensorFlow逐渐被淘汰了,因为TensorFlow使用的任然是静态图,先搭建网络后进行运算,这样会导致效率低下;
在这里插入图片描述

6.4.1pytorch动态图

在这里插入图片描述

6.4.2TensorFlow静态图

在这里插入图片描述

七、逻辑回归

7.1 torch.autograd自动求导系统

7.1.1 torch.autograd.backward

功能:自动求取梯度
在这里插入图片描述

• tensors: 用于求导的张量,如 loss
• retain_graph : 保存计算图
• create_graph : 创建导数计算图,用于高阶
求导
• grad_tensors:多梯度权重

7.1.2 torch.autograd.grad

功能:求取梯度
在这里插入图片描述

• outputs: 用于求导的张量,如 loss
• inputs : 需要梯度的张量
• create_graph : 创建导数计算图,用于高阶
求导
• retain_graph : 保存计算图
• grad_outputs:多梯度权重

7.1.3 自动求导系统注意事项

  1. 梯度不自动清零
  2. 依赖于叶子结点的结点,requires_grad默认为True
  3. 叶子结点不可执行in-place

7.2逻辑回归

逻辑回归是线性的二分类模型,模型表达式和函数图像如下:
在这里插入图片描述

线性回归是分析自变量x与因变量y(标量)之间关系的方法
逻辑回归是分析自变量x与因变量y(概率)之间关系的方法

7.2.1 线性回归与对数回归的区别

在这里插入图片描述

7.2.2 逻辑回归代码实现

在这里插入图片描述

# -*- coding: utf-8 -*-import torch
import torch.nn as nn
import matplotlib.pyplot as plt
import numpy as nptorch.manual_seed(10)# ============================ step 1/5 生成数据 ============================
sample_nums = 100
mean_value = 1.7
bias = 1
n_data = torch.ones(sample_nums, 2)
x0 = torch.normal(mean_value * n_data, 1) + bias  # 类别0 数据 shape=(100, 2)
y0 = torch.zeros(sample_nums)  # 类别0 标签 shape=(100, 1)
x1 = torch.normal(-mean_value * n_data, 1) + bias  # 类别1 数据 shape=(100, 2)
y1 = torch.ones(sample_nums)  # 类别1 标签 shape=(100, 1)
train_x = torch.cat((x0, x1), 0)  # 在0维进行拼接
train_y = torch.cat((y0, y1), 0)# ============================ step 2/5 选择模型 ============================
class LR(nn.Module):def __init__(self):super(LR, self).__init__()self.features = nn.Linear(2, 1)self.sigmoid = nn.Sigmoid()def forward(self, x):x = self.features(x)x = self.sigmoid(x)return xlr_net = LR()  # 实例化逻辑回归模型# ============================ step 3/5 选择损失函数 ============================
loss_fn = nn.BCELoss()  # 二分类交叉熵损失函数# ============================ step 4/5 选择优化器   ============================
lr = 0.01  # 学习率
optimizer = torch.optim.SGD(lr_net.parameters(), lr=lr, momentum=0.9)# ============================ step 5/5 模型训练 ============================
for iteration in range(1000):# 前向传播y_pred = lr_net(train_x)# 计算 lossloss = loss_fn(y_pred.squeeze(), train_y)# 反向传播loss.backward()# 更新参数optimizer.step()# 清空梯度optimizer.zero_grad()# 绘图if iteration % 20 == 0:mask = y_pred.ge(0.5).float().squeeze()  # 以0.5为阈值进行分类correct = (mask == train_y).sum()  # 计算正确预测的样本个数acc = correct.item() / train_y.size(0)  # 计算分类准确率plt.scatter(x0.data.numpy()[:, 0], x0.data.numpy()[:, 1], c='r', label='class 0')plt.scatter(x1.data.numpy()[:, 0], x1.data.numpy()[:, 1], c='b', label='class 1')w0, w1 = lr_net.features.weight[0]w0, w1 = float(w0.item()), float(w1.item())plot_b = float(lr_net.features.bias[0].item())plot_x = np.arange(-6, 6, 0.1)plot_y = (-w0 * plot_x - plot_b) / w1plt.xlim(-5, 7)plt.ylim(-7, 7)plt.plot(plot_x, plot_y)plt.text(-5, 5, 'Loss=%.4f' % loss.data.numpy(), fontdict={'size': 20, 'color': 'red'})plt.title("Iteration: {}\nw0:{:.2f} w1:{:.2f} b: {:.2f} accuracy:{:.2%}".format(iteration, w0, w1, plot_b, acc))plt.legend()plt.show()plt.pause(0.5)if acc > 0.99:break

运行结果:380次迭代之后准确率达到99.5%
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/227746.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率(C++)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK设置相机的固定帧率&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的固定帧率功能的技术背景CameraExplorer如何查看相机固定帧率功能在NEOAPI SDK里通过函数设置相机固定帧率 Baumer工业相机通过NEOAPI SDK设置相机固定…

计算机毕业设计 基于HTML5+CSS3的在线英语阅读分级平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

深度学习 | 编码器-解码器网络、seq2seq模型、束搜索算法

我们知道传统RNN输入和输出数据是等长的&#xff0c;这显然极大限制了他的应用范围。 前面几节我们讲到的循环神经网络的各种变体基本上都在解决一个序列的问题。还有一大类问题涉及到的是两个序列间转换。它是自然语言处理中的一个重要领域&#xff0c;包括机器翻译、语音识别…

【GOLANG】使用插件 Goanno 的方式来对方法、接口、结构体注释模板配置

直接 使用插件 Goanno 的方式来对方法、接口、结构体注释模板配置 1、简单安装 Goanno 插件 File->Settings->Plugins , 搜索 Goanno Normal Method 配置内容如下&#xff1a; // Title ${function_name} // Description ${todo} // Author mumu ${date} ${time} // Par…

速卖通详情API接口技术贴:解锁全球商品信息,引领电商创新潮流

一、概述 速卖通详情API接口是一种应用程序接口&#xff0c;允许开发者访问速卖通平台的商品详情数据。通过使用该API接口&#xff0c;开发者可以获取商品的基本信息、描述、图片等&#xff0c;并将其集成到自己的应用程序或网站中&#xff0c;为用户提供更全面的商品信息。 …

进阶学习——Linux系统服务器硬件认识与RAID磁盘

目录 一、服务器知识补充 1.硬件 2.服务器常见故障 二、认识RAID 1.什么是RAID 2.RAID的优点 3.RAID的实现方式 三、RAID磁盘陈列 1.RAID 0 磁盘陈列介绍——RAID 0 2.RAID 1 磁盘陈列介绍——RAID 1 3.RAID 5 磁盘陈列介绍——RAID 5 4.RAID 6 磁盘陈列介绍——RA…

解决阿里云远程连接yum无法安装问题(Ubuntu 22.04)

解决阿里云远程连接yum无法安装问题&#xff08;Ubuntu 22.04&#xff09; 第一步 进入阿里云远程连接后&#xff0c;尝试安装宝塔面包第二步&#xff1a;尝试更新软件包等一些列操作第三步&#xff1a;完成上述操作之后&#xff0c;尝试安装yum第四步&#xff1a;尝试更换清华…

代数结构与图论

文章目录 图的基本概念欧拉图与哈密顿图树平面图代数系统群与环格与布尔代数 图的基本概念 图的阶&#xff1a;图中的顶点数 &#xff0c;n 个顶点被称为 n 阶图零图&#xff1a;一条边都没有 平凡图&#xff1a;一阶零图基图&#xff1a;将有向图的各条有向边改成无向边所得到…

java springboot将接口查询数据放在系统中 一小时系统更新一次 避免用户访问接口查询数据库缓慢

真到了公司 很多数据库表 特别是常用的功能业务对应的 都是几百万条起步的数据 查询会比较缓慢 那么 我们就可以不用每次都真的查询数据库 例如 我这里有一个接口 通过 封装的 IBookService.list 函数去查询数据库 接口返回是这样的 我们先在启动类 条件装配上 这个接口所在的…

阿里云30个公共云地域、89个可用区、5个金融云和政务云地域

阿里云基础设施目前已面向全球四大洲&#xff0c;公共云地域开服运营30个公共云地域、89个可用区&#xff0c;此外还拥有5个金融云、政务云地域&#xff0c;并且致力于持续的新地域规划和建设&#xff0c;从而更好的满足用户多样化的业务和场景需求。伴随着基础设施的加速投入和…

【Java开发岗面试】八股文—Java基础集合多线程

声明&#xff1a; 背景&#xff1a;本人为24届双非硕校招生&#xff0c;已经完整经历了一次秋招&#xff0c;拿到了三个offer。本专题旨在分享自己的一些Java开发岗面试经验&#xff08;主要是校招&#xff09;&#xff0c;包括我自己总结的八股文、算法、项目介绍、HR面和面试…

pytorch05:卷积、池化、激活

目录 一、卷积1.1 卷积的概念1.2 卷积可视化1.3 卷积的维度1.4 nn.Conv2d1.4.1 无padding 无stride卷积1.4.2 无padding stride2卷积1.4.3 padding2的卷积1.4.4 空洞卷积1.4.5 分组卷积 1.5 卷积输出尺寸计算1.6 卷积的维度1.7 转置卷积1.7.1 为什么被称为转置卷积1.7.2 nn.Con…

Grafana增加仪表盘

1.Grafana介绍 grafana 是一款采用Go语言编写的开源应用&#xff0c;主要用于大规模指标数据的可视化展现&#xff0c;是网络架构和应用分析中最流行的时序数据展示工具&#xff0c;目前已经支持绝大部分常用的时序数据库。 Grafana下载地址&#xff1a;https://grafana.com/g…

Python+OpenGL绘制3D模型(六)材质文件载入和贴图映射

系列文章 一、逆向工程 Sketchup 逆向工程&#xff08;一&#xff09;破解.skp文件数据结构 Sketchup 逆向工程&#xff08;二&#xff09;分析三维模型数据结构 Sketchup 逆向工程&#xff08;三&#xff09;软件逆向工程从何处入手 Sketchup 逆向工程&#xff08;四&#xf…

Java强软弱虚引用

面试&#xff1a; 1.强引用&#xff0c;软引用&#xff0c;弱引用&#xff0c;虚引用分别是什么&#xff1f; 2.软引用和弱引用适用的场景&#xff1f; 3.你知道弱引用的话&#xff0c;能谈谈WeakHashMap吗&#xff1f; 目录 一、Java引用 1、强引用&#xff08;默认支持模式…

05-C++ 类和对象-继承

类与对象-03 继承与派生 1. 继承的概念 c最重要的特征是代码重用&#xff0c;通过继承机制可以利用已有的数据类型&#xff0c;来定义新的数据类型&#xff0c;新的类不仅拥有旧类的成员&#xff0c;还拥有新定义的成员。 一个 B 类继承于 A 类&#xff0c;或称从类 A 派生…

菜鸟网络Java实习一面面经

自我介绍&#xff0c;做过的项目 巴拉巴拉 你项目中用到redis&#xff0c;可以介绍一下为什么使用它吗&#xff1f; 基于内存操作&#xff0c;内存读写速度快。 支持多种数据类型&#xff0c;包括String、Hash、List、Set、ZSet等。 支持持久化。Redis支持RDB和AOF两种持久…

K8S异常处理

一、概述 1、k8s有时候会报错The connection to the server ip:6443 was refused - did you specify the right host or port &#xff0c;本文档提供几种可能产生该报错的原因和排障思路。 二、发现问题 使用任意Kubectl 命令会报错&#xff1a;The connection to the serv…

JVM GC 算法原理概述

对于JVM的垃圾收集&#xff08;GC&#xff09;&#xff0c;这是一个作为Java开发者必须了解的内容&#xff0c;那么&#xff0c;我们需要去了解哪些内容呢&#xff0c;其实&#xff0c;GC主要是解决下面的三个问题&#xff1a; 哪些内存需要回收&#xff1f; 什么时候回收&…

透过许战海矩阵洞察安记食品增长战略

引言&#xff1a;安记食品如果想实施增长战略&#xff0c;建议深耕招牌产品,走向全国市场,目前招牌产品咖哩和复合调味粉市场空间没有被全面释放出来,需要科学的产品战略作为支撑。安记食品选择功能性产品方向是正确的,但“功能性”需要一个大品类作为载体,牛奶,饮料是最大的载…