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

Pytorch实战(二)

文章目录

  • 前言
  • 一、LeNet5原理
    • 1.1LeNet5网络结构
    • 1.2LeNet网络参数
    • 1.3LeNet5网络总结
  • 二、AlexNext
    • 2.1AlexNet网络结构
    • 2.2AlexNet网络参数
    • 2.3Dropout操作
    • 2.4PCA图像增强
    • 2.5LRN正则化
    • 2.6AlexNet总结
  • 三、LeNet实战
    • 3.1LeNet5模型搭建
    • 3.2可视化数据
    • 3.3加载训练、验证数据集
    • 3.4模型训练
    • 3.5可视化训练结果
    • 3.6模型测试
  • 四、AlexNet实战


前言

  参考原视频:哔哩哔哩。

一、LeNet5原理

1.1LeNet5网络结构

在这里插入图片描述
  LeNet-5,其中, 5 5 5表示神经网络中带有参数的网络层数量为 5 5 5,如卷积层带有参数 ( w , b ) (w,b) (w,b),而池化层仅仅是一种操作,并不带有参数,而在LeNet-5中共含有两层卷积层、三层全连接层(有一层未标出)。
在这里插入图片描述

  • 卷积层和池化层:用于提取特征。
  • 全连接层:一般位于整个卷积神经网络的最后,负责将卷积输出的二维特征图转化成一维的一个向量(将特征空间映射到标记空间),由此实现了端到端的学习过程(即:输入一张图像或一段语音,输出一个向量或信息)。全连接层的每一个结点都与上一层的所有结点相连因而称之为全连接层。由于其全相连的特性,一般全连接层的参数也是最多的。

  事实上,不同的卷积核提取的特征并不相同,比如猫、狗、鸟都有眼睛,而如果只用局部特征的话不足以确定具体类别,此时就需要使用全连接层组合这些特征来最终确定是哪一个分类,即起到组合特征和分类器功能。

1.2LeNet网络参数

在这里插入图片描述

  • 输入层:输入大小为(28,28)、通道数为1的灰度图像。
  • 卷积层:卷积核尺寸为(6,5,5),即六个5x5大小的卷积核,填充为2,故输出特征图尺寸为(6,28,28)。
  • 池化层:使用平均池化,步幅为2,故输出特征图尺寸为(6,14,14)。
  • 卷积层:卷积核尺寸为(16,6,5,5),即16个6x5x5大小的卷积核,故输出特征图为(16,10,10).
  • 池化层:使用平均池化,步幅为2,输出特征图为(16,5,5)。
  • 全连接层:将所有特征图均展平为一维向量并进行拼接(通过调用nn.Flatten完成,输出为二维矩阵,每一行向量都是一张图片的展平形式),对应120个神经元。
  • 全连接层:将上一全连接层120个神经元映射为84个神经元。
  • 全连接层:将上一全连接层84个神经元映射为10个神经元。

  可知,卷积层往往会使通道数变大,而池化层往往会使特征图尺寸变小。

1.3LeNet5网络总结

在这里插入图片描述

二、AlexNext

在这里插入图片描述

2.1AlexNet网络结构

在这里插入图片描述

  AlexNet与LeNet设计理念相似,但有如下差异:

  • AlexNet比LeNet要深很多。
  • AlexNet由八层组成,包括五个卷积层,两个全连接隐藏层和一个全连接输出层。
  • AlexNet使用ReLUctant而非sigmoid作为激活函数。

2.2AlexNet网络参数

在这里插入图片描述
注意:

  • 图中的数据格式为(H,W,C,N),且最后全连接层的10是因为之后的案例输出为10个分类。
  • 网络参数过多时容易出现过拟合的情况(全连接层存在大量参数 w 、 b w、b wb),使用Dropout随机失活神经元。

2.3Dropout操作

  Dropout用于缓解卷积神经网络CNN过拟合而被提出的一种正则化方法,它确实能够有效缓解过拟合现象的发生,但是Dropout带来的缺点就是可能会减缓模型收敛的速度,因为每次迭代只有一部分参数更新,可能导致梯度下降变慢。
在这里插入图片描述
  其中,神经元的失活仅作用于一轮训练,在下一轮训练时又会随机选择神经元失活。每一轮都会有随机的神经元失活,以此降低缓解过拟合并提高模型训练速度。

2.4PCA图像增强

  图像增强是采用一系列技术去改善图像的视觉效果,或将图像转换成一种更适合于人或机器进行分析和处理的形式。例如采用一系列技术有选择地突出某些感兴趣的信息,同时抑制一些不需要的信息,提高图像的使用价值。
在这里插入图片描述

2.5LRN正则化

在这里插入图片描述

2.6AlexNet总结

在这里插入图片描述

三、LeNet实战

3.1LeNet5模型搭建

在这里插入图片描述

import torch
from torch import nn
from torchvision.datasets import FashionMNIST
from torchvision import transforms
import matplotlib.pyplot as plt
import numpy as np
import torch.utils.data as Datadevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")class LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__()self.model = nn.Sequential(nn.Conv2d(in_channels=1, out_channels=6, kernel_size=5, padding=2),nn.Sigmoid(),nn.AvgPool2d(kernel_size=2, stride=2),nn.Conv2d(in_channels=6, out_channels=16, kernel_size=5),nn.AvgPool2d(kernel_size=2, stride=2),nn.Flatten(),nn.Linear(in_features=16 * 5 * 5, out_features=120),nn.Linear(in_features=120, out_features=84),nn.Linear(in_features=84, out_features=10),)def forward(self, x):return self.model(x)myLeNet = LeNet().to(device)
print(summary(myLeNet,input_size=(1, 28, 28)))

在这里插入图片描述

注意,此处在卷积层后使用了sigmoid激活函数,事实上,卷积操作本质仍是一种线性操作,而若只有线性变换,那无论多少层神经元,都能简化层一层神经元,那神经网络只是简单多元线性回归而已,不能拟合更加复杂的函数。此时使用激活函数就可将神经网络非线性化,即提升神经网络的拟合能力,能拟合更复杂的函数。

3.2可视化数据

  加载模型,取出一个batch的数据及标签用于可视化:

train_data = FashionMNIST(root="./", train=True, transform=transforms.ToTensor(), download=True)	# FashionMNIST图像大小为28x28,无需调整
train_loader = Data.DataLoader(dataset=train_data, batch_size=64, shuffle=True)
# 数据可视化
def show_img(train_loader):for step, (x, y) in enumerate(train_loader):if step > 0:  # 恒成立breakbatch_x = x.squeeze().numpy()batch_y = y.numpy()class_label = train_data.classes# 可视化fig = plt.figure(figsize=(8, 8))for i in range(64):ax = fig.add_subplot(8, 8, i + 1, xticks=[], yticks=[])ax.imshow(batch_x[i], cmap=plt.cm.binary)ax.set_title(class_label[batch_y[i]])
show_img(train_loader)

在这里插入图片描述

3.3加载训练、验证数据集

  训练模型:

def train_val_process(train_data, batch_size=128):train_data, val_data = Data.random_split(train_data,lengths=[round(0.8 * len(train_data)), round(0.2 * len(train_data))])train_loader = Data.DataLoader(dataset=train_data,batch_size=batch_size,shuffle=True,num_workers=8)val_loader = Data.DataLoader(dataset=val_data,batch_size=batch_size,shuffle=True,num_workers=8)return train_loader, val_loadertrain_dataloader, val_dataloader = train_val_process(train_data)

3.4模型训练

import copy
import timeimport torch
from torch import nn
from torchvision.datasets import FashionMNIST
from torchvision import transforms
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import torch.utils.data as Data
def train(model, train_dataloader, val_dataloader, epochs=30, lr=0.001):device = torch.device("cuda" if torch.cuda.is_available() else "cpu")optimizer = torch.optim.Adam(model.parameters(), lr=lr)criterion = nn.CrossEntropyLoss()model = model.to(device)# 复制当前模型的参数best_model_params = copy.deepcopy(model.state_dict())# 最高准确率best_acc = 0.0# 训练集损失函数列表train_loss_list = []# 验证集损失函数列表val_loss_list = []# 训练集精度列表train_acc_list = []# 验证集精度列表val_acc_list = []# 记录当前时间since = time.time()for epoch in range(epochs):print("Epoch {}/{}".format(epoch + 1, epochs))print("-" * 10)# 当前轮次训练集的损失值train_loss = 0.0# 当前轮次训练集的精度train_acc = 0.0# 当前轮次验证集的损失值val_loss = 0.0# 当前轮次验证集的精度val_acc = 0.0# 训练集样本数量train_num = 0# 验证集样本数量val_num = 0# 按批次进行训练for step, (x, y) in enumerate(train_dataloader):  # 取出一批次的数据及标签x = x.to(device)y = y.to(device)# 设置模型为训练模式model.train()out = model(x)# 查找每一行中最大值对应的行标,即为对应标签pre_label = torch.argmax(out, dim=1)# 计算损失函数loss = criterion(out, y)optimizer.zero_grad()loss.backward()optimizer.step()# 累计损失函数,其中,loss.item()是一批次内每个样本的平均loss值(因为x是一批次样本),乘以x.size(0),即为该批次样本损失值的累加train_loss += loss.item() * x.size(0)# 累计精度(训练成功的样本数)train_acc += torch.sum(pre_label == y.data)# 当前用于训练的样本数量(对应dim=0)train_num += x.size(0)# 按批次进行验证for step, (x, y) in enumerate(val_dataloader):x = x.to(device)y = y.to(device)# 设置模型为验证模式model.eval()torch.no_grad()out = model(x)# 查找每一行中最大值对应的行标,即为对应标签pre_label = torch.argmax(out, dim=1)# 计算损失函数loss = criterion(out, y)# 累计损失函数val_loss += loss.item() * x.size(0)# 累计精度(验证成功的样本数)val_acc += torch.sum(pre_label == y.data)# 当前用于验证的样本数量val_num += x.size(0)# 计算该轮次训练集的损失值(train_loss是一批次样本损失值的累加,需要除以批次数量得到整个轮次的平均损失值)train_loss_list.append(train_loss / train_num)# 计算该轮次的精度(训练成功的总样本数/训练集样本数量)train_acc_list.append(train_acc.double().item() / train_num)# 计算该轮次验证集的损失值val_loss_list.append(val_loss / val_num)# 计算该轮次的精度(验证成功的总样本数/验证集样本数量)val_acc_list.append(val_acc.double().item() / val_num)# 打印训练、验证集损失值(保留四位小数)print("轮次{} 训练 Loss: {:.4f}, 训练 Acc: {:.4f}".format(epoch+1, train_loss_list[-1], train_acc_list[-1]))print("轮次{} 验证 Loss: {:.4f}, 验证 Acc: {:.4f}".format(epoch+1, val_loss_list[-1], val_acc_list[-1]))# 如果当前轮次验证集精度大于最高精度,则保存当前模型参数if val_acc_list[-1] > best_acc:# 保存当前最高准确度best_acc = val_acc_list[-1]# 保存当前模型参数best_model_params = copy.deepcopy(model.state_dict())print("保存当前模型参数,最高准确度: {:.4f}".format(best_acc))# 训练耗费时间time_use = time.time() - sinceprint("当前轮次耗时: {:.0f}m {:.0f}s".format(time_use // 60, time_use % 60))# 加载最高准确率下的模型参数,并保存模型torch.save(best_model_params, "LeNet5_best_model.pth")train_process = pd.DataFrame(data={'epoch': range(epochs),'train_loss_list': train_loss_list,'train_acc_list': train_acc_list,'val_loss_list': val_loss_list,'val_acc_list': val_acc_list})train_process.to_csv("LeNet5_train_process.csv", index=False)return train_process
train_process = train(myLeNet, train_dataloader, val_dataloader, epochs=30, lr=0.001)

查看LeNet5_train_process.csv
在这里插入图片描述

  注意,需要使用.double().item(),否则报错TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor

3.5可视化训练结果

# 训练结果可视化
def train_process_visualization(train_process):plt.figure(figsize=(12, 4))plt.subplot(1, 2, 1)plt.plot(train_process['epoch'], train_process['train_loss_list'], 'ro-', label='train_loss')plt.plot(train_process['epoch'], train_process['val_loss_list'], 'bs-', label='val_loss')plt.legend()plt.xlabel('epoch')plt.ylabel('loss')plt.subplot(1, 2, 2)plt.plot(train_process['epoch'], train_process['train_acc_list'], 'ro-', label='train_acc')plt.plot(train_process['epoch'], train_process['val_acc_list'], 'bs-', label='val_acc')plt.legend()plt.xlabel('epoch')plt.ylabel('acc')plt.legend()plt.show()
train_process_visualization(train_process)

在这里插入图片描述

  左图为loss与训练轮次的对应图,右图为acc与训练轮次的对应图。可见,随着训练轮次的增加,损失值不断降低、精确度不断提高。

3.6模型测试

def test(model, test_dataloader, device):model.eval()test_acc = 0.0test_num = 0# 推理过程中只前向传播,不用反向传播更新参数,清空梯度节省内存torch.no_grad()for step, (x, y) in enumerate(test_dataloader):x = x.to(device)y = y.to(device)out = model(x)pre_label = torch.argmax(out, dim=1)test_acc += torch.sum(pre_label == y.data)test_num += x.size(0)# 测试集精度test_acc = test_acc.double().item() / test_numprint("测试集精度: {:.4f}".format(test_acc))model = LeNet()
model = model.to(device)
# 加载模型参数
model.load_state_dict(torch.load("LeNet5_best_model.pth"))
test_data = FashionMNIST(root="./", train=False, transform=transforms.ToTensor(), download=True)
test_dataloader = Data.DataLoader(dataset=test_data, batch_size=64, shuffle=True)
test(model, test_dataloader, device)

在这里插入图片描述

四、AlexNet实战

相关文章:

Pytorch实战(二)

文章目录 前言一、LeNet5原理1.1LeNet5网络结构1.2LeNet网络参数1.3LeNet5网络总结 二、AlexNext2.1AlexNet网络结构2.2AlexNet网络参数2.3Dropout操作2.4PCA图像增强2.5LRN正则化2.6AlexNet总结 三、LeNet实战3.1LeNet5模型搭建3.2可视化数据3.3加载训练、验证数据集3.4模型训…...

wordpress 付费主题modown分享,可实现资源付费

该主题下载地址 下载地址 简介 Modown是基于Erphpdown 会员下载插件开发的付费下载资源、付费下载源码、收费附件下载、付费阅读查看隐藏内容、团购下载的WordPress主题,一款针对收费付费下载资源/付费查看内容/付费阅读/付费视频/VIP会员免费下载查看/虚拟资源售…...

【INTEL(ALTERA)】NIOS II调试器中的重新启动按钮不起作用

目录 说明 解决方法 说明 在 Nios II SBT 调试Eclipse时,如果单击 重新启动 图标, 执行被暂停, 以下错误消息: Dont know how to run. Try "help target." 解决方法 终止程序,再次下载,并启…...

Hive On Spark语法

内层对象定义之特殊数据类型 Array DROP TABLE IF EXISTS test_table_datatype_array; CREATE TABLE test_table_datatype_array (ids array<INT> ) LOCATION test/test_table_datatype_array;SELECTnames,names[1]array(names[2],names[3])names[5],names[-1],array_c…...

利用 fail2ban 保护 SSH 服务器

利用 fail2ban 保护 SSH 服务器 一、关于 fail2ban1. 基本功能与特性2. 工作原理 二、安装与配置1. Debian/Ubuntu系统&#xff1a;2. CentOS/RHEL系统&#xff1a; 三、保护 SSH四、启动 fail2ban 服务五、测试和验证六、查看封禁的 IP 地址七、一些配置八、注意事项 作者&…...

在TkinterGUI界面显示WIFI网络摄像头(ESP32s3)视频画面

本实验结合了之前写过的两篇文章Python调用摄像头&#xff0c;实时显示视频在Tkinter界面以及ESP32 S3搭载OV2640摄像头释放热点&#xff08;AP&#xff09;工作模式–Arduino程序&#xff0c;当然如果手头有其他可以获得网络摄像头的URL即用于访问摄像头视频流的网络地址&…...

Yolov8训练时遇到报错SyntaxError: ‘image_weights‘ is not a valid YOLO argument.等问题解决方案

报错说明 line 308, in check_dict_alignmentraise SyntaxError(string CLI_HELP_MSG) from e SyntaxError: image_weights is not a valid YOLO argument. v5loader is not a valid YOLO argument. fl_gamma is not a valid YOLO argument. 解决方法 将训练文件中model.tr…...

javaweb(四)——过滤器与监听器

文章目录 过滤器Filter基本概念滤波器的分类: 时域和频域表示滤波器类型1. 低通滤波器(Low-Pass Filter)2. 高通滤波器(High-Pass Filter)3. 带通滤波器(Band-Pass Filter)4. 带阻滤波器(Band-Stop Filter) 滤波器参数1. 通带频率(Passband Frequency)2. 截止频率(Cutoff Frequ…...

冗余电源的应用,哪些工作站支持冗余电源

冗余电源是一种通过多组电源模块进行备份的技术手段&#xff0c;采用热备插拔式设计&#xff0c;使备用电源在主要电源失效时自动启动&#xff0c;从而确保电源供应不间断。 冗余电源通常应用于对电力要求极高的关键设备和系统&#xff0c;如医疗设备、核电站、数据中心等。在…...

[信号与系统]IIR滤波器与FIR滤波器相位延迟定量的推导。

IIR滤波器与FIR滤波器最大的不同&#xff1a;相位延迟 IIR滤波器相位延迟分析 相位响应和延迟 这里讨论一下理想延迟系统的相位延迟。 对于一个给定的系统频率响应 H ( e j w ) H(e^{jw}) H(ejw)可以表示为 H ( e j w ) ∣ H ( e j w ) ∣ e Φ ( w ) H(e^{jw}) |H(e^{jw…...

Python海量数据处理脚本大集合:pyWhat

pyWhat&#xff1a;精简海联数据&#xff0c;直达数据弱点要害- 精选真开源&#xff0c;释放新价值。 概览 pyWhat是Github社区上一款比较实用的开源Python脚本工具。它能够快速提取信息中的 IP 地址、邮箱、信用卡、数字货币钱包地址、YouTube 视频等内容。当你遇到了一串莫名…...

postgresql搭建

搭建postgresql-11.3&#xff0c;和客户端工具 1&#xff0c;准备对应的包&#xff0c;右键直接下一步安装完即可&#xff0c; 将postgresql设置为本地服务&#xff0c;方便启动&#xff0c; 2&#xff0c;用对应客户端软件连接&#xff0c;新建一个数据库controlDB 新建用户…...

Web 品质标准

Web 品质标准 引言 随着互联网的快速发展,Web应用已经渗透到我们生活的方方面面。为了确保Web应用的质量,提高用户体验,Web品质标准应运而生。这些标准涵盖了多个方面,包括性能、安全性、可访问性、用户体验等。本文将详细介绍这些标准,并探讨它们在实际开发中的应用。 …...

深入理解PyTorch:原理与使用指南

文章目录 引言一、PyTorch的原理1. 动态计算图2. 自动微分3. 张量计算4. 高效的并行计算 二、PyTorch的使用1. 环境配置2. 加载数据3. 构建模型4. 训练模型5. 验证和测试模型 三、PyTorch的安装与配置四、PyTorch的使用示例总结 引言 在深度学习和机器学习的广阔领域中&#x…...

【MySQL事务】深刻理解事务隔离以及MVCC

文章目录 什么叫事务事务的提交方式常见的事务操作方式事务的开始与回滚总结 事务的隔离设置隔离级别解释脏读解释幻读解释不可重复读为什么可重复读不能解决幻读问题&#xff1f;总结 数据库并发的场景MVCC隐藏列字段undo日志Read view RR和RC的本质区别总结 什么叫事务 在My…...

关于Mac mini 10G网口的问题

问题: 购入一个10G网口的Mac mini M2&#xff0c;将其和自己的2.5G交换机连接&#xff0c;使用共享屏幕进行远程操作的过程中出现了频率极高的卡顿&#xff0c;几乎是几秒钟卡一下&#xff0c;使用ping进行测试发现卡的时候就ping不通了。测试使用Mac mini的无线网和雷电转2.5G…...

计算机网络-第4章 网络层

4.1网络层的几个重要概念 4.1.1网络层提供的两种服务 电信网面向连接通信方式&#xff0c;虚电路VC。 互联网设计思路&#xff1a;网络层要设计得尽量简单&#xff0c;向其上层只提供简单灵活的&#xff0c;尽最大努力交付的数据报服务。 网络层不提供服务质量的承诺&#…...

pytorch跑手写体实验

目录 1、环境条件 2、代码实现 3、总结 1、环境条件 pycharm编译器pytorch依赖matplotlib依赖numpy依赖等等 2、代码实现 import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import matpl…...

利用Java的`java.util.concurrent`包优化多线程性能

利用Java的java.util.concurrent包优化多线程性能 一、引言 在Java的多线程编程中&#xff0c;性能优化是一个永恒的话题。随着多核CPU的普及和计算任务的日益复杂&#xff0c;多线程编程已经成为提高应用程序性能的重要手段。然而&#xff0c;多线程编程也带来了一系列的问题…...

软件著作权申请:开发者的重要保障与助力

一、引言 随着信息技术的飞速发展&#xff0c;软件产业已成为推动经济增长的重要动力。然而&#xff0c;在软件开发过程中&#xff0c;保护创作者的权益、防止抄袭和侵权行为显得尤为重要。软件著作权作为保护软件开发者权益的重要法律工具&#xff0c;其申请和登记流程对于软…...

WLAN Hostapd配置参数详解 - CN

想必大家平台在调试Hostapd时&#xff0c;针对某些特殊的参数&#xff0c;很难一下子理清楚其用法&#xff0c;这里对hostapd使用的配置参数进行一个归纳&#xff0c;以供大家参考&#xff08; 其英文参考为&#xff1a;WLAN Hostapd配置参数详解 - EN-CSDN博客&#xff09;&am…...

Excel 宏录制与VBA编程 ——VBA编程技巧篇一 (Union方法、Resize方法、Cells方法、UseSelect方法、With用法)

Uniom方法 使用Union方法可以将多个非连续区域连接起来成为一个区域&#xff0c;从而可以实现对多个非连续区域一起进行操作。 Resize方法 使用Range对象的Resize属性调整指定区域的大小&#xff0c;并返回调整大小后的单元格区域。 Cells方法 Cells属性返回一个Range对象。 Us…...

基于路径长度的样条插补算法(自动驾驶和路径跟踪控制适用)

以前在做车辆跟踪控制的时候发现在针对有多个X和多个Y对应的路径插补时候&#xff0c;总是报错&#xff0c;因为MATLAB里面的interp1插补函数它要求x要唯一对应一个y&#xff0c;当路径以单独的x或者y来求插补时候的时候就报错。由于在使用Matlab的interp1函数进行插值时&#…...

net Framework OAuth2.0

grant_type client_credentials 客户端凭证password 密码模式 用于资源所有者密码凭据token 隐藏式 、 简化式 简化模式又称为隐式授权码模式&#xff0c;它是授权码模式的一个简化版本authorization_code 授权码 A. 第三方程序向资源拥有者(用户)发送授权请求&#xf…...

速盾:服务器cdn加速超时如何解决?

CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;是一种将网站内容分布到全球各地服务器上的技术&#xff0c;以提高网站的访问速度和用户体验。然而&#xff0c;在使用CDN时&#xff0c;有时候会遇到服务器CDN加速超时的问题&#xff0c;即CDN服…...

2024年6月总结及随笔之打卡网红点

1. 回头看 日更坚持了547天。 读《人工智能时代与人类未来》更新完成读《AI未来进行式》开更并更新完成读《AI新生&#xff1a;破解人机共存密码》开更并持续更新 2023年至2024年6月底累计码字1267912字&#xff0c;累计日均码字2317字。 2024年6月码字90659字&#xff0c;…...

《Windows API每日一练》7.4 状态报告上使用计时器

这一节我们使用计时器&#xff0c;每隔一秒获取当前鼠标坐标位置的像素值&#xff0c;并显示在窗口&#xff0c;这就相当于是一个简单的取色器了。 本节必须掌握的知识点&#xff1a; 第47练&#xff1a;取色器 7.4.1 第47练&#xff1a;取色器 /*----------------------------…...

python实现API调用缓存

python实现API调用缓存 1.代码2.输出3.保存的json数据 想把python某些函数的参数及返回值记录下来,如果之前已计算过,则直接返回缓存中的数据 1.代码 import jsondef get_variable_name(var):变量转变量名local_varsglobals()return [name for name, value in local_vars.ite…...

传输距离3000M|低延迟|48K采样音频传输模块-SA356大功率发射模块

无线音频应用中&#xff0c;远距离音频传输在许多领域具有广泛的应用需求&#xff0c;例如大型会议系统、公共广播、户外活动和音乐演出等。为了满足这些需求&#xff0c;音频传输模块需要具备一些关键特性&#xff0c;包括长距离传输能力、高音质、低延迟、稳定性以及抗干扰能…...

前端css性能优化

前端css性能优化 1. 减少样式表数量和压缩文件大小&#xff1a; 通过合并多个样式表、删除未使用的样式、压缩样式表等方式来减少样式表数量和大小&#xff0c;从而减少网络请求和提高加载速度。 通常来说&#xff0c;样式文件会被浏览器缓存&#xff0c;进入到其他页面样式文件…...

如何在Windows上使用Docker搭建PHP开发环境

前言 在本地搭建开发环境我好像没几年就要折腾一次&#xff0c;因为本地开发电脑使用的是windows&#xff0c;早些年的时候&#xff0c;用过很多类似WAMP之类的东西&#xff0c;但最终都有或多或少不满意的地方&#xff0c;前两年的时候&#xff0c;还折腾过WSL&#xff0c;但…...

java 单例模式

Java中实现单例模式的常见方式有两种&#xff1a;懒汉式和饿汉式。以下是这两种方式的简单示例&#xff1a; 饿汉式 饿汉式单例模式在类加载时就完成了实例的初始化&#xff0c;以空间换时间&#xff0c;确保了实例的唯一性。 public class Singleton {// 在自己内部定义自己…...

爬虫 属性 方法

在Python中&#xff0c;爬虫常用于从网页上抓取数据。BeautifulSoup是一个流行的库&#xff0c;用于从HTML或XML文件中提取数据。它创建了一个解析树&#xff0c;方便你从文档中查找、修改或导航数据。 安装BeautifulSoup 首先&#xff0c;你需要安装BeautifulSoup和lxml&…...

HEX文件

什么是hex文件 以*.hex为后缀的文件我们称之为HEX文件。hex是intel规定的标准&#xff0c;hex的全称是Intel HEX&#xff0c;此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据。是由一行行符合Intel HEX文件格式的文本所构成的ASCII文本文件。HEX的英语原始意思是16进制…...

人机融合的智能操作系统

操作系统&#xff08;Operating System&#xff0c;简称 OS&#xff09;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。它的职责常包括对硬件的直接监管、对各种计算资源&#xff08;如内存、处理器时间等&#xff09;的管理、以及提供诸如…...

数据结构之二叉树概念

数据结构之二叉树 二叉树简介分类普通二叉树平衡二叉树满二叉树二叉搜索树&#xff08;二叉排序树、二叉查找树&#xff09;&#xff0c;平衡二叉树红黑树 B树类型B树&#xff08;B-树、B_树&#xff09;B树B*树 二叉树 简介 二叉树(Binary Tree) &#xff1a;是一种非常重要…...

Linux源码阅读笔记08-进程调度API系统调用案例分析

kthread_create_on_node kthread_create_on_node函数功能&#xff1a;指定存储节点创建新内核线程。源码如下&#xff1a; 操作实战 #include <linux/module.h> #include <linux/pid.h> #include <linux/sched.h> #include <linux/kthread.h> #inclu…...

短视频抓取:成都柏煜文化传媒有限公司

短视频抓取&#xff1a;技术挑战、法律边界与未来趋势 随着移动互联网的迅猛发展&#xff0c;短视频平台如雨后春笋般涌现&#xff0c;成为现代人生活娱乐的重要组成部分。然而&#xff0c;在海量短视频内容中&#xff0c;如何高效、准确地抓取目标视频&#xff0c;成为了一个…...

proto的前后端使用

首先定义一个input.proto文件 内容如下 syntax "proto3";message InputData {int32 UserId 1; // 将 number 改为 int32 或 int64string UserInput 2;string DrunkState 3; }message ResponseData {string AIResponse 1;string prompt 2;string emoti…...

华为解决固态硬盘致命弱点:延长30~50%的SSD寿命

如今的SSD容量越做越大&#xff0c;企业级SSD容量已达30TB、60TB的、甚至120TB。但SSD寿命一直是“致命伤”&#xff0c;越大容量的盘&#xff0c;出现故障后&#xff0c;丢失的数据就越多。 近日&#xff0c; 华为数据存储发文&#xff0c;揭开华为全闪分布式存储让SSD大盘更“…...

登录验证码高扩展性设计方案

登录验证码高扩展性建设方案 本文分享了一种登录验证码高扩展性的建设方案&#xff0c;通过工厂模式策略模式&#xff0c;增强了验证码服务中验证码生成器、验证码存储器、验证码图片生成器的扩展性&#xff0c;实现了服务组件的多样化&#xff0c;降低了维护成本 登录验证码高…...

Spring MVC数据绑定和响应——数据回写(一)普通字符串的回写

接下来通过HttpServletResponse输出数据的案例&#xff0c;演示普通字符串的回写&#xff0c;案例具体实现步骤如下。 1、创建一个数据回写类DataController&#xff0c;在DataController类中定义showDataByResponse()方法&#xff0c;用于测试在Spring MVC中普通字符串的回写…...

怎样才能更好地保护个人账号的安全

怎样才能更好地保护个人账号的安全 保护个人账号安全是网络安全的重要组成部分&#xff0c;以下是一些有效的措施来增强账号的安全性&#xff1a; 1. 使用强密码 复杂性&#xff1a;创建包含大小写字母、数字和特殊字符的密码。长度&#xff1a;密码至少应有12个字符长。唯一…...

react native优质开源项目

React Native 是一个非常流行的用于构建跨平台移动应用程序的框架&#xff0c;开源社区贡献了许多优质的项目和库。以下是一些备受认可的 React Native 开源项目&#xff0c;适合用来学习和参考&#xff1a; ### 1. **React Native Elements** [React Native Elements](https:…...

速盾:海外cdn有哪些优缺点呢?

海外 CDN&#xff08;内容分发网络&#xff09;是一种通过在全球多个节点上分布内容来加速网站访问速度的服务。它通过将网站的静态内容缓存到全球各地的服务器上&#xff0c;使用户可以从最近的服务器获取内容&#xff0c;从而提高网站的响应速度和用户体验。然而&#xff0c;…...

Unity Shader 软粒子

Unity Shader 软粒子 前言项目Shader连连看项目渲染管线设置 鸣谢 前言 当场景有点单调的时候&#xff0c;就需要一些粒子点缀&#xff0c;此时软粒子就可以发挥作用了。 使用软粒子与未使用软粒子对比图 项目 Shader连连看 这里插播一点&#xff0c;可以用Vertex Color与…...

nextTick的应用和原理理解

一.代码的理解 <template><div id"app"><div></div><button click"fn" ref"box"> {{ name }}</button></div> </template><script> export default {data: function () {return {n…...

.Net Core 微服务之Consul

目录 一、微服务架构 vs 单体架构 1. 单体架构介绍 2. 微服务架构介绍 3. 微服务架构 vs 单体架构的区别 4. 适用场景和选择 4.1 微服务架构的适用场景和选择 复杂度和规模需求高的应用程序: 技术栈的灵活性需求: 快速迭代和持续交付: 高可用性和容错性的要求: 4…...

速盾:cdn流量调度

CDN&#xff08;Content Delivery Network&#xff09;是指内容分发网络&#xff0c;它是一种通过部署在不同地理位置的服务器来传递互联网内容的技术。CDN的主要目标是通过将内容放置在离用户最近的服务器上&#xff0c;来提高用户访问网站的响应速度和性能。 CDN的流量调度是…...

Windows批处理入门:快速掌握批处理脚本的基本技巧

一、前言 在Windows操作系统中&#xff0c;批处理文件&#xff08;Batch File&#xff09;是一种非常实用的工具&#xff0c;它允许用户通过简单的命令行脚本来自动化各种任务。无论是系统管理员、开发人员&#xff0c;还是普通用户&#xff0c;掌握批处理文件的基本知识都能极…...

MySQL基础篇(二)字符集以及校验规则

在MySQL基础篇&#xff08;一&#xff09;中&#xff0c;我们知道了如何创建数据库&#xff0c;这篇文章带大家了解创建的一些细节。 红色框&#xff1a;可省略&#xff0c;作用如果存在相同的数据库名称&#xff0c;就不会再创建&#xff0c;反之&#xff0c;创建。 蓝色框&…...

“深入解析:YUM仓库、RPM包与源码编译——Linux软件安装方式全面对比“

目录 YUM 仓库安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; RPM 包安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; 源码编译安装 概念&#xff1a; 优点&#xff1a; 缺点&#xff1a; 三者区别 YUM 仓库安装 概念&#xff1a; YUM&…...

电脑硬盘分区的基本步骤(2个实用的硬盘分区方法)

在现代计算机中&#xff0c;硬盘分区是非常重要的一步。无论是新硬盘的初始化&#xff0c;还是重新组织现有硬盘&#xff0c;分区都是必不可少的操作。本文将详细介绍电脑硬盘分区的基本步骤&#xff0c;帮助您更好地管理和利用硬盘空间。 文章开始&#xff0c;我们先简单说一…...

浏览器打不开网页、但是电脑有网络,解决办法(win11)

2023.07.06测试有效 华为电脑拿去免费拆机保养后&#xff0c;发现浏览器连接不上网了&#xff0c;但是&#xff01;微信又能登录得上&#xff0c;也就是说电脑还是有网的。 原文链接 一、问题截图 二、解决方法 1.右键打开“网络和Internet设置” 2.打开“代理” 3.将该选项设…...

PyCharm 安装

PyCharm是一种流行的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;由JetBrains公司开发。它提供了丰富的功能&#xff0c;如智能代码补全、实时错误检查、项目导航、调试工具以及版本控制等&#xff0c;极大地提高了Python开发人员的工作效率。以下是PyCharm安装…...

前端面试题7(单点登录)

如何实现单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种允许用户在多个应用系统中只需登录一次&#xff0c;就可以访问所有相互信任的应用系统的认证技术。实现前端单点登录主要依赖于后端的支持和一些特定的协议&#xff0c;如OAuth、Ope…...

做场外个股期权怎么询价

做场外个股期权怎么询价&#xff1f;没有具体的哪家做市商是询价是最低的&#xff0c;个人投资者需要通过机构通道方询价进行对比&#xff0c;各券商的报价由询价机构方提供给到投资者&#xff0c;可以参考不同券商的报价进行比对&#xff0c;再决定是否进行投资。本文来自&…...

C++STL容器系列(三)list的详细用法和底层实现

目录 一&#xff1a;介绍二&#xff1a;list的创建和方法创建list方法 三&#xff1a;list的具体用法3.1 push_back、pop_back、push_front、pop_front3.2 insert() 和 erase()3.3 splice 函数 四&#xff1a;list容器底层实现4.1 list 容器节点结构5.2 list容器迭代器的底层实…...

222.完全二叉树的节点个数

给出一个完全二叉树&#xff0c;求出该树的节点个数。 示例 1&#xff1a; 输入&#xff1a;root [1,2,3,4,5,6]输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;root []输出&#xff1a;0 示例 3&#xff1a; 输入&#xff1a;root [1]输出&#xff1a;1 提示…...

电压、电流、功率

//**********************************************************************************// 380V电压 额定功率1.732*额定电压*额定电流*功率因素 220V电压 额定功率额定电压*额定电流*功率因素 单相&#xff0c;功率1KW&#xff0c;电流约4.5A。 三相&#xff0c;功率1KW…...

04_前端三大件JS

文章目录 JavaScript1.JS的组成部分2.JS引入2.1 直接在head中通过一对script标签定义脚本代码2.2创建JS函数池文件&#xff0c;所有html文件共享调用 3.JS的数据类型和运算符4.分支结构5.循环结构6.JS函数的声明7.JS中自定义对象8.JS_JSON在客户端使用8.1JSON串格式8.2JSON在前…...

mysql内存和磁盘的关系

mysql内存和磁盘的关系 1.MySQL的内存和磁盘之间的关系是密切的。MySQL的数据存储在磁盘上&#xff0c;但为了高效地执行查询操作&#xff0c;它也会将数据页&#xff08;每个页通常为16KB&#xff09;读入内存。MySQL的缓冲池&#xff08;buffer pool&#xff09;是在内存中的…...