深度学习 Pytorch 基础网络手动搭建与快速实现

news2025/2/6 23:54:03

为了方便后续练习的展开,我们尝试自己创建一个数据生成器,用于自主生成一些符合某些条件、具备某些特性的数据集。

导入相关的包

# 随机模块
import random

# 绘图模块
import matplotlib as mpl
import matplotlib.pyplot as plt

# 导入numpy
import numpy as np

# 导入pytorch
import torch
from torch import nn, optim
import torch.nn.functional as F
from torch.utils.data import Dataset, TensorDataset, DataLoader

以上均为此前用到的包,其它新的包将在使用时再进行导入及介绍。


46 回归类数据集创建方法

46.1 手动生成数据

回归类模型的数据,特征和标签都是连续性数值。

正常情况,应该是对于连续型数值标签的预测,我们采用回归类模型,此处因为先生成数据后进行建模,因此我们称可用于回归模型训练的数据为回归类模型数据,分类模型数据亦然。


数据生成

生成两个特征、存在偏差,自变量和因变量存在线性关系的数据集

num_inputs = 2		# 两个特征
num_examples = 100	# 总共一千条数据

然后通过线性方程,确定自变量和因变量的真实关系

torch.manual_seed(420)		# 设置随机数种子

# 线性方程系数
w_true = torch.tensor([2, -1]).reshape(2, 1)
b_true = torch.tensor(1.)

# 特征和标签取值
features = torch.randn(num_examples, num_inputs)
labels_true = torch.mm(features, w_true) + b_true
labels = labels_true + torch.randn(size = labels_true.shape) * 0.01

此处设置所有的数据都是浮点型。

注意,此时labels_truefeatures满足严格意义上的线性方程关系
y = 2 x 1 − x 2 + 1 y = 2x_1-x_2+1 y=2x1x2+1
但我们实际使用的标签labels,则是在labels_true的基础上增添了一个扰动项,torch.randn(size = labels_true.shape) * 0.01,这其实也符合我们一般获取数据的情况:真实客观世界或许存在某个规律,但我们搜集到的数据往往会因为各种原因存在一定的误差,无法完全描述真实世界的客观规律,这其实也是模型误差的来源之一(另一个误差来源是模型本身捕获规律的能力)。这其中, y = 2 x 1 − x 2 + 1 y=2x_1-x_2+1 y=2x1x2+1相当于我们从上帝视角创建的数据真实服从的规律,而扰动项,则相当于人为创造的获取数据时的误差。

这种按照某种规律生成数据、又 人为添加扰动项 的创建数据的方法,也是数学领域创建数据的一般方法。


数据探索

features[: 10]
# output :
tensor([[-0.0070,  0.5044],
        [ 0.6704, -0.3829],
        [ 0.0302,  0.3826],
        [-0.5131,  0.7104],
        [ 1.8092,  0.4352],
        [ 2.6453,  0.2654],
        [ 0.9235, -0.4376],
        [ 2.0182,  1.3498],
        [-0.2523, -0.0355],
        [-0.0646, -0.5918]])
labels[: 10]
# output :
tensor([[ 0.4735],
        [ 2.7285],
        [ 0.6764],
        [-0.7537],
        [ 4.1722],
        [ 6.0236],
        [ 3.2936],
        [ 3.6706],
        [ 0.5282],
        [ 1.4557]])
plt.subplot(121)
plt.scatter(features[:, 0], labels)		# 第一个特征和标签的关系
plt.subplot(122)
plt.scatter(features[:, 1], labels)		# 第二个特征和标签的关系

在这里插入图片描述

不难看出,两个特征和标签都存在一定的线性关系,并且跟特征的系数绝对值有很大关系。当然,若要增加线性模型的建模难度,可以增加扰动项的数值比例,从而削弱线性关系。

# 设置随机数种子
torch.manual_seed(420)

# 修改因变量
labels1 = labels_true + torch.randn(size = labels_true) * 2

# 可视化展示

# 扰动较小的情况
plt.subplot(221)
plt.scatter(features[:, 0], labels)             # 第一个特征和标签的关系
plt.subplot(222)
plt.plot(features[:, 1], labels, 'ro')          # 第二个特征和标签的关系

# 扰动较大的情况
plt.subplot(223)
plt.scatter(features[:, 0], labels1)             # 第一个特征和标签的关系
plt.subplot(224)
plt.plot(features[:, 1], labels1, 'yo')          # 第二个特征和标签的关系

在这里插入图片描述

当然,我们也能生成非线性关系的数据集,此处我们创建满足 y = x 2 + 1 y=x^2+1 y=x2+1规律的数据集。

# 设置随机数种子
torch.manual_seed(420)   

num_inputs = 2               # 两个特征
num_examples = 1000          # 总共一千条数据

# 线性方程系数
w_true = torch.tensor(2.)
b_true = torch.tensor(1.)

# 特征和标签取值
features = torch.randn(num_examples, num_inputs)
labels_true = torch.pow(features, 2) * w_true + b_true
labels = labels_true + torch.randn(size = labels_true.shape) * 0.1

# 可视化展示
plt.scatter(features, labels)

在这里插入图片描述


46.2 创建生成回归类数据的函数

为了方便后续使用,我们将上述过程封装在一个函数内

定义创建函数

def tensorGenReg(num_examples = 1000, w = [2, -1, 1], bias = True, deg = 1):
    """回归类数据集创建函数。
    :param num_examples: 创建数据集的数据量
    :param w: 包括截距的(如果存在)特征系数向量
    :param bias:是否需要截距
    :param delta:扰动项取值
    :param deg:方程次数
    :return: 生成的特征张量和标签张量
    """
    if bias == True:
        num_inputs = len(w) - 1
        features_true = torch.randn(num_examples, num_inputs)
        w_true = torch.tensor(w[:-1]).reshape(-1, 1).float()
        b_true = torch.tensor(w[-1]).float()
        if num_inputs == 1:
            # 若输入特征只有1个,则不能使用矩阵乘法
            labels_true = torch.pow(features_true, deg) * w_true + n_true
        else:
            labels_true = torch.mm(torch.pow(features_true, deg), w_true) + b_true
        # 在特征张量的最后添加一列全是1的列
        features = torch.cat((features_true,  torch.ones(len(features_true), 1)), 1)
    else:
        num_inputs = len(w)
        features = torch.randn(num_examples, num_inputs)
        w_true = torch.tensor(w).reshape(-1, 1).float()
        if num_inputs == 1:
            labels_true = torch.pow(features, deg) * w_true
        else:
            labels_true = torch.mm(torch.pow(features, deg), w_true)
        labels = labels_true + torch.randn(size = labels_true.shape) * delta
    return features, labels   

测试函数性能

首先查看扰动项较小的时候的数据情况

# 设置随机数种子
torch.manual_seed(420)   

# 扰动项取值为0.01
f, l = tensorGenReg(delta = 0.01)
f
# output :
tensor([[-0.0070,  0.5044,  1.0000],
        [ 0.6704, -0.3829,  1.0000],
        [ 0.0302,  0.3826,  1.0000],
        ...,
        [-0.9164, -0.6087,  1.0000],
        [ 0.7815,  1.2865,  1.0000],
        [ 1.4819,  1.1390,  1.0000]])
# 绘制图像查看结果
plt.subplot(223)
plt.scatter(f[:, 0], l)             # 第一个特征和标签的关系
plt.subplot(224)
plt.scatter(f[:, 1], l)          # 第二个特征和标签的关系

在这里插入图片描述

然后查看扰动项较大时数据情况

# 设置随机数种子
torch.manual_seed(420)   

# 扰动项取值为2
f, l = tensorGenReg(delta = 2)

# 绘制图像查看结果
plt.subplot(223)
plt.scatter(f[:, 0], l)             # 第一个特征和标签的关系
plt.subplot(224)
plt.scatter(f[:, 1], l)          # 第二个特征和标签的关系

在这里插入图片描述

当特征和标签满足二阶关系时候数据表现

# 设置随机数种子
torch.manual_seed(420)   

# 2阶方程
f, l = tensorGenReg(deg = 2)

# 绘制图像查看结果
plt.subplot(223)
plt.scatter(f[:, 0], l)             # 第一个特征和标签的关系
plt.subplot(224)
plt.scatter(f[:, 1], l)          # 第二个特征和标签的关系

在这里插入图片描述

当只有一个特征时数据表现

# 设置随机数种子
torch.manual_seed(420)   

# 2阶方程
f, l = tensorGenReg(w = [1], deg = 2, bias = False)
plt.scatter(f, l)

在这里插入图片描述


47 分类数据集创建方法

和回归模型的数据不同,分类模型数据的标签是离散值。

47.1 手动创建分类数据集


数据生成

在尝试创建分类数据集之前,首先回顾torch.normal创建某种服从正态分布的随机数的创建方法。

torch.randn(4, 2)
# output :
tensor([[ 1.4000,  0.3924],
        [-0.0695, -1.7610],
        [ 0.3227,  1.7285],
        [-0.1107, -1.6273]])
torch.normal(4, 2, size=(10,2))
# output :
tensor([[4.8092, 0.9773],
        [4.4092, 3.3987],
        [1.7446, 6.2281],
        [3.0095, 4.2286],
        [7.8873, 6.5354],
        [3.9286, 4.0315],
        [2.0309, 4.5259],
        [3.6491, 0.7394],
        [3.6549, 5.4767],
        [8.5935, 3.0440]])

接下来尝试创建一个拥有两个特征的三分类的数据集,每个类别包含500条数据,并且第一个类别的两个特征都服从均值为4、标准差为2的正态分布,第二个类别的两个特征都服从均值为-2、标准差为2的正态分布,第三个类别的两个特征都服从均值为-6、标准差为2的正态分布,创建过程如下:

# 设置随机数种子
torch.manual_seed(420)

# 创建初始标记值
num_inputs = 2
num_examples = 500

# 创建自变量簇
data0 = torch.normal(4, 2, size=(num_examples, num_inputs))
data1 = torch.normal(-2, 2, size=(num_examples, num_inputs))
data2 = torch.normal(-6, 2, size=(num_examples, num_inputs))

# 创建标签
label0 = torch.zeros(500)
label1 = torch.ones(500)
label2 = torch.full_like(label1, 2)

# 合并生成最终数据
features = torch.cat((data0, data1, data2)).float()
labels = torch.cat((label0, label1, label2)).long().reshape(-1, 1)

数据探索

features[: 10]
# output :
tensor([[3.9859, 5.0089],
        [5.3407, 3.2343],
        [4.0605, 4.7653],
        [2.9738, 5.4208],
        [7.6183, 4.8705],
        [9.2907, 4.5307],
        [5.8470, 3.1249],
        [8.0364, 6.6997],
        [3.4954, 3.9290],
        [3.8709, 2.8165]])
labels[: 10]
# output :
tensor([[0],
        [0],
        [0],
        [0],
        [0],
        [0],
        [0],
        [0],
        [0],
        [0]])
# 可视化展示
plt.scatter(features[:, 0], features[:, 1], c = labels)

在这里插入图片描述

能够看出,类别彼此交叉情况较少,分类器在此数据集上会有不错表现。当然,若要增加分类器的分类难度,可以将各类的均值压缩,并增加方差,从而增加从二维图像上来看彼此交错的情况。

# 设置随机数种子
torch.manual_seed(420)   

# 创建初始标记值
num_inputs = 2
num_examples = 500

# 创建自变量簇
data0 = torch.normal(3, 2, size=(num_examples, num_inputs))
data1 = torch.normal(0, 2, size=(num_examples, num_inputs))
data2 = torch.normal(-3, 2, size=(num_examples, num_inputs))

# 创建标签
label0 = torch.zeros(500)
label1 = torch.ones(500)
label2 = torch.full_like(label1, 2)

# 合并生成最终数据
features1 = torch.cat((data0, data1, data2)).float()
labels1 = torch.cat((label0, label1, label2)).long().reshape(-1, 1)
# 可视化展示
plt.subplot(121)
plt.scatter(features[:, 0], features[:, 1], c = labels)             
plt.subplot(122)
plt.scatter(features1[:, 0], features1[:, 1], c = labels1)

在这里插入图片描述


47.2 创建生成分类数据的函数

同样,我们将上述创建分类函数的过程封装为一个函数。这里需要注意的是,我们希望找到一个变量可以控制数据整体离散程度,也就是后续建模的难以程度。这里我们规定,如果每个分类数据集中心点较近、且每个类别的点内部方差较大,则数据集整体离散程度较高,反之离散程度较低。在实际函数创建过程中,我们也希望能够找到对应的参数能够方便进行自主调节。


定义创建函数

def tensorGenCla(num_examples = 500, num_inputs = 2, num_class = 3, deg_dispersion = [4, 2], bias = False):
    """分类数据集创建函数。 
    :param num_examples: 每个类别的数据数量
    :param num_inputs: 数据集特征数量
    :param num_class:数据集标签类别总数
    :param deg_dispersion:数据分布离散程度参数,需要输入一个列表,其中第一个参数表示每个类别数组均值的参考、第二个参数表示随机数组标准差。
    :param bias:建立模型逻辑回归模型时是否带入截距
    :return: 生成的特征张量和标签张量,其中特征张量是浮点型二维数组,标签张量是长正型二维数组。
    """
    cluster_l = torch.empty(num_examples, 1)	# 每一类标签张量的形状
    mean_ = deg_dispersion[0]	# 每一类特征张量的均值的参考值
    std_ = deg_dispersion[1]	# 每一类特征张量的方差
    lf = []	# 用于存储每一类特征张量的列表容器
    ll = []	# 用于存储每一类标签张量的列表容器
    k = mean_ * (num_class - 1) / 2		# 每一类特征张量均值的惩罚因子
    
    for i in range(num_class):
        data_temp = torch.normal(i*mean_-k, std_, size=(num_examples, num_inputs))     # 生成每一类张量
        lf.append(data_temp)	# 将每一类张量添加到lf中
        labels_temp = torch.full_like(cluster_l, i)		# 生成类一类的标签
        ll.append(labels_temp)	# 将每一类标签添加到ll中
    features = torch.cat(lf).float()
    labels = torch.cat(ll).long()
    
    if bias == True:
        # 在特征张量中添加一列全是1的列
        features = torch.cat((features, torch.ones(len(features), 1)), 1)
    return features, labels

函数整体结构不复杂,且所使用的方法都是此前介绍过的tensor常用方法,唯一需要注意的是函数对于分布离散程度的控制。函数内部变量k是一个随着均值增加和分类类别数量增加而增加的数值,且分类数量增加对k值增加影响是通过和1取平均后进行惩罚的结果。而i*mean_则是一个随着i增加稳步增量的量,二者相减最终能获得一个整体特征均匀分布在0附近的特征张量。


测试函数性能

在使用函数的过程中,离散度的第一个数值可以理解为簇的大概分布区间,第二个数值可以理解为每个簇的离散程度。

# 设置随机数种子
torch.manual_seed(420)   

# 创建数据
f, l = tensorGenCla(deg_dispersion = [6, 2])          # 离散程度较小
f1, l1 = tensorGenCla(deg_dispersion = [6, 4])        # 离散程度较大

# 绘制图像查看
plt.subplot(121)
plt.scatter(f[:, 0], f[:, 1], c = l)
plt.subplot(122)
plt.scatter(f1[:, 0], f1[:, 1], c = l1)

在这里插入图片描述


48 创建小批量切分函数

在深度学习建模过程中,梯度下降是最常用的求解目标函数的优化方法,而针对不同类型、拥有不同函数特性的目标函数,所使用的梯度下降算法也各有不同。目前为止,我们判断小批量梯度下降(MBGD)是较为“普适”的优化算法,它既拥有随机梯度下降(SGD)的能够跨越局部最小值点的特性,同时又和批量梯度下降(BGD)一样,拥有相对较快的收敛速度(虽然速度略慢与BGD)。而在小批量梯度下降过程中,我们需要对函数进行分批量的切分,因此,在手动实现各类深度学习基础算法之前,我们需要定义数据集小批量切分的函数。

shuffle过程:将原序列乱序排列

l = list(range(5))
l
# output :
[0, 1, 2, 3, 4]
random.shuffle(l)
l
# output :
[3, 2, 0, 1, 4]

批量切分函数的目标就是根据设置的“批数”,将原数据集随机均匀切分。可通过如下函数实现:

def data_iter(batch_size, features, labels):
    """
    数据切分函数
    :param batch_size: 每个子数据集包含多少数据
    :param featurs: 输入的特征张量
    :param labels:输入的标签张量
    :return l:包含batch_size个列表,每个列表切分后的特征和标签所组成 
    """    
    num_examples = len(features)
    indics = list(range(num_examples))
    random.shuffle(indices)
    l=[]	# 空列表用于存储数据
    for i in range(0, num_examples, batch_size):
        j = torch.tensor(indices[i: min(i + batch_size, num_examples)])
        l.append([torch.index_select(features, 0, j), torch.index_select(labels, 0, j)])
    return l
# 设置随机数种子
torch.manual_seed(420)  

# 生成二分类数据集
features, labels = tensorGenCla()       
features[:5]
# output :
tensor([[-4.0141, -2.9911],
        [-2.6593, -4.7657],
        [-3.9395, -3.2347],
        [-5.0262, -2.5792],
        [-0.3817, -3.1295]])
labels
# output :
tensor([[0],
        [0],
        [0],
        ...,
        [2],
        [2],
        [2]])
l = data_iter(10, features, labels)
l[0]	# 查看切分后的第一个数据集 
# output :
[tensor([[ 0.7901,  2.4304],
         [ 4.0788,  3.7885],
         [-1.1552, -0.8829],
         [ 1.3738,  2.3689],
         [-2.1479, -6.6638],
         [-2.5418, -7.9962],
         [-1.0777, -0.7594],
         [ 5.6215,  3.9071],
         [ 3.5896,  3.3644],
         [ 1.2458,  0.0179]]),
 tensor([[1],
         [2],
         [1],
         [1],
         [0],
         [0],
         [1],
         [2],
         [2],
         [1]])]
plt.scatter(l[0][0][:, 0], l[0][0][:, 1], c = l[0][1])

在这里插入图片描述


49 Python模块编写

本节定义的函数将后续课程中将经常使用,因此需要将其封装为一个模块方便后续调用。封装为模块有以下几种基本方法:

  • 打开文本编辑器,将写好并测试完成的函数写入其中,并将文本的拓展名改写为.py
  • spyder或者pycharm中复制相关函数,并保存为.py文件;

然后将文件保存在jupyter主目录下,并取名为torchLearning,后续即可通过import torchLearning进行调用。如果是jupyterlab用户,也可按照如下方式进行编写:

Step 1.打开左侧文件管理栏页,点击新建

在这里插入图片描述

Step 2.在新建目录中,选择Test File

Step 3.在打开的文本编辑器中输入代码

需要保存的函数有:

  • tensorGenReg函数
  • tensorGenCla函数
  • data_iter函数

在这里插入图片描述

Step 4.保存退出,并将文件名改写为torchLearning.py

在这里插入图片描述

然后即可在其他ipy文件中调用,具体调用方法见下一节内容。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

保姆级教程Docker部署KRaft模式的Kafka官方镜像

目录 一、安装Docker及可视化工具 二、单节点部署 1、创建挂载目录 2、运行Kafka容器 3、Compose运行Kafka容器 4、查看Kafka运行状态 三、集群部署 四、部署可视化工具 1、创建挂载目录 2、运行Kafka-ui容器 3、Compose运行Kafka-ui容器 4、查看Kafka-ui运行状态 …

51单片机看门狗系统

在 STC89C52 单片机中,看门狗控制寄存器的固定地址为 0xE1。此地址由芯片厂商在硬件设计时确定,但是它在头文件中并未给出,因此在使用看门狗系统时需要声明下这个特殊功能寄存器 sfr WDT_CONTR 0xE1; 本案将用一个小灯的工作状况来展示看门…

RNN/LSTM/GRU 学习笔记

文章目录 RNN/LSTM/GRU一、RNN1、为何引入RNN?2、RNN的基本结构3、各种形式的RNN及其应用4、RNN的缺陷5、如何应对RNN的缺陷?6、BPTT和BP的区别 二、LSTM1、LSTM 简介2、LSTM如何缓解梯度消失与梯度爆炸? 三、GRU四、参考文献 RNN/LSTM/GRU …

Android记事本App设计开发项目实战教程2025最新版Android Studio

平时上课录了个视频,从新建工程到打包Apk,从头做到尾,没有遗漏任何实现细节,欢迎学过Android基础的同学参加,如果你做过其他终端软件开发,也可以学习,快速上手Android基础开发。 Android记事本课…

【R语言】获取数据

R语言自带2种数据存储格式:*.RData和*.rds。 这两者的区别是:前者既可以存储数据,也可以存储当前工作空间中的所有变量,属于非标准化存储;后者仅用于存储单个R对象,且存储时可以创建标准化档案&#xff0c…

为什么在springboot中使用autowired的时候它黄色警告说不建议使用字段注入

byType找到多种实现类导致报错 Autowired: 通过byType 方式进行装配, 找不到或是找到多个,都会抛出异常 我们在单元测试中无法进行字段注入 字段注入通常是 private 修饰的,Spring 容器通过反射为这些字段注入依赖。然而,在单元测试中&…

Unity游戏(Assault空对地打击)开发(6) 鼠标光标的隐藏

前言 鼠标光标在游戏界面太碍眼了&#xff0c;要隐藏掉。 详细操作 新建一个脚本HideCursor&#xff0c;用于隐藏/取消隐藏光标。 写入以下代码。 意义&#xff1a;游戏开始自动隐藏光标&#xff0c;按Esc&#xff08;隐藏<-->显示&#xff09;。 using System.Collectio…

哪些专业跟FPGA有关?

FPGA产业作为近几年新兴的技术领域&#xff0c;薪资高、待遇好&#xff0c;吸引了大量的求职者。特别是对于毕业生&#xff0c;FPGA领域的岗位需求供不应求。那么&#xff0c;哪些专业和FPGA相关呢&#xff1f; 哪些专业跟FPGA有关&#xff1f; 微电子学与固体电子学、微电子科…

UE5 蓝图学习计划 - Day 14:搭建基础游戏场景

在上一节中&#xff0c;我们 确定了游戏类型&#xff0c;并完成了 项目搭建、角色蓝图的基础设置&#xff08;移动&#xff09;。今天&#xff0c;我们将进一步完善 游戏场景&#xff0c;搭建 地形、墙壁、机关、触发器 等基础元素&#xff0c;并添加角色跳跃功能&#xff0c;为…

ZooKeeper单节点详细部署流程

ZooKeeper单节点详细部署流程 文章目录 ZooKeeper单节点详细部署流程 一.下载稳定版本**ZooKeeper**二进制安装包二.安装并启动**ZooKeeper**1.安装**ZooKeeper**2.配置并启动**ZooKeeper** ZooKeeper 版本与 JDK 兼容性3.检查启动状态4.配置环境变量 三.可视化工具管理**Zooke…

Python----Python高级(并发编程:进程Process,多进程,进程间通信,进程同步,进程池)

一、进程Process 拥有自己独立的堆和栈&#xff0c;既不共享堆&#xff0c;也不共享栈&#xff0c;进程由操作系统调度&#xff1b;进程切换需要的资源很最大&#xff0c;效率低。 对于操作系统来说&#xff0c;一个任务就是一个进程&#xff08;Process&#xff09;&#xff…

ComfyUI安装调用DeepSeek——DeepSeek多模态之图形模型安装问题解决(ComfyUI-Janus-Pro)

ComfyUI 的 Janus-Pro 节点&#xff0c;一个统一的多模态理解和生成框架。 试用&#xff1a; https://huggingface.co/spaces/deepseek-ai/Janus-1.3B https://huggingface.co/spaces/deepseek-ai/Janus-Pro-7B https://huggingface.co/spaces/deepseek-ai/JanusFlow-1.3B 安装…

UE求职Demo开发日志#22 显示人物信息,完善装备的穿脱

1 创建一个人物信息显示的面板&#xff0c;方便测试 简单弄一下&#xff1a; UpdateInfo函数&#xff1a; 就是获取ASC后用属性更新&#xff0c;就不细看了 2 实现思路 在操作目标为装备栏&#xff0c;或者操作起点为装备栏时&#xff0c;交换前先判断能否交换&#xff08;只…

如何安装PHP依赖库 更新2025.2.3

要在PHP项目中安装依赖&#xff0c;首先需要确保你的系统已经安装了Composer。Composer是PHP的依赖管理工具&#xff0c;它允许你声明项目所需的库&#xff0c;并管理它们。以下是如何安装Composer和在PHP项目中安装依赖的步骤&#xff1a; 一. 安装Composer 对于Windows用户…

java求职学习day28

XML 1. XML基本介绍 1.1 概述 XML 即可扩展标记语言&#xff08; Extensible Markup Language &#xff09; (1)W3C 在 1998 年 2 月发布 1.0 版本&#xff0c; 2004 年 2 月又发布 1.1 版本&#xff0c;但因为 1.1 版本不能向下兼容 1.0 版本&#xff0c;所以1.1 没有人用。…

2022ACMToG | 寻找快速的去马赛克算法

文章标题&#xff1a;Searching for Fast Demosaicking Algorithms 1. Abstract 本文提出了一种方法&#xff0c;用于在给定损失函数和训练数据的情况下&#xff0c;自动合成高效且高质量的去马赛克算法&#xff0c;涵盖各种计算开销。该方法执行多目标的离散-连续优化&#x…

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录 说明 通常分为两种类型&#xff1a; 本地文件包含 典型的攻击方式1&#xff1a; 影响&#xff1a; 典型的攻击方式2&#xff1a; 包含路径解释&#xff1a; 日志包含漏洞&#xff1a; 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…

机器学习8-卷积和卷积核1

机器学习8-卷积和卷积核1 卷积与图像去噪卷积的定义与性质定义性质卷积的原理卷积步骤卷积的示例与应用卷积的优缺点优点缺点 总结 高斯卷积核卷积核尺寸的设置依据任务类型考虑数据特性实验与调优 高斯函数标准差的设置依据平滑需求结合卷积核尺寸实际应用场景 总结 图像噪声与…

Android --- handler详解

handler 理解 handler 是一套Android 消息传递机制&#xff0c;主要用于线程间通信。 tips&#xff1a; binder/socket 用于进程间通信。 参考&#xff1a; Android 进程间通信-CSDN博客 handler 就是主线程在起了一个子线程&#xff0c;子线程运行并生成message &#xff0c;l…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…