【深度学习】搭建卷积神经网络并进行参数解读
第一步 导包
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
from torchvision import datasets,transforms
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
transforms
模块是 torchvision
库的一部分,提供了多种图像变换方法,这些方法可以用于预处理和增强数据集中的图像。在训练深度学习模型时,对输入数据进行适当的预处理和增强是非常重要的步骤,它可以帮助提高模型的性能、加速收敛过程,并有助于防止过拟合。
以下是 transforms
模块中一些常用的变换方法及其用途:
-
transforms.ToTensor()
:-
将PIL Image或NumPy数组转换为PyTorch张量。
-
还会将图像像素值从[0, 255]缩放到[0.0, 1.0]范围内的浮点数。
-
-
transforms.Normalize(mean, std)
:-
对每个通道(如RGB)使用给定的均值和标准差对张量图像进行归一化。
-
例如,对于RGB图像,你可以提供一个均值列表(如
[0.485, 0.456, 0.406]
)和一个标准差列表(如[0.229, 0.224, 0.225]
),这两个值通常是基于ImageNet数据集计算得到的。
-
-
transforms.Resize(size)
:-
调整输入图像的大小到指定尺寸。
-
size
可以是一个整数(表示调整后的最小边长)或一个元组(表示宽和高的具体数值)。
-
-
transforms.CenterCrop(size)
:-
在中心裁剪出一个给定大小的区域。
-
size
可以是一个整数或一个元组,类似于Resize
。
-
-
transforms.RandomCrop(size)
:-
随机从图像中裁剪出一个给定大小的区域。
-
通常用于数据增强。
-
-
transforms.RandomHorizontalFlip(p=0.5)
:-
以给定的概率随机水平翻转图像(默认概率为0.5)。
-
这种变换可以帮助模型更好地泛化,因为它使得模型不会过度依赖于特定的方向性特征。
-
-
transforms.RandomRotation(degrees)
:-
随机旋转图像一定的角度。
-
degrees
参数指定了旋转的角度范围,比如(-45, 45)
表示在-45度到45度之间随机选择旋转角度。
-
-
transforms.ColorJitter(brightness=0, contrast=0, saturation=0, hue=0)
:-
改变图像的亮度、对比度、饱和度和色调。
-
各参数分别指定了各属性变化的最大幅度。
-
第二步 准备数据
# 定义超参数
input_size = 28 #图像的总尺寸28*28
num_classes = 10 #标签的种类数
num_epochs = 3 #训练的总循环周期
batch_size = 64 #一个撮(批次)的大小,64张图片# 训练集
train_dataset = datasets.MNIST(root="./data",train=True,transform = transforms.ToTensor(),download=True)# 测试集
test_dataset = datasets.MNIST(root="./data",train=False,transform = transforms.ToTensor(),download=True)# 构建batch数据
train_loader = torch.utils.data.DataLoader(dataset = train_dataset,batch_size=batch_size,shuffle=True)
test_loader = torch.utils.data.DataLoader(dataset = test_dataset,batch_size=batch_size,shuffle=True)
第三步 构建卷积神经网络模型
class CNN(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Sequential(nn.Conv2d(in_channels=1,out_channels=16,kernel_size=5,stride=1,padding=2),nn.ReLU(),nn.MaxPool2d(kernel_size=2))self.conv2 = nn.Sequential(nn.Conv2d(16,32,5,1,2),nn.ReLU(),nn.Conv2d(32,32,5,1,2),nn.ReLU(),nn.MaxPool2d(2))self.conv3 = nn.Sequential(nn.Conv2d(32,64,5,1,2),nn.ReLU())self.out = nn.Linear(64*7*7,10)def forward(self,x):x = self.conv1(x)x = self.conv2(x)x = self.conv3(x)x = x.view(x.size(0),-1)output = self.out(x)return output
注1:
第一层卷积层:
-
nn.Conv2d
是一个二维卷积层:-
in_channels=1
:输入通道数为1,因为是灰度图像。 -
out_channels=16
:输出通道数为16,即生成16个特征图。 -
kernel_size=5
:卷积核大小为5x5。 -
stride=1
:步长为1。 -
padding=2
:填充2个像素,使得经过卷积后的尺寸保持不变。
-
-
nn.ReLU()
:激活函数,使用ReLU来增加非线性。 -
nn.MaxPool2d(kernel_size=2)
:最大池化层,窗口大小为2x2,步长默认与窗口大小相同,这将尺寸减半。
第二层卷积层:
包含两个 nn.Conv2d
层和一个 nn.MaxPool2d
层:
-
第一个
nn.Conv2d
将16个输入通道映射到32个输出通道。 -
第二个
nn.Conv2d
保持32个输入和输出通道不变。 -
每个卷积层后都有一个
nn.ReLU()
激活函数。 -
最后通过
nn.MaxPool2d(kernel_size=2)
进行最大池化操作,再次将尺寸减半。
第三层卷积层:
只包含一个卷积层和一个激活函数:
-
nn.Conv2d(32, 64, 5, 1, 2)
:从32个输入通道映射到64个输出通道。 -
nn.ReLU()
:应用ReLU激活函数。
全连接层:
定义了一个全连接层 nn.Linear
:
-
输入大小为
64 * 7 * 7
,这是因为最后一层卷积层输出的特征图大小为(64, 7, 7)
。 -
输出大小为10,对应于10个类别(对于MNIST数据集,这些类别是从0到9的数字)。
前向传播:
-
forward
方法定义了前向传播的过程:-
首先通过
self.conv1
、self.conv2
和self.conv3
对输入进行卷积和池化操作。 -
使用
x.view(x.size(0), -1)
将多维张量展平成二维张量,其中第一维保持不变(批次大小),第二维自动计算以适应展平后的数据大小。 -
最后通过
self.out
全连接层进行分类,并返回输出。
-
注2:
在 PyTorch 中,x.size(0)
用于获取张量 x
的第0维度的大小。PyTorch 张量的 .size()
方法返回一个 torch.Size 对象,它类似于 Python 的元组,包含了张量每个维度的大小。你可以通过索引访问各个维度的大小,比如 .size(0)
表示第一个维度(即第0维度)的大小。
具体解释:
假设你有一个形状为 (batch_size, channels, height, width)
的四维张量 x
,其中:
-
第0维度(
x.size(0)
)是批次大小(batch_size
)。 -
第1维度(
x.size(1)
)是通道数(channels
)。 -
第2维度(
x.size(2)
)是高度(height
)。 -
第3维度(
x.size(3)
)是宽度(width
)。
在这种情况下,x.size(0)
就会返回该张量的第一个维度(批次大小)的大小。
注3:
在卷积神经网络中,当你应用卷积操作时,图像的尺寸可能会发生变化。为了控制这种变化,并且在某些情况下保持输入和输出图像的尺寸相同,可以使用填充(padding)。对于一个给定的卷积层,如果你希望其输出尺寸与输入尺寸相同,可以通过选择合适的填充大小来实现。
假设输入图像的尺寸为 W×W(宽度和高度相等的情况),卷积核的大小为 F×F,步长(stride)为 S,填充(padding)大小为 P,则经过该卷积层后的输出尺寸 WoutWout 可以通过以下公式计算:
要使输出尺寸与输入尺寸相同(即 Wout=WWout=W),需要满足:
当步长 S=1 时,为了保持输出尺寸与输入尺寸相同,所需的填充 P 应该是 (F-1)/2,其中 F 是卷积核的大小。
注4:
nn.MaxPool2d(2)
是一个二维最大池化层,它通过对输入图像的每个局部区域应用最大操作来减少其空间尺寸(宽度和高度)。这个过程不仅有助于减少计算量和参数数量,还能在一定程度上控制过拟合。
注5:
在卷积神经网络(CNN)中,每次卷积操作之后通常会紧跟着一个激活函数,最常用的是ReLU(Rectified Linear Unit)。这背后有几个重要的原因:
1. 增加非线性
- **线性与非线性**:卷积操作本质上是线性的(即它包括加权求和),而大多数真实世界的数据(如图像)是非线性的。如果只使用线性变换,无论堆叠多少层,整个网络仍然只能表示线性映射。通过引入非线性的激活函数,可以使得网络能够学习和表达更复杂的模式和关系。
- **ReLU的作用**:ReLU函数定义为 \(f(x) = \max(0, x)\),它简单地将所有负值变为零,并保持正值不变。这种非线性变换允许网络学习更加复杂的功能,这是仅靠线性变换无法实现的。
2. 提升模型的表现
- **稀疏性**:ReLU的一个特点是它可以产生稀疏的激活。由于负值被置为零,这意味着并非所有神经元都会对最终输出有贡献,从而促进了稀疏性。稀疏性有助于提高计算效率,并且可能有助于防止过拟合。
- **梯度消失问题**:相比其他传统的激活函数如Sigmoid或Tanh,ReLU在正输入区域的导数恒等于1,这有助于缓解深层网络中的梯度消失问题。梯度消失是指在网络的反向传播过程中,梯度变得非常小,导致前面层的学习速度极慢甚至停止学习。ReLU的存在可以在一定程度上缓解这一问题,特别是在深度网络中。
3. 计算效率
- **计算简便**:ReLU的计算非常简单,只需要比较每个元素是否大于零并保留该值或者将其设为零。相比之下,像Sigmoid或Tanh这样的激活函数需要进行指数运算,这在计算上更为昂贵。
- **硬件友好**:由于其简单的形式,ReLU非常适合现代硬件加速器(如GPU、TPU等)上的并行计算,进一步提高了训练和推理的速度。
4. 实践证明有效
- **经验验证**:大量研究表明,在许多任务中,使用ReLU作为激活函数可以获得比传统激活函数更好的性能。尤其是在图像识别领域,ReLU已经成为默认的选择之一。
总结
每次卷积后加入ReLU的主要原因是增加非线性、提升模型表现以及提高计算效率。通过这些方式,ReLU帮助构建了强大且高效的深度学习模型。虽然ReLU有许多优点,但也有其局限性,例如对于负输入的“死亡”ReLU问题(某些神经元永远不会再激活),因此近年来也出现了一些ReLU的变种,如Leaky ReLU、Parametric ReLU等,以解决这些问题。不过,即使存在这些问题,ReLU仍然是目前最广泛使用的激活函数之一。
第四步 定义准确率计算函数
def accuracy(predictions, labels):# 使用torch.max找到predictions中每个输入的最大值的索引,# 即预测的类别。torch.max会返回两个张量,第一个是最大值,# 第二个是该最大值对应的索引,所以我们选择[1]来获取索引。pred = torch.max(predictions.data, 1)[1]# eq比较两个张量是否相等,view_as确保labels被调整到与pred相同的形状。# 注意原代码中的`view_as(pred)`写错了,应该是`.view_as(pred)`。rights = pred.eq(labels.data.view_as(pred)).sum().item()# 返回正确的预测数量和总的标签数量return rights, len(labels)
第五步 训练卷积神经网络模型
# 实例化
net = CNN()
# 损失函数
criterion = nn.CrossEntropyLoss()
# 优化器
optimizer = optim.Adam(net.parameters(),lr=0.001)#开始训练
for epoch in range(num_epochs):train_rights = []for batch_idx,(data,target) in enumerate(train_loader):net.train()output = net(data)loss = criterion(output,target)optimizer.zero_grad()loss.backward()optimizer.step()right = accuracy(output,target)train_rights.append(right)if batch_idx % 100 ==0:net.eval()val_rights = []for (data,target) in test_loader:output = net(data)right = accuracy(output,target)val_rights.append(right)#准确率计算train_r = (sum([tup[0] for tup in train_rights]), sum([tup[1] for tup in train_rights]))val_r = (sum([tup[0] for tup in val_rights]), sum([tup[1] for tup in val_rights]))print('当前epoch: {} [{}/{} ({:.0f}%)]\t损失: {:.6f}\t训练集准确率: {:.2f}%\t测试集正确率: {:.2f}%'.format(epoch, batch_idx * batch_size, len(train_loader.dataset),100. * batch_idx / len(train_loader), loss.data, 100. * train_r[0].numpy() / train_r[1], 100. * val_r[0].numpy() / val_r[1]))
训练模型部分:
-
for epoch in range(num_epochs):
:对于每个epoch进行循环。 -
train_rights = []
: 初始化一个列表来存储每一批次的正确预测数量和总样本数。 -
for batch_idx, (data, target) in enumerate(train_loader)
: 遍历训练数据加载器,每次获取一批(batch)的数据和标签。 -
net.train()
: 设置模型为训练模式,这对于使用如Dropout或BatchNorm等层很重要。 -
output = net(data)
: 前向传播,将输入数据通过网络得到输出。 -
loss = criterion(output, target)
: 计算预测输出与实际标签之间的损失。 -
optimizer.zero_grad()
: 清除之前的梯度信息,准备进行新的反向传播计算。 -
loss.backward()
: 反向传播,计算每个参数的梯度。 -
optimizer.step()
: 根据计算得到的梯度更新模型参数。 -
right = accuracy(output, target)
: 调用自定义的accuracy
函数,计算当前批次的准确率。 -
train_rights.append(right)
: 将当前批次的准确率结果添加到train_rights
列表中。
测试模型部分:
-
if batch_idx % 100 == 0:
: 每处理100个batch后执行以下代码块,用于评估模型在验证集上的性能。 -
net.eval()
: 设置模型为评估模式,关闭如Dropout等功能以确保评估时的行为正确。 -
val_rights = []
: 初始化一个列表来存储验证集上每一批次的正确预测数量和总样本数。 -
for (data, target) in test_loader:
: 遍历测试数据加载器,每次获取一批(batch)的数据和标签。 -
output = net(data)
: 前向传播,将输入数据通过网络得到输出。 -
right = accuracy(output, target)
: 计算当前批次的准确率。 -
val_rights.append(right)
: 将当前批次的准确率结果添加到val_rights
列表中。 -
train_r
和val_r
: 分别计算训练集和验证集上的累计正确预测数和总样本数。 -
print(...)
: 打印当前epoch的信息,包括:-
当前epoch编号。
-
已经处理了多少个样本(
batch_idx * batch_size
),总共多少个样本(len(train_loader.dataset)
),以及这个比例(百分比形式)。 -
当前batch的平均损失值。
-
训练集和验证集上的准确率(百分比形式)。注意这里
loss.data
可能需要根据PyTorch版本调整为loss.item()
,因为.data
属性在新版本中已被弃用。
-
卷积神经网络模型构建至此结束。
相关文章:
【深度学习】搭建卷积神经网络并进行参数解读
第一步 导包 import torch import torch.nn as nn import torch.optim as optim import torch.nn.functional as F from torchvision import datasets,transforms import matplotlib.pyplot as plt import numpy as np %matplotlib inline transforms 模块是 torchvision 库的…...
稀疏进化训练:机器学习优化算法中的高效解决方案
稀疏进化训练:机器学习优化算法中的高效解决方案 稀疏进化训练:机器学习优化算法中的高效解决方案引言第一部分:背景与动机1.1 传统优化算法的局限性1.2 进化策略的优势1.3 稀疏性的重要性 第二部分:稀疏进化训练的核心思想2.1 稀…...
Vue - Suspense的使用
在 Vue 3 中,Suspense 是一个用于处理异步组件的 API。它允许在加载异步组件时提供一个后备内容(例如加载指示器),从而改善用户体验。在加载期间,可以在页面上显示一个占位符,而不是让用户看到一个空白或错…...
在K8S中,pending状态一般由什么原因导致的?
在Kubernetes中,资源或Pod处于Pending状态可能有多种原因引起。以下是一些常见的原因和详细解释: 资源不足 概述:当集群中的资源不足以满足Pod或服务的需求时,它们可能会被至于Pending状态。这通常涉及到CPU、内存、存储或其他资…...
【算法】回溯算法专题② ——组合型回溯 + 剪枝 python
目录 前置知识进入正题小试牛刀实战演练总结 前置知识 【算法】回溯算法专题① ——子集型回溯 python 进入正题 组合https://leetcode.cn/problems/combinations/submissions/596357179/ 给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以…...
理解红黑树
简介:红黑树是一种自平衡二叉查找树,由鲁道夫贝尔(Rudolf Bayer)在1972年发明,最初称为“对称二叉B树”。它的设计旨在解决普通二叉查找树在频繁插入和删除操作时可能退化为链表的问题,从而保持高效的查找、…...
从0开始使用面对对象C语言搭建一个基于OLED的图形显示框架(OLED设备层封装)
目录 OLED设备层驱动开发 如何抽象一个OLED 完成OLED的功能 初始化OLED 清空屏幕 刷新屏幕与光标设置1 刷新屏幕与光标设置2 刷新屏幕与光标设置3 绘制一个点 反色 区域化操作 区域置位 区域反色 区域更新 区域清空 测试我们的抽象 整理一下,我们应…...
大模型能力评估数据集都有哪些?
大模型能力的评估数据集种类繁多,涵盖了语言理解、推理、生成、代码能力、安全性和鲁棒性等多个方面。以下是一些主要的评估数据集及其特点: 通用能力评估数据集: MMLU:多模态大规模多语言任务理解数据集,覆盖从基础教育到高级专业水平的57个科目,用于评估模型的知识储备…...
论文阅读(二):理解概率图模型的两个要点:关于推理和学习的知识
1.论文链接:Essentials to Understand Probabilistic Graphical Models: A Tutorial about Inference and Learning 摘要: 本章的目的是为没有概率图形模型背景或没有深入背景的科学家提供一个高级教程。对于更熟悉这些模型的读者,本章将作为…...
《OpenCV》——图像透视转换
图像透视转换简介 在 OpenCV 里,图像透视转换属于重要的几何变换,也被叫做投影变换。下面从原理、实现步骤、相关函数和应用场景几个方面为你详细介绍。 原理 实现步骤 选取对应点:要在源图像和目标图像上分别找出至少四个对应的点。这些对…...
【16届蓝桥杯寒假刷题营】第2期DAY4
【16届蓝桥杯寒假刷题营】第2期DAY4 - 蓝桥云课 问题描述 幼儿园小班的浩楠同学有一个序列 a。 他想知道有多少个整数三元组 (i,j,k) 满足 1≤i,j,k≤n 且 aiajak。 输入格式 共2行,第一行一个整数 n,表示序列的长度。 第二行 n 个整数&#x…...
用 HTML、CSS 和 JavaScript 实现抽奖转盘效果
顺序抽奖 前言 这段代码实现了一个简单的抽奖转盘效果。页面上有一个九宫格布局的抽奖区域,周围八个格子分别放置了不同的奖品名称,中间是一个 “开始抽奖” 的按钮。点击按钮后,抽奖区域的格子会快速滚动,颜色不断变化…...
【人工智能学习笔记 一】 AI分层架构、基本概念分类与产品技术架构
新的一年2025要对AI以及LLM有个强化的学习,所以第一篇先对整体有个大概的认知,一直分不清LLM和AI的关系,在整个体系里的位置,以及AIGC是什么东西,AI AGENT类似豆包等和大语言模型的具体关系是什么,整个AI的…...
windows10 配置使用json server作为图片服务器
步骤1:在vs code中安装json server, npm i -g json-server 注意:需要安装对应版本的json server,不然可能会报错,比如: npm i -g json-server 0.16.3 步骤2:出现如下报错: json-server 不是…...
【Elasticsearch 基础入门】Centos7下Elasticsearch 7.x安装与配置(单机)
Elasticsearch系列文章目录 【Elasticsearch 基础入门】一文带你了解Elasticsearch!!!【Elasticsearch 基础入门】Centos7下Elasticsearch 7.x安装与配置(单机) 目录 Elasticsearch系列文章目录前言单机模式1. 安装 J…...
【MySQL】语言连接
语言连接 一、下载二、mysql_get_client_info1、函数2、介绍3、示例 三、其他函数1、mysql_init2、mysql_real_connect3、mysql_query4、mysql_store_result5、mysql_free_result6、mysql_num_fields7、mysql_num_rows8、mysql_fetch_fields9、mysql_fetch_row10、mysql_close …...
【零拷贝】
目录 一:了解IO基础概念 二:数据流动的层次结构 三:零拷贝 1.传统IO文件读写 2.mmap 零拷贝技术 3.sendFile 零拷贝技术 一:了解IO基础概念 理解CPU拷贝和DMA拷贝 我们知道,操作系统对于内存空间&…...
四、GPIO中断实现按键功能
4.1 GPIO简介 输入输出(I/O)是一个非常重要的概念。I/O泛指所有类型的输入输出端口,包括单向的端口如逻辑门电路的输入输出管脚和双向的GPIO端口。而GPIO(General-Purpose Input/Output)则是一个常见的术语,…...
qt-Quick3D笔记之官方例程Runtimeloader Example运行笔记
qt-Quick3D笔记之官方例程Runtimeloader Example运行笔记 文章目录 qt-Quick3D笔记之官方例程Runtimeloader Example运行笔记1.例程运行效果2.例程缩略图3.项目文件列表4.main.qml5.main.cpp6.CMakeLists.txt 1.例程运行效果 运行该项目需要自己准备一个模型文件 2.例程缩略图…...
IM 即时通讯系统-01-概览
前言 有时候希望有一个 IM 工具,比如日常聊天,或者接受报警信息。 其实主要是工作使用,如果是接收报警等场景,其实DD这种比较符合场景。 那么有没有必要再创造一个DD呢? 答案是如果处于个人的私有化使用࿰…...
二叉树——429,515,116
今天继续做关于二叉树层序遍历的相关题目,一共有三道题,思路都借鉴于最基础的二叉树的层序遍历。 LeetCode429.N叉树的层序遍历 这道题不再是二叉树了,变成了N叉树,也就是该树每一个节点的子节点数量不确定,可能为2&a…...
Baklib构建高效协同的基于云的内容中台解决方案
内容概要 随着云计算技术的飞速发展,内容管理的方式也在不断演变。企业面临着如何在数字化转型过程中高效管理和协同处理内容的新挑战。为应对这些挑战,引入基于云的内容中台解决方案显得尤为重要。 Baklib作为创新型解决方案提供商,致力于…...
MP4基础
一、什么是MP4? MP4是一套用于音频、视频信息的压缩编码标准,由国际标准化组织(ISO)和国际电工委员会(IEC)下属的“动态图像专家组”(Moving Picture Experts Group,即MPEGÿ…...
年化18%-39.3%的策略集 | backtrader通过xtquant连接qmt实战
原创内容第785篇,专注量化投资、个人成长与财富自由。 大年初五,年很快就过完了。 其实就是本身也只是休假一周,但是我们赋予了它太多意义。 周五咱们发布发aitrader v4.1,带了backtraderctp期货的实盘接口: aitra…...
通过Redisson构建延时队列并实现注解式消费
目录 一、序言二、延迟队列实现1、Redisson延时消息监听注解和消息体2、Redisson延时消息发布器3、Redisson延时消息监听处理器 三、测试用例四、结语 一、序言 两个月前接了一个4万的私活,做一个线上商城小程序,在交易过程中不可避免的一个问题就是用户…...
RAG是否被取代(缓存增强生成-CAG)吗?
引言: 本文深入研究一种名为缓存增强生成(CAG)的新技术如何工作并减少/消除检索增强生成(RAG)弱点和瓶颈。 LLMs 可以根据输入给他的信息给出对应的输出,但是这样的工作方式很快就不能满足应用的需要: 因…...
MiniMax:人工智能领域的创新先锋
MiniMax:人工智能领域的创新先锋 在人工智能领域,MiniMax正以其强大的技术实力和创新的模型架构,成为全球关注的焦点。作为一家成立于2021年12月的通用人工智能科技公司,MiniMax专注于开发多模态、万亿参数的MoE(Mixt…...
pytorch基于GloVe实现的词嵌入
PyTorch 实现 GloVe(Global Vectors for Word Representation) 的完整代码,使用 中文语料 进行训练,包括 共现矩阵构建、模型定义、训练和测试。 1. GloVe 介绍 基于词的共现信息(不像 Word2Vec 使用滑动窗口预测&…...
Unity实现按键设置功能代码
一、前言 最近在学习unity2D,想做一个横版过关游戏,需要按键设置功能,让用户可以自定义方向键与攻击键等。 自己写了一个,总结如下。 二、界面效果图 这个是一个csv文件,准备第一列是中文按键说明,第二列…...
C++ 入门速通-第3章【黑马】
内容来源于:黑马 集成开发环境:CLion 先前学习完了C第1章的内容: C 入门速通-第1章【黑马】-CSDN博客 C 入门速通-第2章【黑马】-CSDN博客 下面继续学习第3章: 数组: 字符数组: 多维数组: …...
JavaScript 中的 CSS 与页面响应式设计
JavaScript 中的 CSS 与页面响应式设计 JavaScript 中的 CSS 与页面响应式设计1. 引言2. JavaScript 与 CSS 的基本概念2.1 CSS 的作用2.2 JavaScript 的作用3. 动态控制样式:JavaScript 修改 CSS 的方法3.1 使用 `document.styleSheets` API3.2 使用 `classList` 修改类3.3 使…...
100.3 AI量化面试题:解释配对交易(Pairs Trading)的原理,并说明如何选择配对股票以及设计交易信号
目录 0. 承前1. 配对交易基本原理1.1 什么是配对交易1.2 基本假设 2. 配对选择方法2.1 相关性分析2.2 协整性检验 3. 价差计算方法3.1 简单价格比率3.2 回归系数法 4. 交易信号设计4.1 标准差方法4.2 动态阈值方法 5. 风险管理5.1 止损设计5.2 仓位管理 6. 策略评估6.1 回测框架…...
[SAP ABAP] Debug Skill
SAP ABAP Debug相关资料 [SAP ABAP] DEBUG ABAP程序中的循环语句 [SAP ABAP] 静态断点的使用 [SAP ABAP] 在ABAP Debugger调试器中设置断点 [SAP ABAP] SE11 / SE16N 修改标准表(慎用)...
WSL2中安装的ubuntu开启与关闭探讨
1. PC开机后,查询wsl状态 在cmd或者powersell中输入 wsl -l -vNAME STATE VERSION * Ubuntu Stopped 22. 从windows访问WSL2 wsl -l -vNAME STATE VERSION * Ubuntu Stopped 23. 在ubuntu中打开一个工作区后…...
走向基于大语言模型的新一代推荐系统:综述与展望
HightLight 论文题目:Towards Next-Generation LLM-based Recommender Systems: A Survey and Beyond作者机构:吉林大学、香港理工大学、悉尼科技大学、Meta AI论文地址: https://arxiv.org/abs/2410.1974 基于大语言模型的下一代推荐系统&…...
【深度分析】DeepSeek 遭暴力破解,攻击 IP 均来自美国,造成影响有多大?有哪些好的防御措施?
技术铁幕下的暗战:当算力博弈演变为代码战争 一场针对中国AI独角兽的全球首例国家级密码爆破,揭开了数字时代技术博弈的残酷真相。DeepSeek服务器日志中持续跳动的美国IP地址,不仅是网络攻击的地理坐标,更是技术霸权对新兴挑战者的…...
双指针算法思想——OJ例题扩展算法解析思路
大家好!上一期我发布了关于双指针的OJ平台上的典型例题思路解析,基于上一期的内容,我们这一期从其中内容扩展出来相似例题进行剖析和运用,一起来试一下吧! 目录 一、 基于移动零的举一反三 题一:27. 移除…...
初始Linux(7):认识进程(下)
1. 进程优先级 cpu 资源分配的先后顺序,就是指进程的优先权( priority )。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 linux 很有用,可以改善系统性能。 还可以把进程运行到指定的CPU 上,这样一来…...
人工智能第2章-知识点与学习笔记
结合教材2.1节,阐述什么是知识、知识的特性,以及知识的表示。人工智能最早应用的两种逻辑是什么?阐述你对这两种逻辑表示的内涵理解。什么谓词,什么是谓词逻辑,什么是谓词公式。谈谈你对谓词逻辑中的量词的理解。阐述谓词公式的解…...
Kotlin 协程 与 Java 虚拟线程对比测试(娱乐性质,请勿严谨看待本次测试)
起因 昨天在群里聊到虚拟线程的执行效率问题的时候虽然最后的结论是虚拟线程在针对IO密集型任务时具有很大的优势。但是讨论到虚拟线程和Kotlin 的协程的优势对比的话,这时候所有人都沉默了。所以有了本次的测试 提前声明:本次测试是不严谨的࿰…...
C++中的拷贝构造器(Copy Constructor)
在C中,拷贝构造器(Copy Constructor)是一种特殊的构造函数,用于创建一个新对象,该对象是另一个同类型对象的副本。当使用一个已存在的对象来初始化一个新对象时,拷贝构造器会被调用。 拷贝构造器的定义 拷…...
Spring Boot项目如何使用MyBatis实现分页查询
写在前面:大家好!我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭&#x…...
独立开发经验谈:如何借助 AI 辅助产品 UI 设计
我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上环境和私有化部署均有了越来越多的稳定用户,在这个过程中,我也积累了不少如何开发运营一款独…...
笔灵ai写作技术浅析(三):深度学习
笔灵AI写作的深度学习技术主要基于Transformer架构,尤其是GPT(Generative Pre-trained Transformer)系列模型。 1. Transformer架构 Transformer架构由Vaswani等人在2017年提出,是GPT系列模型的基础。它摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自…...
https数字签名手动验签
以bing.com 为例 1. CA 层级的基本概念 CA 层级是一种树状结构,由多个层级的 CA 组成。每个 CA 负责为其下一层级的实体(如子 CA 或终端实体)颁发证书。层级结构的顶端是 根 CA(Root CA),它是整个 PKI 体…...
为什么LabVIEW适合软硬件结合的项目?
LabVIEW是一种基于图形化编程的开发平台,广泛应用于软硬件结合的项目中。其强大的硬件接口支持、实时数据采集能力、并行处理能力和直观的用户界面,使得它成为工业控制、仪器仪表、自动化测试等领域中软硬件系统集成的理想选择。LabVIEW的设计哲学强调模…...
C# 操作符重载对象详解
.NET学习资料 .NET学习资料 .NET学习资料 一、操作符重载的概念 在 C# 中,操作符重载允许我们为自定义的类或结构体定义操作符的行为。通常,我们熟悉的操作符,如加法()、减法(-)、乘法&#…...
git:恢复纯版本库
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
java异常处理——try catch finally
单个异常处理 1.当try里的代码发生了catch里指定类型的异常之后,才会执行catch里的代码,程序正常执行到结尾 2.如果try里的代码发生了非catch指定类型的异常,则会强制停止程序,报错 3.finally修饰的代码一定会执行,除…...
【架构面试】二、消息队列和MySQL和Redis
MQ MQ消息中间件 问题引出与MQ作用 常见面试问题:面试官常针对项目中使用MQ技术的候选人提问,如如何确保消息不丢失,该问题可考察候选人技术能力。MQ应用场景及作用:以京东系统下单扣减京豆为例,MQ用于交易服和京豆服…...