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

AI-02a5a7.神经网络-与学习相关的技巧-正则化

过拟合

过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。

在机器学习的问题中,过拟合是很常见的问题。

而机器学习的目标是提高泛化能力,即便是没有包含在训练数据里的未观测数据,也希望模型可以进行正确的识别。

过拟合的原因,主要有两个:

  • 模型有大量参数、表现力强。
  • 训练数据少。

主动制造过拟合:

从MNIST数据集原本的60000个训练数据中只选定300个,并且,为了增加网络的复杂度,使用7层网络(每层有100个神经元,激活函数为ReLU)。

在这里插入图片描述

过了 100 个 epoch 左右后,用训练数据测量到的识别精度几乎都为100%。但是,对于测试数据,离100%的识别精度还有较大的差距。如此大的识别精度差距,是只拟合了训练数据的结果。

权值衰减

L1和L2 详解(范数、损失函数、正则化) - 知乎

权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。很多过拟合原本就是因为权重参数取值过大才发生的。

神经网络的学习目的是减小损失函数的值。这时,例如为损失函数加上权重的平方范数(L2范数)。
这样一来,就可以抑制权重变大。用符号表示的话,如果将权重记为 W W W,L2范数的权值衰减就是 1 2 λ W 2 \frac{1}{2} \lambda W^2 21λW2,然后将这个 1 2 λ W 2 \frac{1}{2} \lambda W^2 21λW2加到损失函数上。这里, λ \lambda λ是控制正则化强度的超参数。 λ \lambda λ设置得越大,对大的权重施加的惩罚就越重。此外, 1 2 λ W 2 \frac{1}{2} \lambda W^2 21λW2开头的 是用于 1 2 \frac{1}{2} 21 1 2 λ W 2 \frac{1}{2} \lambda W^2 21λW2的求导结果变成 λ W \lambda W λW的调整用常量。

对于所有权重,权值衰减方法都会为损失函数加上 1 2 λ W 2 \frac{1}{2} \lambda W^2 21λW2。因此,在求权重梯度的计算中,要为之前的误差反向传播法的结果加上正则化项的导数 λ W \lambda W λW

L2范数相当于各个元素的平方和。用数学式表示的话,假设有权重 W = ( w 1 , w 2 , . . . , w n ) W = (w_1, w_2, ... , w_n) W=(w1,w2,...,wn),则 L2范数可用 w 1 2 , w 2 2 , . . . , w n 2 \sqrt{w_1^2, w_2^2, ... , w_n^2} w12,w22,...,wn2 计算出来。
L1范数是各个元素的绝对值之和,相当于 ∣ w 1 ∣ + ∣ w 2 ∣ + . . . + ∣ w n ∣ |w1| + |w2| + ... + |wn| w1∣+w2∣+...+wn
L ∞ L_\infty L范数也称为Max范数,相当于各个元素的绝对值中最大的那一个。

在这里插入图片描述

使用了权值衰减的训练数据和测试数据的识别精度的变化使用了权值衰减的训练数据和测试数据的识别精度的变化。

# coding: utf-8
import os
import sys
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.multi_layer_net import MultiLayerNet
from common.optimizer import SGD
from matplotlib import rcParams# 设置中文字体
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)# 为了再现过拟合,减少学习数据
x_train = x_train[:300]
t_train = t_train[:300]# weight decay(权值衰减)的设定 =======================
#weight_decay_lambda = 0 # 不使用权值衰减的情况
weight_decay_lambda = 0.1# ====================================================
network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10, weight_decay_lambda=weight_decay_lambda)optimizer = SGD(lr=0.01)
max_epochs = 201
train_size = x_train.shape[0]
batch_size = 100train_loss_list = []
train_acc_list = []
test_acc_list = []iter_per_epoch = max(train_size / batch_size, 1)
epoch_cnt = 0for i in range(1000000000):batch_mask = np.random.choice(train_size, batch_size)x_batch = x_train[batch_mask]t_batch = t_train[batch_mask]grads = network.gradient(x_batch, t_batch)optimizer.update(network.params, grads)if i % iter_per_epoch == 0:train_acc = network.accuracy(x_train, t_train)test_acc = network.accuracy(x_test, t_test)train_acc_list.append(train_acc)test_acc_list.append(test_acc)print("epoch:" + str(epoch_cnt) + ", train acc:" + str(train_acc) + ", test acc:" + str(test_acc))epoch_cnt += 1if epoch_cnt >= max_epochs:break# 3.绘制图形==========
title = ""
if weight_decay_lambda == 0:title = "过拟合中训练数据和测试数据的识别精度的变化"
else:title = '使用了权值衰减的训练数据和测试数据的识别精度的变化'markers = {'train': 'o', 'test': 's'}
x = np.arange(max_epochs)
plt.plot(x, train_acc_list, marker='o', label='train', markevery=10)
plt.plot(x, test_acc_list, marker='s', label='test', markevery=10)
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
plt.title(title)
plt.show()

Dropout

如果网络的模型变得很复杂,只用权值衰减就难以应对了。

Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递,如图6-22所示。训练时,每传递一次数据,就会随机选择要删除的神经元。然后,测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出,要乘上训练时的删除比例后再输出。

在这里插入图片描述

下图是关于是否使用Dropout的对比图,通过使用Dropout,训练数据和测试数据的识别精度的差距变小了。并且,训练数据也没有到达100%的识别精度。像这样,通过使用Dropout,即便是表现力强的网络,也可以抑制过拟合。

机器学习中经常使用集成学习。所谓集成学习,就是让多个模型单独进行学习,推理时再取多个模型的输出的平均值。用神经网络的语境来说,比如,准备 5个结构相同(或者类似)的网络,分别进行学习,测试时,以这 5个网络的输出的平均值作为答案。实验告诉我们,通过进行集成学习,神经网络的识别精度可以提高好几个百分点。这个集成学习与 Dropout有密切的关系。这是因为可以将 Dropout理解为,通过在学习过程中随机删除神经元,从而每一次都让不同的模型进行学习。并且,推理时,通过对神经元的输出乘以删除比例(比如,0.5等),可以取得模型的平均值。也就是说,可以理解成,Dropout将集成学习的效果(模拟地)通过一个网络实现了。

在这里插入图片描述

dropout.py(简易实现)

"""
每次正向传播时,self.mask中都会以False的形式保存要删除的神经元。
self.mask会随机生成和x形状相同的数组,并将值比dropout_ratio大的元素设为True。
反向传播时的行为和ReLU相同。也就是说,正向传播时传递了信号的神经元,反向传播时按原样传递信号;
正向传播时没有传递信号的神经元,反向传播时信号将停在那里。
"""
class Dropout:"""http://arxiv.org/abs/1207.0580"""def __init__(self, dropout_ratio=0.5):self.dropout_ratio = dropout_ratioself.mask = Nonedef forward(self, x, train_flg=True):if train_flg:self.mask = np.random.rand(*x.shape) > self.dropout_ratioreturn x * self.maskelse:return x * (1.0 - self.dropout_ratio)def backward(self, dout):return dout * self.mask

trainer.py

# coding: utf-8
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
from common.optimizer import *class Trainer:"""进行神经网络的训练的类"""def __init__(self, network, x_train, t_train, x_test, t_test,epochs=20, mini_batch_size=100,optimizer='SGD', optimizer_param={'lr':0.01},evaluate_sample_num_per_epoch=None, verbose=True):self.network = networkself.verbose = verboseself.x_train = x_trainself.t_train = t_trainself.x_test = x_testself.t_test = t_testself.epochs = epochsself.batch_size = mini_batch_sizeself.evaluate_sample_num_per_epoch = evaluate_sample_num_per_epoch# optimzeroptimizer_class_dict = {'sgd':SGD, 'momentum':Momentum, 'nesterov':Nesterov,'adagrad':AdaGrad, 'rmsprpo':RMSprop, 'adam':Adam}self.optimizer = optimizer_class_dict[optimizer.lower()](**optimizer_param)self.train_size = x_train.shape[0]self.iter_per_epoch = max(self.train_size / mini_batch_size, 1)self.max_iter = int(epochs * self.iter_per_epoch)self.current_iter = 0self.current_epoch = 0self.train_loss_list = []self.train_acc_list = []self.test_acc_list = []def train_step(self):batch_mask = np.random.choice(self.train_size, self.batch_size)x_batch = self.x_train[batch_mask]t_batch = self.t_train[batch_mask]grads = self.network.gradient(x_batch, t_batch)self.optimizer.update(self.network.params, grads)loss = self.network.loss(x_batch, t_batch)self.train_loss_list.append(loss)if self.verbose: print("train loss:" + str(loss))if self.current_iter % self.iter_per_epoch == 0:self.current_epoch += 1x_train_sample, t_train_sample = self.x_train, self.t_trainx_test_sample, t_test_sample = self.x_test, self.t_testif not self.evaluate_sample_num_per_epoch is None:t = self.evaluate_sample_num_per_epochx_train_sample, t_train_sample = self.x_train[:t], self.t_train[:t]x_test_sample, t_test_sample = self.x_test[:t], self.t_test[:t]train_acc = self.network.accuracy(x_train_sample, t_train_sample)test_acc = self.network.accuracy(x_test_sample, t_test_sample)self.train_acc_list.append(train_acc)self.test_acc_list.append(test_acc)if self.verbose: print("=== epoch:" + str(self.current_epoch) + ", train acc:" + str(train_acc) + ", test acc:" + str(test_acc) + " ===")self.current_iter += 1def train(self):for i in range(self.max_iter):self.train_step()test_acc = self.network.accuracy(self.x_test, self.t_test)if self.verbose:print("=============== Final Test Accuracy ===============")print("test acc:" + str(test_acc))

multi_layer_net_extend.py

# coding: utf-8
import sys, os
sys.path.append(os.pardir) # 为了导入父目录的文件而进行的设定
import numpy as np
from collections import OrderedDict
from common.layers import *
from common.gradient import numerical_gradientclass MultiLayerNetExtend:"""扩展版的全连接的多层神经网络具有Weiht Decay、Dropout、Batch Normalization的功能Parameters----------input_size : 输入大小(MNIST的情况下为784)hidden_size_list : 隐藏层的神经元数量的列表(e.g. [100, 100, 100])output_size : 输出大小(MNIST的情况下为10)activation : 'relu' or 'sigmoid'weight_init_std : 指定权重的标准差(e.g. 0.01)指定'relu'或'he'的情况下设定“He的初始值”指定'sigmoid'或'xavier'的情况下设定“Xavier的初始值”weight_decay_lambda : Weight Decay(L2范数)的强度use_dropout: 是否使用Dropoutdropout_ration : Dropout的比例use_batchNorm: 是否使用Batch Normalization"""def __init__(self, input_size, hidden_size_list, output_size,activation='relu', weight_init_std='relu', weight_decay_lambda=0,use_dropout = False, dropout_ration = 0.5, use_batchnorm=False):self.input_size = input_sizeself.output_size = output_sizeself.hidden_size_list = hidden_size_listself.hidden_layer_num = len(hidden_size_list)self.use_dropout = use_dropoutself.weight_decay_lambda = weight_decay_lambdaself.use_batchnorm = use_batchnormself.params = {}# 初始化权重self.__init_weight(weight_init_std)# 生成层activation_layer = {'sigmoid': Sigmoid, 'relu': Relu}self.layers = OrderedDict()for idx in range(1, self.hidden_layer_num+1):self.layers['Affine' + str(idx)] = Affine(self.params['W' + str(idx)], self.params['b' + str(idx)])if self.use_batchnorm:self.params['gamma' + str(idx)] = np.ones(hidden_size_list[idx-1])self.params['beta' + str(idx)] = np.zeros(hidden_size_list[idx-1])self.layers['BatchNorm' + str(idx)] = BatchNormalization(self.params['gamma' + str(idx)], self.params['beta' + str(idx)])self.layers['Activation_function' + str(idx)] = activation_layer[activation]()if self.use_dropout:self.layers['Dropout' + str(idx)] = Dropout(dropout_ration)idx = self.hidden_layer_num + 1self.layers['Affine' + str(idx)] = Affine(self.params['W' + str(idx)], self.params['b' + str(idx)])self.last_layer = SoftmaxWithLoss()def __init_weight(self, weight_init_std):"""设定权重的初始值Parameters----------weight_init_std : 指定权重的标准差(e.g. 0.01)指定'relu'或'he'的情况下设定“He的初始值”指定'sigmoid'或'xavier'的情况下设定“Xavier的初始值”"""all_size_list = [self.input_size] + self.hidden_size_list + [self.output_size]for idx in range(1, len(all_size_list)):scale = weight_init_std        if str(weight_init_std).lower() in ('relu', 'he'):scale = np.sqrt(2.0 / all_size_list[idx - 1])  # 使用ReLU的情况下推荐的初始值elif str(weight_init_std).lower() in ('sigmoid', 'xavier'):scale = np.sqrt(1.0 / all_size_list[idx - 1])  # 使用sigmoid的情况下推荐的初始值self.params['W' + str(idx)] = scale * np.random.randn(all_size_list[idx-1], all_size_list[idx])self.params['b' + str(idx)] = np.zeros(all_size_list[idx])def predict(self, x, train_flg=False):for key, layer in self.layers.items():if "Dropout" in key or "BatchNorm" in key:x = layer.forward(x, train_flg)else:x = layer.forward(x)return xdef loss(self, x, t, train_flg=False):"""求损失函数参数x是输入数据,t是教师标签"""y = self.predict(x, train_flg)weight_decay = 0for idx in range(1, self.hidden_layer_num + 2):W = self.params['W' + str(idx)]weight_decay += 0.5 * self.weight_decay_lambda * np.sum(W**2)return self.last_layer.forward(y, t) + weight_decaydef accuracy(self, X, T):Y = self.predict(X, train_flg=False)Y = np.argmax(Y, axis=1)if T.ndim != 1 : T = np.argmax(T, axis=1)accuracy = np.sum(Y == T) / float(X.shape[0])return accuracydef numerical_gradient(self, X, T):"""求梯度(数值微分)Parameters----------X : 输入数据T : 正确标签Returns-------具有各层的梯度的字典变量grads['W1']、grads['W2']、...是各层的权重grads['b1']、grads['b2']、...是各层的偏置"""loss_W = lambda W: self.loss(X, T, train_flg=True)grads = {}for idx in range(1, self.hidden_layer_num+2):grads['W' + str(idx)] = numerical_gradient(loss_W, self.params['W' + str(idx)])grads['b' + str(idx)] = numerical_gradient(loss_W, self.params['b' + str(idx)])if self.use_batchnorm and idx != self.hidden_layer_num+1:grads['gamma' + str(idx)] = numerical_gradient(loss_W, self.params['gamma' + str(idx)])grads['beta' + str(idx)] = numerical_gradient(loss_W, self.params['beta' + str(idx)])return gradsdef gradient(self, x, t):# forwardself.loss(x, t, train_flg=True)# backwarddout = 1dout = self.last_layer.backward(dout)layers = list(self.layers.values())layers.reverse()for layer in layers:dout = layer.backward(dout)# 设定grads = {}for idx in range(1, self.hidden_layer_num+2):grads['W' + str(idx)] = self.layers['Affine' + str(idx)].dW + self.weight_decay_lambda * self.params['W' + str(idx)]grads['b' + str(idx)] = self.layers['Affine' + str(idx)].dbif self.use_batchnorm and idx != self.hidden_layer_num+1:grads['gamma' + str(idx)] = self.layers['BatchNorm' + str(idx)].dgammagrads['beta' + str(idx)] = self.layers['BatchNorm' + str(idx)].dbetareturn grads

overfit_dropout.py

使用MNIST数据集进行验证,以确认Dropout的效果。

# coding: utf-8
import os
import sys
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import matplotlib.pyplot as plt
from dataset.mnist import load_mnist
from common.multi_layer_net_extend import MultiLayerNetExtend
from common.trainer import Trainer
from matplotlib import rcParams# 设置中文字体
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 解决负号显示问题(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)# 为了再现过拟合,减少学习数据
x_train = x_train[:300]
t_train = t_train[:300]# 设定是否使用Dropuout,以及比例 ========================
use_dropout = True  # 不使用Dropout的情况下为False
dropout_ratio = 0.15
# ====================================================network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10, use_dropout=use_dropout, dropout_ration=dropout_ratio)
trainer = Trainer(network, x_train, t_train, x_test, t_test, epochs=301, mini_batch_size=100, optimizer='sgd', optimizer_param={'lr': 0.01}, verbose=True)
trainer.train()train_acc_list, test_acc_list = trainer.train_acc_list, trainer.test_acc_list# 绘制图形==========
markers = {'train': 'o', 'test': 's'}
x = np.arange(len(train_acc_list))
plt.plot(x, train_acc_list, marker='o', label='train', markevery=10)
plt.plot(x, test_acc_list, marker='s', label='test', markevery=10)
plt.xlabel("epochs")
plt.ylabel("accuracy")
plt.ylim(0, 1.0)
plt.legend(loc='lower right')
if use_dropout:plt.title("使用Dropout(" + str(dropout_ratio) + str(")"))
else:plt.title("没有使用Dropout")
plt.show()

相关文章:

AI-02a5a7.神经网络-与学习相关的技巧-正则化

过拟合 过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。 在机器学习的问题中,过拟合是很常见的问题。 而机器学习的目标是提高泛化能力,即便是没有包含在训练数据里的未观测数据,也希望模…...

C# 常用密码加密与解密技术完全指南

目录 密码安全的核心概念 加密 vs 哈希:何时使用? 密钥管理的重要性 常见攻击手段(中间人攻击、彩虹表) 基础加密技术 对称加密(AES) 非对称加密(RSA) 哈希算法(SH…...

C++ QT 与 win32 窗口可以互操作

MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);this->setWindowTitle("天下第一剑"); // HWND hwnd FindWindow(L"天下第一剑",L"天下第一剑"); // qDebug()<<…...

MySQL--day4--排序与分页

&#xff08;以下内容全部来自上述课程&#xff09; 1. 排序数据 1.1 排序基本使用 #1.排序 #如果没有使用排序操作&#xff0c;默认情况下查询返回的数据是按照添加数据的顺序显示的 SELECT * FROM employees;# 练习:按照salary从高到低的顺序显示员工信息 # 使用 ORDER …...

文件操作和IO—初识文件

认识文件 狭义上的文件&#xff08;file&#xff09;&#xff0c;是针对硬盘这种持久化存储的IO设备&#xff0c;当我们想要进行数据保存的时候&#xff0c;往往不是保存成一个整体&#xff0c;而是独立成一个个的单位进行保存&#xff0c;这个独立的单位就被抽象成文件的概念…...

P2670 [NOIP 2015 普及组] 扫雷游戏

P2670 [NOIP 2015 普及组] 扫雷游戏 - 洛谷 #include<bits/stdc.h> using namespace std; int n,m; char a[105][105]; int main(){cin>>n>>m;for(int i1;i<n;i){for(int j1;j<m;j){cin>>a[i][j];}}for(int i1;i<n;i){for(int j1;j<m;j){…...

HomeAssistant开源的智能家居docker快速部署实践笔记(CentOS7)

1. SGCC_Electricity 应用介绍 SGCC_Electricity 是一个用于将国家电网&#xff08;State Grid Corporation of China&#xff0c;简称 SGCC&#xff09;的电费和用电量数据接入 Home Assistant 的自定义集成组件。通过该应用&#xff0c;用户可以实时追踪家庭用电量情况&…...

02 基本介绍及Pod基础排错

01 yaml文件里的字段错误 # 多打了一个i导致的报错 [rootmaster01 yaml]# cat 01-pod.yaml apiVersion: v1 kind: Pod metadata:name: likexy spec:contaiiners:- name: aaaimage: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1 [rootmaster01 yaml]# kubectl …...

9 定时任务与周期性调度

一、定时任务核心机制 1.1 基础调度配置 # celery.py from celery import Celery from celery.schedules import crontabapp Celery(proj) app.conf.beat_schedule {daily-report: {task: report.generate,schedule: crontab(hour3, minute30), # 每天3:30执行args: (),op…...

macOS 效率工具对比分析:Raycast、Alfred、uTools、Spotlight

macOS 效率工具对比分析&#xff1a;Raycast、Alfred、uTools、Spotlight 对比分析四款常见 macOS 高效工具&#xff0c;涵盖功能、插件生态、开发者支持、适用人群等维度&#xff0c;帮助你选择最适合自己的效率助手。 &#x1f50d; 一、基本介绍 工具名简介SpotlightmacOS …...

接口测试速成指南:基础知识+工具使用全解析

你是否也有这样的经历&#xff1a;项目初期接口文档混乱&#xff0c;测试人员无从下手&#xff1b;开发说接口OK&#xff0c;测试却频繁遇坑&#xff1f;别怕&#xff0c;接口测试并没你想得那么难&#xff01; “接口测试怎么做&#xff1f;用什么工具&#xff1f;”面试官一…...

SpringSecurity基础入门

一个身份认证、授权、防御常见攻击的框架。 spring security 中文网&#xff1a;Spring Security中文网 自定义配置 基于内存的用户认证 实现步骤如下&#xff1a; 在配置类中创建security的配置类&#xff1a; Configuration //声明当前类为配置类 EnableWebSecurity //…...

MySQL的安装及相关操作

目录 一. 数据库产生的背景 二. 数据库操作系统的组成 2.1 数据库(Database) 2.2 数据库管理系统(DBMS, Database Management System) 2.3 应用程序(Application) 三. 数据库的分类 3.1 关系数据库 3.2 非关系数据库 四. MySQL安装 4.1yum安装 1. Ubuntu ​2. cent…...

【Code】Foundations 2017- Catalogue, List of Tables, List of Figures

Foundations 2017 目录 | Catalogue表格目录 | List of Tables图表目录 | List of Figures 目录 | Catalogue 英文原文中文翻译词汇学习&#xff08;音标和解释&#xff09;1. General1. 总则1.1 Scope1.1 范围1.2 Glossary1.2 术语表Glossary [ˈɡlɒsəri] 术语表&#xff…...

【TCGA-CRC】TCGA数据读取

写在前面 参考已有的帖子写的&#xff0c;但是临床数据和UCSC的不同。有知道的小伙伴欢迎指正。 rm(list ls()); gc() test1 data.table::fread("./00_Rawdata/GDCdata/TCGA-COAD/Transcriptome_Profiling/Gene_Expression_Quantification/00ae9ab8-6eaa-4085-af72-26…...

BYUCTF 2025

几周没会的比赛了&#xff0c;都是一题游。这周的BYU还不错&#xff0c;难度适中&#xff0c;只是时间有点短。周末时间不够。 Crypto Many Primes from Crypto.Util.number import bytes_to_long, getPrime import randomflag open("flag.txt").read().encode()…...

【Linux】初见,基础指令(续)

前言&#xff1a; 上文讲解了部分指令&#xff0c;本文我们来讲解剩下的指令【Linux】初见&#xff0c;基础指令-CSDN博客 cat指令 语法&#xff1a;cat 选项 文件 功能&#xff1a;打印文件中的内容 选项&#xff1a; -b 对非空行输出进行编号 -n 对输出的说有行进行编号…...

《MambaLLIE:基于隐式Retinex感知的低光照增强框架与全局-局部状态空间建模》学习笔记

Paper:2405.16105 Github:GitHub - wengjiangwei/MambaLLIE 目录 摘要 一、介绍 二、相关工作 2.1 低光图像增强 2.2 视觉空间状态模型 三、方法 3.1 预备知识 3.2 整体流程 3.3 全局优先-局部次之状态空间块 四、实验 4.1 基准数据集与实施细节 4.2 对比实验 4…...

计算机图形学Games101笔记--几何

第二部分&#xff1a;几何 几何介绍 光栅化解决如何渲染&#xff0c;几何研究模型如何存储在GPU的内存中。几何主要分为两种&#xff1a;隐式几何和显式几何。 **隐士几何&#xff1a;**用点之间的关系存储&#xff0c;如球的计算公式。更一般的可以用f(x,y,z)。我们可以令f…...

Web开发-Python应用Flask框架Jinja模版绑定路由参数传递页面解析SSTI注入

知识点&#xff1a; 1、安全开发-Python-Flask&Jinja2 2、安全开发-Python-路由传参&SSTI注入 演示案例-WEB开发-Python-Flask框架&Jinja2模版&路由传参&SSTI注入 0、Pycharm 配置Python解析 新建Flask项目 1、路由传参 app.route(/) app.route(/<id…...

聚焦开放智能,抢占技术高地 | 2025 高通边缘智能创新应用大赛第五场公开课来袭!

随着2025高通边缘智能创新应用大赛的推进&#xff0c;越来越多的参赛者关注如何借助高性能硬件突破技术瓶颈、打造差异化作品。 5月27日晚8点&#xff0c;大赛将开启初赛阶段的第五场专题公开课——由美格软件研究院院长李书杰领衔&#xff0c;深入解析高通平台的底层架构与参…...

NMOS和PMOS的区别

1 区分NMOS和PMOS&#xff1a;衬底箭头指向G级的是NMOS&#xff0c;衬底箭头背向G级的是PMOS 2 区分D和S级&#xff1a;针对NMOS&#xff0c;体二极管的正方向为S级&#xff1b;针对PMOS&#xff0c;体二极管正的方向为D级 3 区分电流方向&#xff1a;针对NMOS&#xff0c;电…...

Paillier加密方案的原理、实现与应用(vs)

一、实验目的 1、掌握NTL的基本配置和方法&#xff08;以下是以visualstudio为例&#xff09; 2、掌握Paillier加密方案的原理与实现 ①钥匙生成&#xff1a;首先&#xff0c;生成一把钥匙&#xff0c;包括钥匙和私钥匙。钥匙由两个大素数(p,q)的乘积n和一个整数g组成&#…...

Metal入门,使用Metal绘制3D图形

这次是使用Metal绘制一个立方体&#xff0c;并且添加旋转效果&#xff0c;绘制正方形的步骤很简单&#xff0c;我们绘制一个正方形就相当于绘制两个三角形&#xff0c;那么绘制一个正方体&#xff0c;我们很容易想到需要绘制他六个面&#xff0c;很显然&#xff0c;我们也需要把…...

Java 04 API

API 简介 一些已经写好的应用程序编程接口Object toString 默认返回的是当前对象在堆内存中的地址值信息&#xff1a;类的全类名十六进制哈希值返回该对象的返回值 class A{ } //返回的是地址哦 String sA.toString(); //细节&#xff1a;使用打印语句&#xff0c;打印对象…...

基于Gitee 的开发分支版本管理规范

一、版本管理规范概述 目的&#xff1a;规范代码分支管理和版本发布流程&#xff0c;提高团队协作效率&#xff0c;确保代码质量和版本可追溯性。适用范围&#xff1a;基于 Gitee 平台开发的所有项目。分支策略&#xff1a;采用 Git Flow 模型的变体&#xff0c;主要分支包括 …...

HOW - 结合 AI 进行 Tailwind 样式开发

文章目录 情况 1&#xff1a;使用 Tailwind CSS 与手写传统 CSS 的开发效率对比情况 2&#xff1a;AI Tailwind 自动生成 UI 的效率如何&#xff1f;总结 在 WHAT - Tailwind 样式方案&#xff08;不写任何自定义样式&#xff09; 中我们已经简单介绍过 Tailwind。今天主要认识…...

系统数据对接-从获取到处理的全流程

在后端架构的复杂生态中&#xff0c;子系统间或与外部系统的对接是常态&#xff0c;其核心要义在于实现数据的精准传输。本文聚焦于数据传输后的运算逻辑与异常处理机制&#xff0c;旨在为后端开发者提供深度见解。 一、数据获取机制&#xff1a;触发式与定时任务的权衡 &…...

Java 09Stream流与File类

Stream流与File类 Stream流 简化集合和数组的操作&#xff0c;startWith(“张”) 第一个为这个返回true String1.获取Stream对象 单列集合 双列集合 先获得键值对 在遍历数组 零散的数据 Stream<Integer> arrStream.of(1,2,34,3); stream.forEach(sss); 即可2.中间…...

《光与影:33号远征队》栩栩如生的角色动画是如何创建的?

《光与影&#xff1a;33号远征队》是一款由Sandfall Interactive公司开发的回合制RPG游戏&#xff0c;背景是一个黑暗的幻想世界。游戏因其独特的艺术风格和引人注目的叙事赢得了无数赞誉&#xff0c;成为今年大热游戏中的一匹黑马。 在该游戏制作中Sandfall依靠包括Xsens在内的…...

GESP2024年12月认证C++二级( 第三部分编程题(1)寻找数字)

参考程序&#xff08;枚举&#xff09;&#xff1a; #include <iostream> //#include <cmath> using namespace std;int main() {int t;cin >> t;while (t--) {long long a;cin >> a;bool found false;// 枚举 b for (long long b 1; b * b * b * b…...

《探索具身智能机器人视觉-运动映射模型的创新训练路径》

视觉 - 运动映射模型作为实现智能交互与精准行动的核心&#xff0c;吸引着全球科研人员与技术爱好者的目光。这一模型就像机器人的 “神经中枢”&#xff0c;连接着视觉感知与肢体运动&#xff0c;使机器人能够在复杂的现实环境中灵活应对各种任务。 传统的视觉 - 运动映射模型…...

Python打卡DAY31

今日的示例代码包含2个部分 notebook文件夹内的ipynb文件&#xff0c;介绍下今天的思路项目文件夹中其他部分&#xff1a;拆分后的信贷项目&#xff0c;学习下如何拆分的&#xff0c;未来你看到的很多大项目都是类似的拆分方法 知识点回顾 规范的文件命名规范的文件夹管理机器学…...

【SPIN】PROMELA远程引用与控制流验证(SPIN学习系列--5)

PROMELA语言提供了两种强大的机制用于验证并发系统&#xff1a;远程引用(remote references)和进程变量引用。这些机制使得在不引入额外状态变量的情况下&#xff0c;能够精确描述系统状态和属性。 远程引用(Remote References) 远程引用允许你直接引用进程中的控制位置(labe…...

GMSL:汽车里的音视频传输

参考链接&#xff1a; blog.csdn.net/weixin_50875614/article/details/119995651 blog.csdn.net/syjie19900426/article/details/145269782 SerDes 应用场景 WHAT GMSL是什么 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司推出的一种…...

Java并发进阶系列:深度讨论jdk1.8 ConcurrentHashMap并发环境下transfer方法桶位分配过程

在前面有多篇关于jdk1.8的ConcurrentHashMap研究是基于源代码给出的深度分析&#xff0c;要知道多线程环境下的ConcurrentHashMap内部运行机制是相对复杂的&#xff0c;好在IDEA提供的相关断点和Debug功能确实好用&#xff0c;使得多线程调试起来直观&#xff0c;通过这种方式能…...

【深度学习-Day 14】从零搭建你的第一个神经网络:多层感知器(MLP)详解

Langchain系列文章目录 01-玩转LangChain&#xff1a;从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块&#xff1a;四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain&#xff1a;从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...

fdisk和parted的区别

在Linux系统中&#xff0c;fdisk和parted是两种常用的分区工具。虽然它们都可以对硬盘进行分区&#xff0c;但在功能和适用范围上有显著的区别。 fdisk fdisk主要用于MBR&#xff08;主引导记录&#xff09;分区表的管理。MBR分区表有以下特点&#xff1a; 支持小于2TB的硬盘…...

springMVC拦截器,拦截器拦截策略设置

目录 1、MyInterceptor1 2、UserController 3、MvcConfig&#xff0c;拦截器4种拦截方法策略 做请求的校验&#xff0c;如果校验没有通过&#xff0c;直接返回&#xff0c;原来下面的处理&#xff0c;就不用处理了 将request进行拦截校验 将response进行拦截校验 preHandle…...

如何测试北斗卫星通讯终端的性能?

测试北斗卫星通讯终端的性能需从功能、性能、环境适应性、可靠性等多维度展开&#xff0c;以下是具体测试内容与方法&#xff1a; 一、基础功能测试 验证终端是否满足北斗系统的核心通讯功能。 &#xff08;1&#xff09;通信模式测试 短报文通信 测试终端发送 / 接收短报…...

基于MakeReal3D的虚拟预装系统:飞机装配效率与精度的双重突破

在航空制造领域&#xff0c;飞机部件的对接装配是飞机制造过程中的关键环节。传统的部件装配方式高度依赖操作人员的经验和反复调整&#xff0c;调姿过程耗时较长&#xff0c;且难以保证每次装配都能达到最优状态。随着虚拟现实技术的成熟&#xff0c;虚拟装配技术作为一种新兴…...

IP54是什么?

IP54是什么 定义 IP54是一种国际标准&#xff0c;用来指示设备的防护等级&#xff0c;该标准由国际电工委员会&#xff08;IEC&#xff09;制定&#xff0c;并在许多领域广泛使用13。IP是Ingress Protection的缩写&#xff0c;IP等级是针对电气设备外壳对异物侵入的防护等级。…...

Python异步编程详解

Python异步编程详解 引言 异步编程是Python中处理并发操作的重要方式&#xff0c;它允许程序在等待I/O操作时执行其他任务&#xff0c;从而提高程序的整体效率。本文将详细介绍Python异步编程的概念、实现方式以及实际应用场景。 1. 异步编程基础 1.1 什么是异步编程&#x…...

AUC与Accuracy的区别

下面分别解释下这两句话的含义及其原因&#xff0c;并说明 AUC 与 Accuracy&#xff08;准确率&#xff09;的区别&#xff1a; AUC 是阈值无关的指标   • 含义&#xff1a;在二分类问题中&#xff0c;模型通常会输出一个概率值或打分&#xff0c;需要设定一个阈值来将这些概…...

差分数组:原理与应用

一、什么是差分数组 差分数组是一种高效处理区间更新操作的数据结构技巧&#xff0c;特别适用于需要对数组的某个区间进行频繁增减操作的场景。差分数组的核心思想是通过存储相邻元素的差值而非元素本身&#xff0c;将区间操作转化为端点操作&#xff0c;从而将时间复杂度从O(…...

一些C++入门基础

关键字 图引自 C 关键词 - cppreference.com 命名空间 命名空间解决了C没办法解决的各类命名冲突问题 C的标准命名空间&#xff1a;std 命名空间中可以定义变量、函数、类型&#xff1a; namespace CS {//变量char cs408[] "DS,OS,JW,JZ";int cs 408;//函数vo…...

免费插件集-illustrator插件-Ai插件-路径尖角圆角化

文章目录 1.介绍2.安装3.通过窗口>扩展>知了插件4.功能解释5.总结 1.介绍 本文介绍一款免费插件&#xff0c;加强illustrator使用人员工作效率&#xff0c;实现图形编辑中路径尖角圆角化。首先从下载网址下载这款插件https://download.csdn.net/download/m0_67316550/87…...

数据分析_商务运营考核指标体系搭建

以抖音电商中的小学教辅书籍业务为例&#xff0c;搭建对接达人的商务运营团队能力考核指标体系&#xff0c;涵盖达人筛选、合作管理、效果追踪和长期价值维护等核心环节&#xff0c;结合教育产品特性和商务运营目标&#xff0c;设计分层量化指标&#xff1a; 一、考核目标 围绕…...

基于Java的校运会管理系统【附源码】

湄洲湾职业技术学院 毕业设计&#xff08;论文&#xff09; 课题名称&#xff1a; 系 别&#xff1a; 专 业&#xff1a; 年 级&#xff1a; 姓 名&#xff1a; 学 号&#xff1a; 指导教师&#xff1a; 摘 要 用传统的方式来管理信息&#xff0c;一是耗时较长&#xff0c;二是…...

保证数据库 + redis在读写分离场景中事务的一致性

在 Spring Boot 中实现数据库与 Redis 的一致性&#xff0c;特别是处理读写分离时&#xff0c;确保数据修改的事务一致性是一个常见的挑战。因为 Redis 是一个内存数据库&#xff0c;通常用于缓存&#xff0c;而关系型数据库是持久化存储&#xff0c;两者之间的数据同步和一致性…...