当前位置: 首页 > news >正文

【动手学深度学习】基于Python动手实现线性神经网络

深度学习入门:基于Python动手实现线性回归

  • 1,走进深度学习
  • 2,配置说明
  • 3,线性神经网络
  • 4,线性回归从0开始实现
    • 4.1,导入相关库
    • 4.2,生成数据
    • 4.3,读取数据集
    • 4.4,初始化模型参数
    • 4.5,定义模型、损失函数、优化算法
    • 4.6,模型训练
  • 5,线性回归简洁实现
    • 5.1,导入相关库
    • 5.2,生成数据集
    • 5.3,读取数据集
    • 5.4,定义模型
    • 5.5,初始化模型参数
    • 5.6,定义损失函数和优化算法
    • 5.7,模型训练完整过程


1,走进深度学习

在科幻巨制《钢铁侠》中,托尼·斯塔克身边那位无所不知、无所不能的智能助手贾维斯,不仅展现了未来科技的无限魅力,更是深度学习技术的一次梦幻预演。想象一下,一个能够实时分析数据、预测战斗策略、甚至理解并回应主人复杂指令的AI伙伴,这不仅仅是电影的幻想,而是深度学习正逐步迈向的现实。今天,就让我们一同揭开深度学习的神秘面纱,探索它如何一步步将科幻梦想照进现实。

请添加图片描述


2,配置说明

学习此教程,需要安装配置Anaconda和pytorch,最好创建一个专门的conda虚拟环境用来学习。学习之前需要进行如下准备:

  • 创建Conda虚拟环境
  • 安装开源学习库:d2l
  • 安装IDE:Jupyter Notebook
  • 安装深度学习框架:Pytorch
  • 参考书: 动手学深度学习(李沐)

3,线性神经网络

经典统计学习技术中的线性回归可以视为线性神经网络。本篇文章,我们将从深度学习的经典算法——线性神经网络开始,介绍神经网络的基础知识。这些知识将为本书其他部分中更复杂的技术奠定基础。


4,线性回归从0开始实现

自己编写函数从0开始实现线性神经网络。

4.1,导入相关库

# 在Jupyter Notebook中直接显示Matplotlib生成的图形
%matplotlib inlineimport random
import torch
from d2l import torch as d2l

4.2,生成数据

定义 synthetic_data 数据生成函数,生成模拟数据:

# synthetic_data函数可以根据带有噪声的线性模型构造一个人造数据集
def synthetic_data(w, b, num_examples): # 生成一个服从正态分布的随机数,均值0,标准差为1,(num_examples, len(w))是形状X = torch.normal(0, 1, (num_examples, len(w)))y = torch.matmul(X, w) + b   # 即y=Xw+b# 加入随机噪音,模拟真实数据y += torch.normal(0, 0.01, y.shape)# 括号内第一个参数,-1 表示自动计算行的大小,以确保总的元素数量不变# 括号内第二个参数1表示列return X, y.reshape((-1, 1))

用w和b,生成数据。需要注意的是,计算y=Xw+b时:

  • w 是一维的,PyTorch 执行矩阵乘法时自动将其视为一个向量进行矩阵乘法,w形状为2行1列
  • b是标量,最后pytorch内部自动扩展为y的形状,执行广播加法
# 设置真实的w和 b
true_w = torch.tensor([2, -3.4])  # 此处true_w 是一个包含两个元素的一维张量
true_b = 4.2  # true_b 为一个标量"""
在大多数情况下,当 X 是 (n_samples, n_features) 形状的特征矩阵时,w 会是 (n_features,) 形状的一维张量,代表每个特征的权重。
此时,PyTorch会自动将 w 转换为一个形状为 (n_features, 1) 的二维张量(列向量)进行矩阵乘法。
"""# 调用函数生成特征和标号 :返回的features 形状为 (1000, 2);labels形状为 (1000, 1) 
features, labels = synthetic_data(true_w, true_b, 1000)
print(true_w.shape)  # w是一个包含两个元素的一维张量
print(features.shape)
print(labels.shape)

打印内容如下:
在这里插入图片描述


features中的每一行都包含一个二维数据样本, labels中的每一行都包含一维标签值(一个标量)。我们输出第0个样本做检查:

print('features:', features[0],'\nlabel:', labels[0])

输出结果如下:
在这里插入图片描述


绘制所有样本的第二个特征标签之间关系的图像

# set_figsize()可加参数,用于设置 Matplotlib 绘图库生成的图形大小
d2l.set_figsize()"""
特征是通过从正态分布中抽样生成的,并且与权重 w 进行线性组合来产生标签 y。
因此,权重 w 的符号(正或负)将决定相应特征与标签之间的相关性是正相关还是负相关。
true_w = torch.tensor([2, -3.4])* features[:, 1]表示选择所有行和索引为1的列(第二列)图像呈负相关;若选择第一列则为正相关
* 绘制散点图,有的pytorch版本要求detach之后才能转到numpy,最后一个参数1表示散点的大小为1
"""
d2l.plt.scatter(features[:, 1].detach().numpy(), labels.detach().numpy(), 1);

在这里插入图片描述


4.3,读取数据集

定义 data_iter 函数用来读取小批量样本

# 定义函数用来读取小批量样本(因为要用到小批量随机梯度下降做优化)
# 函数的入参为:批量大小,特征,标签
def data_iter(batch_size, features, labels):# 计算样本总数num_examples = len(features)# 创建一个索引列表indices ,包含从0到num_examples-1的整数,这些索引用于访问特征和标签# range(x)用于生成一个0到x(不包括x)的可迭代的整数序列对象# 使用list()转换为列表indices = list(range(num_examples))# random.shuffle打乱列表元素。表示这些样本是随机读取的,无特定的顺序,有助于提高模型的泛化能力random.shuffle(indices)# 迭代(batch_size是步长)for i in range(0, num_examples, batch_size):# 切片。最后一个批量可能不是满的batch_indices = torch.tensor(indices[i: min(i + batch_size, num_examples)])"""使用 yield 创建生成器。每当函数执行到 yield 时,生成器函数使用yield关键字来暂停函数执行并产生一个值,然后在需要下一个值时再次恢复执行。"""# 注意:indices是list,batch_indices转变成了tensor,比如tensor([1, 2, 3])# 根据索引张量batch_indices来选择features中的某些行yield features[batch_indices], labels[batch_indices]

调用函数,输出一个小批量的数据做检查

# 注意batch_size和num_examples的区别,batch_size是小批量的大小
batch_size = 10# 测试一下,打印输出一个小批量的内容
for X, y in data_iter(batch_size, features, labels):# 此处x是 10×2,y是10×1print(X, '\n', y)break

在这里插入图片描述


4.4,初始化模型参数

开始用小批量随机梯度下降优化模型参数之前,需要有一些参数。

我们通过从均值为0、标准差为0.01的正态分布中采样随机数来初始化权重, 并将偏置初始化为0。

# requires_grad=True 表示这个张量在自动微分过程中需要计算梯度以达到更新的目的
w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)# b是一个标量,初始化为0
b = torch.zeros(1, requires_grad=True)

requires_grad=True表示需要计算梯度:

  • 张量在自动微分过程中需要计算梯度以达到更新的目的,因为在初始化参数之后,我们的任务是更新这些参数,直到这些参数足够拟合我们的数据。

  • 每次更新都需要计算损失函数关于模型参数的梯度。 有了这个梯度,我们就可以向减小损失的方向更新每个参数。


4.5,定义模型、损失函数、优化算法

定义线性回归模型

def linreg(X, w, b):  """线性回归模型"""return torch.matmul(X, w) + b

定义损失函数为均方损失(除以2是为了方便求导)

def squared_loss(y_hat, y):  """均方损失"""# 尽量保证真实值y的形状和预测值y_hat的形状相同。return (y_hat - y.reshape(y_hat.shape)) ** 2 / 2

定义优化算法

# 入参 param是一个list,里面包含w 和 b
# 参数 lr(learning rate)表示学习率,除以batch_size是为了确保更新步骤不会因为批量大小的不同而产生过大的步长,从而保持学习过程的稳定性
# 参数 batch_size为批量大小
def sgd(params, lr, batch_size):  #@save"""小批量随机梯度下降"""with torch.no_grad():    # 表示不需要计算梯度(更新的时候不做梯度计算)for param in params:# 下面式子是梯度下降法的固定更新参数公式param -= lr * param.grad / batch_size# 将梯度设为0,可以实现下一次计算梯度的时候与上次的梯度不相关param.grad.zero_()

with torch.no_grad(): 表示此代码块内,禁用自动求导。 param.grad 中已经包含了之前通过反向传播计算出来的梯度信息。因此,在执行参数更新时,我们并不是不做梯度计算,而是说梯度计算是在之前的步骤中完成的。

因为在更新模型参数时,我们实际上已经完成了梯度计算。具体来说,在深度学习的训练过程中,通常包含以下几个步骤:

  • 前向传播:在这个阶段,输入数据通过网络进行计算,得到预测输出
  • 损失计算:将预测输出与真实标签对比,计算出一个表示模型性能好坏的损失值
  • 反向传播:基于损失值,计算损失相对于每个参数的梯度。这是梯度计算的步骤
  • 参数更新:利用计算出来的梯度和选定的优化算法(如SGD、Adam等),调整模型参数以减小损失

此外,对于 params 列表中的每一个 param(即模型的一个参数),执行以下步骤:

  • param -= lr * param.grad / batch_size: 根据参数的梯度来调整参数值。param.grad 是当前参数的梯度,除以 batch_size 可以得到平均梯度,乘以学习率 lr 后从当前参数值中减去,从而朝着减少损失的方向移动
  • param.grad.zero_(): 在更新完参数后,我们需要将该参数的梯度设置为零。如果不这样做,在下一次反向传播时,新的梯度会累加到旧的梯度上

4.6,模型训练

指定训练参数

# 学习率(lr为超参数)
lr = 0.03# 整个数据扫描3遍(三个训练周期)
num_epochs = 3# 模型选择前面定义好的线性模型linreg
net = linreg# loss设为均方损失 
loss = squared_loss

完整训练过程:

for epoch in range(num_epochs):for X, y in data_iter(batch_size, features, labels):l = loss(net(X, w, b), y)  # X和y的小批量损失# 反向传播计算梯度l.sum().backward()# 有了梯度之后再调用sgd更新参数(每次更新完参数都在sgd内部将梯度置为0,保证不影响下一个批量的计算效果)sgd([w, b], lr, batch_size)  # 在sgd()函数中使用参数的梯度(.grad)更新参数# 评估每一个训练周期的效果(评估无需计算梯度)"""with关键字在这里用于创建一个临时的、上下文相关的环境,在这个环境中,梯度计算被禁用。"""with torch.no_grad():# 此处传入的features和labels是整体数据维度train_l = loss(net(features, w, b), labels)# train_l.mean()代表求平均损失print(f'epoch {epoch + 1}, loss {float(train_l.mean()):f}')

反向传播代码解释:

  • PyTorch 的 backward() 函数要求输入是一个标量。而小批量损失 l 是一个形状为(batch_size,1)的张量。因此累加求和后调用backward()自动求导计算梯度;
  • 调用 .backward() 时,PyTorch会进行反向传播,计算损失相对于参数的梯度,并存储在参数的.grad 属性中

代码运行结果如下(运行结果显示,数据扫描到第三遍时平均损失已经很小了):

在这里插入图片描述


5,线性回归简洁实现

使用深度学习框架来简洁地实现线性回归模型

5.1,导入相关库

import numpy as np
import torch# 导入处理数据的模块
from torch.utils import data
from d2l import torch as d2l

5.2,生成数据集

# 定义真实的w和b
true_w = torch.tensor([2, -3.4])
true_b = 4.2# 使用上一节定义的函数生成数据
features, labels = d2l.synthetic_data(true_w, true_b, 1000)

5.3,读取数据集

定义 load_array 函数,配合pytorch框架读取数据

def load_array(data_arrays, batch_size, is_train=True): """构造一个PyTorch数据迭代器"""# 参数data_arrays是一个元组,包含特征(features)和标签(labels)# *表示解包操作符,可以将列表或元组解为独立的参数# 使用data.TensorDataset创建一个数据集对象dataset = data.TensorDataset(*data_arrays)# 使用data.DataLoader创建一数据加载器,它提供了迭代数据集的功能,可自动处理批次大小、打乱数据(如果 shuffle=True)	及多进程数据加载等任务,is_train如果为True表示默认是训练数据,需要打乱return data.DataLoader(dataset, batch_size, shuffle=is_train)

代码中的TensorDataset是PyTorch中的一个类,用于包装数据和标签,使其成为一个数据集

调用函数,读取小批量

batch_size = 10# 读取小批量
data_iter = load_array((features, labels), batch_size)  

读取并打印第一个小批量样本做检查

next(iter(data_iter))

在这里插入图片描述


5.4,定义模型

使用pytorch,定义线性回归模型。线性回归是单层神经网络,使用的是神经网络中的Linear线性层(或全连接层)

# nn是神经网络的缩写(nerve network)
from torch import nn"""
nn.Linear(2, 1)表示输入特征维度为2,输出特征维度为1的线性层
nn.Sequential是一个容器,用于按顺序包装一系列的层
数据会按照在nn.Sequential中定义的顺序通过这些层
"""
net = nn.Sequential(nn.Linear(2, 1))

5.5,初始化模型参数

"""
①将weight初始化为服从正态分布的随机数,这个分布的均值为0,标准差为0.01。normal_是就地操作,意味着它会直接修改weight.data的值,而不是创建一个新的变量②将第一个层的偏置(bias)初始化为0。fill_同样是一个就地操作,它会将bias.data中的所有元素设置为0。③weight的形状由输入特征和输出特征的维度决定。
"""
net[0].weight.data.normal_(0,0.01)
net[0].bias.data.fill_(0)
  • 其中,net[0]代表选择网络中的第一个层(目前只有一个全连接层)

5.6,定义损失函数和优化算法

定义损失函数

  • 计算预测结果和实际结果绝对值的差距得到的Loss叫做MAE
  • 计算实际结果和预测结果之差的平方得到的Loss叫做MSE
# MSELoss:损失函数定义为均方误差
loss = nn.MSELoss()

定义优化算法

  • 小批量随机梯度下降算法是一种优化神经网络的标准工具, PyTorchoptim模块中实现了该算法的许多变种
  • 实例化一个SGD实例时,我们要指定优化的参数 以及优化算法所需的学习率,这里设置为0.03
  • net.parameters() 方法会返回一个包含模型中所有可训练的参数(即权重和偏置)的迭代器
  • 如果在模型中定义某些参数为不可训练(如,设置 requires_grad=False),则这些参数不会被 net.parameters() 返回,也不会被优化器更新
  • 优化器(如SGD)在训练循环中会根据计算得到的梯度来更新网络的参数。每次迭代(或称为一个epoch)中,前向传播计算损失,反向传播计算梯度
# 创建了一个随机梯度下降(SGD)优化器实例 trainer,用于更新 net 中的参数
# 这里的学习率(lr)被设置为0.03
trainer = torch.optim.SGD(net.parameters(), lr=0.03)

5.7,模型训练完整过程

num_epochs = 3
for epoch in range(num_epochs):for X, y in data_iter:# 此处net已初始化参数w和b(5.5中),因此只需传入X即可l = loss(net(X) ,y)# 将SGD优化器的梯度清零trainer.zero_grad()l.backward()# 调用step()函数进行模型的更新trainer.step()# 扫完一遍数据之后,在整体数据的维度(区别小批量数据维度)做一次评估l = loss(net(features), labels)print(f'epoch {epoch + 1}, loss {l:f}')

反向传播代码解释:

  • 计算模型参数的梯度时,无需累加。因为pytorch已经自动对小批量损失 l 求和
  • 当调用 .backward() 时,PyTorch会进行反向传播,计算损失相对于网络参数的梯度,并存储在参数的grad 属性中
  • 还需要调用trainer.step():实现对模型参数的更新

代码运行结果如下:

在这里插入图片描述

比较生成数据集的真实参数和通过有限数据训练获得的模型参数

w = net[0].weight.data
print('w的估计误差:', true_w - w.reshape(true_w.shape))
b = net[0].bias.data
print('b的估计误差:', true_b - b)

代码运行结果如下:

在这里插入图片描述
可以看到:经过训练后,参数的误差已经很小了


相关文章:

【动手学深度学习】基于Python动手实现线性神经网络

深度学习入门:基于Python动手实现线性回归 1,走进深度学习2,配置说明3,线性神经网络4,线性回归从0开始实现4.1,导入相关库4.2,生成数据4.3,读取数据集4.4,初始化模型参数…...

leetcode 912. 排序数组

912. 排序数组 912. 排序数组 题目 给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1: 输入:nums [5,2,3,1…...

【芯片设计】NPU芯片前端设计工程师面试记录·20250227

应聘公司 某NPU/CPU方向芯片设计公司。 小声吐槽两句,前面我问了hr需不需要带简历,hr不用公司给打好了,然后我就没带空手去的。结果hr小姐姐去开会了,手机静音( Ĭ ^ Ĭ )面试官、我、另外的hr小姐姐都联系不上,结果就变成了两个面试官和我一共三个人在会议室里一人拿出…...

BUU40 [CSCCTF 2019 Qual]FlaskLight1【SSTI】

模板: {{.__class__.__base__.__subclasses__()[80].__init__.__globals__[__builtins__].eval("__import__(os).popen(type flag.txt).read()")}} 是个空字符串,.__class__代表这个空字符串的类是什么(这里是单引号双引号都行&a…...

WiFi IEEE 802.11协议精读:IEEE 802.11-2007,6,MAC service definition MAC服务定义

继续精读IEEE 802.11-2007 6,MAC service definition MAC服务定义 6.1 MAC服务概述 6.1.1 数据服务 此服务为对等逻辑链路控制(LLC)实体提供交换MAC服务数据单元(MSDU)的能力。为支持此服务,本地媒体访…...

2025学年安徽省职业院校技能大赛 “信息安全管理与评估”赛项 比赛样题任务书

2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(五) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务1 :内存取证&…...

VAE变分自编码器的初步理解

VAE的结构和原理 VAE由两部分组成: 编码器(Encoder): 编码器负责将输入数据(例如图像)压缩成一个潜在空间(latent space)的表示。这个潜在空间不是一个固定的值,而是一个…...

2025 最新版鸿蒙 HarmonyOS 开发工具安装使用指南

为保证 DevEco Studio 正常运行,建议电脑配置满足如下要求: Windows 系统 操作系统:Windows10 64 位、Windows11 64 位内存:16GB 及以上硬盘:100GB 及以上分辨率:1280*800 像素及以上 macOS 系统 操作系统…...

Rider 安装包 绿色版 Win/Mac/Linux 适合.NET和游戏开发者使用 2025全栈开发终极指南:从零配置到企业级实战

下载链接: https://pan.baidu.com/s/1cfkJf6Zgxc1XfYrVpwtHkA?pwd1234 导语:JetBrains Rider以跨平台支持率100%、深度.NET集成和智能代码分析能力,成为2025年全栈开发者的首选工具。本文涵盖环境配置、核心功能、框架集成、性能调优、团队…...

Python常见面试题的详解24

1. 如何对关键词触发模块进行测试 要点 功能测试:验证正常关键词触发、边界情况及大小写敏感性,确保模块按预期响应不同输入。 性能测试:关注响应时间和并发处理能力,保证模块在不同负载下的性能表现。 兼容性测试:测…...

手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中,使用蓝牙电话拦截手机通话的声音,并对数据加工,这个功能出来也有一段时间了。前段时间有试用的用户咨询说:有没有办法在手机上&#xff…...

RabbitMQ操作实战

1.RabbitMQ安装 RabbitMQ Windows 安装、配置、使用 - 小白教程-腾讯云开发者社区-腾讯云下载erlang:http://www.erlang.org/downloads/https://cloud.tencent.com/developer/article/2192340 Windows 10安装RabbitMQ及延时消息插件rabbitmq_delayed_message_exch…...

IDEA 2024.1 最新永久可用(亲测有效)

今年idea发布了2024.1版本,这个版本带来了一系列令人兴奋的新功能和改进。最引人注目的是集成了更先进的 AI 助手,它现在能够提供更复杂的代码辅助功能,如代码自动补全、智能代码审查等,极大地提升了开发效率。此外,用…...

【R包】pathlinkR转录组数据分析和可视化利器

介绍 通常情况下,基因表达研究如微阵列和RNA-Seq会产生数百到数千个差异表达基因(deg)。理解如此庞大的数据集的生物学意义变得非常困难,尤其是在分析多个条件和比较的情况下。该软件包利用途径富集和蛋白-蛋白相互作用网络&…...

RPA 与 AI 结合:开启智能自动化新时代

RPA 与 AI 结合:开启智能自动化新时代 在当今数字化快速发展的时代,企业面临着海量的数据处理和复杂的业务流程,如何提高效率、降低成本、优化业务流程成为了企业关注的焦点。而 RPA(Robotic Process Automation,机器…...

[免费]Springboot+Vue在线文档管理系统【论文+源码+SQL脚本】

大家好,我是java1234_小锋老师,看到一个不错的SpringbootVue在线文档管理系统,分享下哈。 项目视频演示 【免费】SpringBootVue在线文档管理系统 Java毕业设计_哔哩哔哩_bilibili 项目介绍 随着科学技术的飞速发展,社会的方方面…...

内容选题与商业布局

内容选题与商业布局 提示词 1:人群链(User Chain)提示词 2:需求链(Demand Chain)提示词 3:环境 需求 优势 三要素提示词 4:垂直于“人性”而非只“赛道”提示词 5:基于…...

文字描边实现内黄外绿效果

网页使用 <!DOCTYPE html> <html> <head> <style> .text-effect {color: #ffd700; /* 黄色文字 */-webkit-text-stroke: 2px #008000; /* 绿色描边&#xff08;兼容Webkit内核&#xff09; */text-stroke: 2px #008000; /* 标准语法 *…...

网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析

1. 基本定义 HTTP&#xff08;HyperText Transfer Protocol&#xff09; 应用层协议&#xff0c;用于客户端与服务器之间的数据传输&#xff08;默认端口 80&#xff09;。 HTTP/1.0&#xff1a;早期版本&#xff0c;每个请求需单独建立 TCP 连接&#xff0c;效率低。HTTP/1.1&…...

千峰React:Hooks(上)

什么是Hooks ref引用值 普通变量的改变一般是不好触发函数组件的渲染的&#xff0c;如果想让一般的数据也可以得到状态的保存&#xff0c;可以使用ref import { useState ,useRef} from reactfunction App() {const [count, setCount] useState(0)let num useRef(0)const h…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...