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

深度学习代码学习笔记2

1、torch.max

correct = 0
total = 0
for xb,yb in valid_dl:outputs = model(xb)_,predicted = torch.max(outputs.data,1)total += yb.size(0)  #yb.size(0) 返回的是张量 yb 在第 0 维的大小,也就是 yb 中的样本数量。correct += (predicted == yb).sum().item()  
print('正确率:%d %%'%(100 * correct /total))
def accuracy(predictions, labels):# predictions.data 是模型的预测结果# torch.max(predictions.data, 1) 返回每一行的最大值和对应的索引。 # [1] 表示我们只关心索引,即选择模型预测类别的索引。pred = torch.max(predictions.data, 1)[1]   # 取出每一行的最大值索引,得到预测类别# labels.data.view_as(pred) 将 labels 调整为与 pred 形状一致,方便比较# eq() 函数逐元素比较 pred 和 labels 的值,如果相等返回 True,不相等返回 Falserights = pred.eq(labels.data.view_as(pred)).sum()  # 统计预测正确的样本数'''pred.eq(labels.data.view_as(pred)):pred 是模型预测的类别(索引形式)。
labels.data.view_as(pred) 将标签(真实类别)转换为与 pred 相同的形状(通常是一个一维向量),这样就可以逐元素比较。
eq() 是 torch 中的一个方法,用于比较两个张量的元素,返回一个布尔张量,元素相等则返回 True,否则返回 False。'''# 返回正确的数量以及总样本数return rights, len(labels)

torch.max(input, dim)

  • 输入:一个张量 input,以及一个维度 dim
  • 输出:返回一个元组 (values, indices):
    • values:沿着 dim 维度的最大值。
    • indices:最大值对应的索引。

torch.max(outputs.data, 1)与torch.max(outputs.data, 0)

如果 outputs 的形状是 [784, 10],这意味着你有 784 个样本,每个样本对应 10 个类的输出(比如 logits 或预测值)。在这种情况下,torch.max(outputs.data, 1)torch.max(outputs.data, 0) 的结果含义会有所不同,具体如下:

1. torch.max(outputs.data, 1)

  • 维度dim=1

  • 操作:沿着第二维(每个样本的类别)查找最大值。

  • 输出

    • 返回一个张量,其中包含每个样本的最大值(即 logits 的最高值),以及一个索引张量,表示该最大值对应的类别。
    • 输出形状为 [784][784](索引),表示每个样本的预测类别。
  • 示例

    import torch# 假设 outputs 是 [784, 10] 的张量
    outputs = torch.randn(784, 10)  # 随机生成示例输出max_values, predicted = torch.max(outputs.data, 1)  # 查找每个样本的最大值及其对应的索引。outputs.data[i][0]---outputs.data[i][9]
    print(predicted)  # 输出:每个样本的预测类别(索引)
    

2. torch.max(outputs.data, 0)

  • 维度dim=0

  • 操作:沿着第一维(所有样本)查找每个类别的最大值。

  • 输出

    • 返回一个张量,包含每个类别在所有样本中的最大值,以及对应的索引。
    • 输出形状为 [10](最大值)和 [784](索引),表示每个类别在 784 个样本中的最大值。
  • 示例

    import torch# 假设 outputs 是 [784, 10] 的张量
    outputs = torch.randn(784, 10)  # 随机生成示例输出max_values, indices = torch.max(outputs.data, 0)  # 查找每个类别的最大值及其对应的样本索引
    print(max_values)  # 输出:每个类别的最大值
    print(indices)     # 输出:每个最大值对应的样本索引
    

总结

操作维度输出形状作用
torch.max(outputs, 1)1[784] (最大值), [784] (索引)返回每个样本的最大值及对应的类索引(预测类别)
torch.max(outputs, 0)0[10] (最大值), [784] (索引)返回每个类别在所有样本中的最大值及对应的样本索引

因此,当 outputs 的形状是 [784, 10] 时,选择 torch.max(outputs.data, 1) 可以用来获取每个样本的预测类别,而 torch.max(outputs.data, 0) 可以用来分析每个类别在样本中的最大预测值。

2、Dropout

关于 Dropout(0.5) 的理解,我们来详细说明一下它的工作原理。

Dropout 的工作原理

  1. 定义

    • Dropout(0.5) 表示在每次前向传播中,每个神经元有 50% 的概率被“丢弃”。这意味着有 50% 的神经元在当前迭代中不会参与计算,输出值被设置为 0。
  2. 示例

    • 假设你的输入张量形状为 [64, 784],这里 64 是批量大小,784 是每个样本的特征数(例如,一个 28x28 的图像展平后得到的特征向量)。
    • 在前向传播中,Dropout 会随机选择 50% 的神经元进行丢弃。重要的是,这并不意味着只会有 32 个神经元参与计算,而是对于每个样本(每一行),可能有一部分神经元会被丢弃。

具体过程

  • 对于输入的每个样本(每一行),Dropout 会独立地选择哪些神经元被丢弃。例如,假设我们有以下输入:

    Input (x): [64, 784] (64 个样本,每个样本 784 个特征)
    
  • ==在每次前向传播时,Dropout 会随机将某些特征(神经元)设置为 0。==比如说,某次前向传播可能会得到如下的输出:

    Output (x'): [64, 784] (仍然是 64 个样本,但某些特征被置为 0)
    
    Sample 1: [0.5, 0, 0.2, 0, 0.8, ...]  # 一些神经元被丢弃
    Sample 2: [0, 0.3, 0, 0.9, 0.7, ...]  # 不同的丢弃情况
    

关键点

  • 样本数量不变:输入张量的形状 [64, 784] 在经过 Dropout 后仍然是 [64, 784],而不是 [32, 784]。每个样本都有 784 个特征(神经元)。
  • 随机性:每次前向传播时丢弃的神经元都是随机的,不同的迭代可能会丢弃不同的神经元。
  • 训练与推理:在训练时使用 Dropout,而在推理(测试)时,所有神经元都被使用,通常输出会根据 Dropout 的比例进行缩放(乘以保留的概率)。

总结

  • Dropout 会随机丢弃一些神经元的输出,但并不改变输入的样本数量和形状。输入 [64, 784] 经过 Dropout 处理后,仍然是 [64, 784],只是某些神经元的输出被置为 0。

2、常用模块

这些包在 Python 中有各自的作用,通常用于处理图像、文件操作和时间管理等。下面我逐一解释这些包的功能及其典型用途。

1. imageio

  • 作用

    • imageio 是一个用于读取和写入图像、视频、动图等多媒体文件的库。
    • 它支持多种图像格式,如 PNG、JPEG、GIF、TIFF,以及视频格式,如 MP4、AVI 等。
    • 常用于读取图片或视频帧、保存图片、生成 GIF 等。
  • 常用方法

    • imageio.imread():读取图像文件。
    • imageio.imwrite():保存图像文件。
    • imageio.mimwrite():保存多张图像作为 GIF 动图。
    • imageio.get_reader()imageio.get_writer():用于读取或写入视频。
  • 示例

    import imageio
    img = imageio.imread('image.png')  # 读取图片
    imageio.imwrite('new_image.png', img)  # 保存图片
    

2. time

  • 作用

    • time 是 Python 的标准库,用于处理时间相关的任务。
    • 它可以获取当前时间、暂停程序执行、格式化时间、计算时间差等。
  • 常用方法

    • time.time():返回当前时间的时间戳(从 1970 年 1 月 1 日以来的秒数)
    • time.sleep(seconds):暂停程序执行指定的秒数。
    • time.localtime():将时间戳转换为结构化时间。
    • time.strftime():格式化时间为字符串。
  • 示例

    import time
    print(time.time())  # 输出当前时间的时间戳
    time.sleep(2)  # 暂停程序执行 2 秒
    

3. copy

  • 作用

    • copy 是 Python 的标准库,提供了对象的浅复制和深复制功能。
    • 浅复制 只复制对象的引用,某些情况下修改副本会影响原对象。
    • 深复制 递归复制对象中的所有内容,副本与原对象完全独立。
  • 常用方法

    • copy.copy():执行浅复制。
    • copy.deepcopy():执行深复制。
  • 示例

    import copy
    original = [1, 2, [3, 4]]
    shallow_copy = copy.copy(original)  # 浅复制
    deep_copy = copy.deepcopy(original)  # 深复制
    

4. PIL.Image(Pillow)

  • 作用

    • PIL(Python Imaging Library)是一个强大的图像处理库,后来被分支为 Pillow,用于处理图像文件的读取、操作和保存。
    • 它支持多种图像格式(如 JPEG、PNG、BMP 等),并提供丰富的图像操作功能,如裁剪、缩放、旋转、滤镜处理等。
  • 常用方法

    • Image.open():打开图像文件。
    • Image.save():保存图像文件。
    • Image.resize():调整图像大小。
    • Image.rotate():旋转图像。
    • Image.convert():转换图像模式(如 RGB、灰度等)。
  • 示例

    from PIL import Image
    img = Image.open('image.jpg')  # 打开图片
    img = img.resize((100, 100))  # 调整图片大小
    img.save('resized_image.jpg')  # 保存图片
    

总结

  • imageio:用于读取和保存多媒体文件(图像、视频、GIF等)。
  • time:用于时间处理,如暂停、获取当前时间等。
  • copy:用于对象的浅复制和深复制。
  • PIL.Image:图像处理库,支持多种图像操作(读取、保存、裁剪、旋转等)。

这些库在图像处理、时间控制和数据复制中被广泛使用,通常会用于一些涉及图片、视频的应用中,如机器学习的预处理、生成 GIF、视频分析等。

3、datasets.ImageFolder

当你使用 torchvision.datasets.ImageFolder 给定一个 root 目录时,root 是一个包含子文件夹的主目录。ImageFolder 并不会直接加载 root 目录下的所有图片,而是会查找 root 目录下每个子文件夹,并将这些子文件夹中的图片归类到对应的类别。

具体行为如下:

  1. 子文件夹代表类别ImageFolder 会将 root 目录下的每一个子文件夹的名称作为类别标签。每个子文件夹内部的所有图片都被视为属于该类别。

    例如,假设你的 root 目录结构如下:

    root/├── cat/│   ├── image1.jpg│   ├── image2.jpg└── dog/├── image1.jpg├── image2.jpg
    
    • 在这种情况下,cat 文件夹中的图片会被分配标签 0dog 文件夹中的图片会被分配标签 1
    • 图片路径 root/cat/image1.jpg 会被标记为类别 0,而 root/dog/image1.jpg 会被标记为类别 1
  2. 图片的加载顺序ImageFolder 会递归地遍历每个类别文件夹下的所有图片,并按文件路径的顺序加载它们。

  3. 文件类型ImageFolder 只会加载文件扩展名符合常见图片格式的文件(如 .jpg, .png, .bmp 等)。

因此,ImageFolder 只加载 root 目录中的子文件夹内的图片,而不会直接加载 root 目录中的图片(如果 root 目录本身包含图片,这些图片将会被忽略)。

举个例子

假设 root 目录为 data/train/,结构如下:

data/train/├── class1/│   ├── img1.jpg│   ├── img2.jpg├── class2/│   ├── img3.jpg│   ├── img4.jpg

使用 ImageFolder 加载该数据集:

from torchvision import datasets, transforms# 定义图像预处理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor()
])# 加载数据集
dataset = datasets.ImageFolder(root='data/train/', transform=transform)# 输出类别和样本数
print(f'类别:{dataset.class_to_idx}')  # 类别标签映射 {'class1': 0, 'class2': 1}
print(f'数据集大小:{len(dataset)}')  # 数据集大小,应该是4张图片

总结:

  • ImageFolder 会遍历 root 目录下的每个子文件夹,并将子文件夹中的图片分配到对应的类别。
  • 如果 root 目录下有图片但没有子文件夹,这些图片将会被忽略。

4、数据集

batch_size = 128image_datasets = {x: datasets.ImageFolder(os.path.join(data_dir, x), data_transforms[x]) for x in ['train', 'valid']}  #同时读入了数据和标签
dataloaders = {x: torch.utils.data.DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True) for x in ['train', 'valid']}
dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'valid']}
class_names = image_datasets['train'].classes #标签名

这两行代码:

image, label = image_datasets['train'][0]  #train的第一张图片
print(image_datasets['train'])
print(image.shape,label)  
print(image[0])    #这是图像的第一个通道(通常是 RGB 图像的红色通道)
Dataset ImageFolderNumber of datapoints: 6552Root location: ./data/flower_data/trainStandardTransform
Transform: Compose(Resize(size=[96, 96], interpolation=bilinear, max_size=None, antialias=True)RandomRotation(degrees=[-45.0, 45.0], interpolation=nearest, expand=False, fill=0)CenterCrop(size=(64, 64))RandomHorizontalFlip(p=0.5)RandomVerticalFlip(p=0.5)ColorJitter(brightness=(0.8, 1.2), contrast=(0.9, 1.1), saturation=(0.9, 1.1), hue=(-0.1, 0.1))RandomGrayscale(p=0.025)ToTensor()Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]))
torch.Size([3, 64, 64]) 0
tensor([[-0.1828, -0.2342, -0.2856,  ..., -1.6213, -1.6213, -1.7069],[-0.1999, -0.2856, -0.3198,  ..., -1.5357, -1.6213, -1.7069],[-0.2856, -0.3541, -0.4226,  ..., -1.5014, -1.6213, -1.6898],...,[-1.2959, -1.3130, -1.3815,  ..., -1.1075, -1.1418, -0.8849],[-1.2959, -1.3302, -1.4158,  ..., -1.0219, -1.0904, -0.7308],[-1.2959, -1.3473, -1.4500,  ..., -0.9877, -1.0733, -0.6623]])
#print(image_datasets['train'][0].shape)
print(image_datasets['train'][0][0][0].shape) #训练集第一个文件夹的第一张图片的B通道有负数,因为被标准化了 #训练集第一个文件夹的第一张图片的B通道有负数,因为被标准化了
print(image_datasets['train'][0][0][0])
torch.Size([64, 64])
tensor([[-1.7925, -1.8097, -1.7925,  ..., -0.9877, -1.0733, -1.1075],[-1.7754, -1.7754, -1.8268,  ..., -0.9705, -1.0733, -1.1932],[-1.7412, -1.7754, -1.8097,  ..., -1.0390, -1.1589, -1.2274],...,[ 0.3309,  0.4166,  0.4679,  ..., -1.8953, -1.9124, -1.9124],[ 0.3823,  0.4679,  0.4337,  ..., -1.8782, -1.8953, -1.8953],[ 0.5364,  0.4679,  0.5022,  ..., -1.8268, -1.8782, -1.8953]]
  • image_datasets['train'][0] 返回一个元组 (image, label),其中:

    • image 是经过数据变换后的图像张量。
    • label 是对应的标签(类别)。

    这里,image 是一个三维张量 (C, H, W),即通道、高度、宽度,label 是一个整数,表示图像的类别。

image, label = image_datasets['train'][0]

这一行将元组解包为 imagelabel,分别表示图片张量和标签。然后你打印 image[0],即图像张量的第一个通道,以及标签。

在 Python 中,解包(unpacking) 指的是将一个包含多个元素的容器(如元组、列表等)中的各个元素分别赋值给多个变量。解包可以让你快速地从容器中提取元素,方便后续操作。

元组解包

假设你有一个包含两个元素的元组:

tup = (10, 20)

现在,你可以使用解包将 tup 中的两个元素分别赋值给变量 ab

a, b = tup
print(a)  # 输出 10
print(b)  # 输出 20

在这里,a 被赋值为元组中的第一个元素(10),b 被赋值为第二个元素(20)。这种方式被称为解包。

代码中的解包

在你的代码中:

image, label = image_datasets['train'][0]
  • image_datasets['train'][0] 返回的其实是一个包含两个元素的元组 (image, label)
    • image 是图像张量。
    • label 是图像对应的标签(类别)。

通过解包,imagelabel 分别被赋值为元组中的第一个和第二个元素。

相当于以下代码:

# 没有解包的情况下:
tup = image_datasets['train'][0]  # tup 是一个元组 (image, label)
image = tup[0]  # 获取第一个元素(图像)
label = tup[1]  # 获取第二个元素(标签)

但是,通过解包,你可以直接用 image, label = image_datasets['train'][0] 一步完成,而不需要额外的 tup[0]tup[1] 访问操作,简化了代码。

总结

解包 就是从元组(或其他容器)中将每个元素分别赋值给多个变量。例如,你可以从 image_datasets['train'][0] 返回的元组中提取出图像张量 image 和对应的标签 label,简化后续代码的处理。

5、优化器&加载保存模型

1. optimizer.param_groups

optimizer.param_groups 是 PyTorch 中优化器的一个属性,表示优化器管理的参数组。每个参数组是一个字典,包含与优化相关的信息,比如模型的参数(权重)、学习率等。

常见内容:
  • params: 这是模型中要更新的参数列表(张量),通常是模型的权重和偏置。
  • lr: 学习率,用于控制梯度下降时的步长。
  • momentum: 动量参数,适用于带动量的优化算法(如 SGD)。
  • weight_decay: 权重衰减(L2正则化)系数。
  • dampening: 动量的抑制因子。
  • nesterov: 是否使用 Nesterov 动量。
示例:
# 打印所有参数组信息
for param_group in optimizer.param_groups:print(param_group)
示例输出(一个带有动量的 SGD 优化器):
{'params': [tensor1, tensor2, ...], 'lr': 0.001, 'momentum': 0.9, 'weight_decay': 0.01, 'nesterov': True}
  • 这里 params 存储模型中的参数(如权重和偏置),其他则是用于调整这些参数的超参数。

2. model.state_dict()

model.state_dict() 是 PyTorch 中一个非常重要的函数,用于获取模型的参数和持久性状态,并以字典形式返回。这个字典的键是模型中各层的名称,值是这些层对应的张量(即权重和偏置)。

常见用途:
  • 保存模型参数:可以通过 state_dict() 来保存模型的所有参数,通常保存为 .pt 文件。
  • 加载模型参数:通过加载保存的 state_dict() 来恢复模型的参数。
示例:
# 打印模型的 state_dict
for param_tensor in model.state_dict():print(param_tensor, "\t", model.state_dict()[param_tensor].size())
示例输出:
fc.weight      torch.Size([10, 512])
fc.bias        torch.Size([10])
conv1.weight   torch.Size([64, 3, 7, 7])
conv1.bias     torch.Size([64])
  • 输出中,fc.weightfc.bias 是全连接层的权重和偏置,conv1.weightconv1.bias 是卷积层的权重和偏置。
常用操作:
  1. 保存模型参数

    torch.save(model.state_dict(), 'model_weights.pth')
    
  2. 加载模型参数

    model.load_state_dict(torch.load('model_weights.pth'))
    

总结:

  • optimizer.param_groups:包含优化器参数和超参数(如学习率、动量等),帮助控制模型权重的更新过程。
  • model.state_dict():保存或加载模型的所有参数(权重、偏置等),通常用于模型的持久化和恢复。

相关文章:

深度学习代码学习笔记2

1、torch.max correct 0 total 0 for xb,yb in valid_dl:outputs model(xb)_,predicted torch.max(outputs.data,1)total yb.size(0) #yb.size(0) 返回的是张量 yb 在第 0 维的大小,也就是 yb 中的样本数量。correct (predicted yb).sum().item() print(…...

016集——c# 实现CAD类库 与窗体的交互(CAD—C#二次开发入门)

第一步:搭建CAD类库dll开发环境。 第二步:添加窗体 第三步:添加控件 第四步:双击控件,在控件点击方法内输入代码 第五步:在主程序内实例化新建的form类,并弹窗form窗体 第六步:CAD命…...

【亲测可行】最新ubuntu搭建rknn-toolkit2

文章目录 🌕结构图(ONNX->RKNN)🌕下载rknn-toolkit2🌕搭建环境🌙配置镜像源🌙conda搭建python3.8版本的虚拟环境🌙进入packages目录安装依赖库🌕测试安装是否成功🌕其它🌙rknn-toolkit2🌙rknn_model_zoo🌙关于部署的博客发布本文的时间为2024.10.13…...

pico+Unity交互开发——触碰抓取

一、VR交互的类型 Hover(悬停) 定义:发起交互的对象停留在可交互对象的交互区域。例如,当手触摸到物品表面(可交互区域)时,视为触发了Hover。 Grab(抓取) 概念&#xff…...

16年408计算机网络

第一题: 解析: 首先我们要清楚R1,R2,R3是路由器(网络层),Switch是以太网交换机(数据链路层),Hub是集线器(物理层)。 由此可见路由器实现的最高功能层是3层&am…...

PDF 转 CAD 工具:实现文档格式高效转换的利器

如果你从事设计相关PDF和CAD作为两种常见且重要的文件格式,在不同的领域都有着广泛的应用。今天,我们就来介绍几个各具特色的PDF转换成CAD工具。 1.福昕PDF转换大师 链接一下>>https://www.pdf365.cn/pdf2word/ 该工具在跨领域应用中表现出明确…...

基于springboot的画师约稿系统的设计与实现

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的画师约稿系统的设计与实…...

使用Python生成SVG图片

SVG(可缩放矢量图形)是一种基于XML的图像格式,它可以无损缩放且文件大小较小。在本文中,我们将探讨如何使用Python生成SVG图片。 为什么选择SVG? 可缩放:SVG图像可以无限放大而不失真。文件小:SVG文件通常比位图文件小。可编辑:SVG文件可以通过文本编辑器修改。 使用Python…...

hackmyvm-Hundred靶机

主机发现 sudo arp-scan -l 以sudo权限执行arp-scan -l 扫描并列出本地存在的机器,发现靶机ip为192.168.91.153 nmap扫描 端口发现 21/tcp open ftp 22/tcp open ssh 80/tcp open http web信息收集 我们先尝试一下ftp端口的匿名登录 FTP:是文件传输协议的端…...

多场景多任务建模(三): M2M(Multi-Scenario Multi-Task Meta Learning)

多场景建模: STAR(Star Topology Adaptive Recommender) 多场景建模(二): SAR-Net(Scenario-Aware Ranking Network) 前面两篇文章,讲述了关于多场景的建模方案,其中可以看到很多关于多任务学习的影子&…...

Day31 || 122.买卖股票的最佳时机 II、55. 跳跃游戏、 45.跳跃游戏II 、1005.K次取反后最大化的数组和

122.买卖股票的最佳时机 II 题目链接:力扣题目链接 思路:因为是求虽大利润完全可以假设知道第二天涨前一天买入即可,就是求两天只差大于0 的和。 55. 跳跃游戏 题目链接:力扣题目链接 思路:应该从后往前循环判断&…...

【uniapp】打包成H5并发布

目录 1、设置配置mainifest.sjon 1.1 页面标题 1.2 路由模式 1.3 运行的基础路径 2、打包 2.1 打包入口 2.2 打包成功 2.3 依据目录找到web目录 3、 将web目录整体拷贝出来 4、上传 4.1 登录uniapp官网注册免费空间 4.2 上传拷贝的目录 4.3 检查上传是否正确 5、…...

Position Embedding总结和Pytorch实现

文章目录 出现背景PE位置编码公式思路code 出现背景 自注意力机制处理数据,并不是采用类似RNN或者LSTM那种递归的结构,这使得模型虽然能够同时查看输入序列中的所有元素(即并行运算),但是也导致了没办法获取当前word在…...

【AIF-C01认证】亚马逊云科技生成式 AI 认证正式上线啦

文章目录 一、AIF-C01简介二、考试概览三、考试知识点3.1 AI 和 ML 基础知识3.2 生成式人工智能基础3.3 基础模型的应用3.4 负责任 AI 准则3.5 AI 解决方案的安全性、合规性和监管 四、备考课程4.1 「备考训练营」 在线直播课4.2 「SkillBuilder」学习课程 五、常见问题六、参考…...

C++ 素数的筛选法与穷举法

题目:素数大酬宾: 【问题描述】 某商场的仓库中有 n 种商品,每件商品按 1~n 依次编号。现在商场经理突发奇想,决定将编号为素数(质数)的所有商品拿出来搞优惠酬宾活动。请编程帮助仓库管理员将编号为素数的商品选出来…...

Spring Boot异步任务、任务调度与异步请求线程池的使用及原理

Spring Boot异步任务、任务调度与异步请求线程池的使用及原理 在Spring Boot应用程序中,异步任务、任务调度和异步请求线程池是提高系统性能和响应速度的重要工具。本文将详细讲解这些概念的使用及原理。 一、异步任务 异步任务是指可以在后台线程上执行的任务&a…...

Java爬虫之使用Selenium WebDriver 爬取数据

这里写自定义目录标题 Selenium WebDriver简介一、安装部署二、Java项目中使用1.引入依赖2.示例代码 三、WebDriver使用说明1.WebDriver定位器2.常用操作3.使用 cookie4.键盘与鼠标操作 Selenium WebDriver简介 Selenium WebDriver 是一种用于自动化测试 Web 应用程序的工具。…...

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别

在 MyBatis 中,updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别: 一、功能 updateByPrimaryKey: 会根据传入的实体对象,将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…...

JavaScript下载文件(简单模式、跨域问题、文件压缩)

文章目录 简介简单文件下载通过模拟form表单提交通过XMLHttpRequest方式 跨域(oss)下载并压缩文件完整示例文件压缩跨域设置 简介 相信各位开发朋友都遇到过下载的文件的需求,有的非常简单,基本链接的形式就可以。 有的就比较复杂,涉及跨域…...

Django 定义使用模型,并添加数据

教材: Python web企业级项目开发教程(黑马程序员)第三章 模型 实验步骤: 1.创建项目和应用 前置步骤可看前文,进入到指定文件位置后创建 django-admin startproject mysite python manage.py startapp app01 2.注册…...

联名物料常泄漏?一端叠满“安全buff”

前段时间,一则关于爆火影视剧与知名茶饮品牌联名的消息在社交平台上迅速传播,宣传物料的照片也随之曝光——门店尚未上新,“小道消息”便已被疯传。但这种情况并非首次发生,让众多网友不禁猜想:这究竟是一场精心策划的…...

Flutter UI组件库(JUI)

Flutter UI组件库 (JUI) 介绍 您是否正在寻找一种方法来简化Flutter开发过程,并创建美观、一致的用户界面?您的搜索到此为止!我们的Flutter UI组件库(JUI)提供了广泛的预构建、可自定义组件,帮助您快速构建…...

国外电商系统开发-运维系统远程文件

设计初衷是为了让所有人都能方便的打开网页,就能查看Linux系统文件内容,而不再用cat、vim、more等命令去打开文件,这对于我们一个普通的研发或者是财务人员来说,显得太繁琐,因为他们很可能不会这些命令,其次…...

4. Node.js Path模块

2.3Path模块 2.3.1获取js文件的绝对路径 console.log(__dirname) //js文件所在的文件夹的绝对路径 console.log(__filename) //js文件的绝对路径输出: G:\py_project\nodejs_study G:\py_project\nodejs_study\file.js2.3.2拼接规范的绝对路径path.r…...

重构长方法之分解条件表达式

分解条件表达式 是一种重构长方法中常用的技术,它适用于复杂的条件逻辑。在方法中,条件分支(if-else 或 switch)有时会变得条件非常多,非常复杂,难以理解和维护。通过分解条件逻辑,可以让代码更…...

蚁群算法养老服务人员智能调度系统

养老行业近年来越发热门,如何有效调配服务人员成为许多机构的痛点。我们结合智能算法技术,开发出了一款专为养老行业量身打造的“蚁群算法养老服务人员调度系统”,能够精准、高效地为机构分配人员,从此告别人力资源调度难题。 系…...

java使用 IDEA自动补全功能 AI 插件

国内插件: CodeGeeX: 功能特性: 由国内团队开发,是一款智能编程助手插件。它集成了多种人工智能技术,能够在多个编程语言中提供智能代码补全、代码生成、代码优化和注释生成等功能。该插件特别适用于常见的编程任务…...

【ShuQiHere】 AI与自我意识:能否创造真正的自觉机器人?

🤖【ShuQiHere】 📜 目录 引言人类意识的探索机器意识的五大理论 功能主义(Functionalism)信息整合(Information Integration)体现主义(Embodiment)行动主义(Enaction&…...

【Linux 从基础到进阶】CPU性能调优与监控

CPU性能调优与监控 1. 引言 在计算机系统中,CPU是核心组件之一,其性能直接影响系统的整体表现和响应速度。无论是在企业服务器环境、虚拟化环境,还是大数据计算场景,优化和监控CPU性能都至关重要。通过合理的调优策略和监控工具…...

Centos基线自动化检查脚本

此脚本是一个用于检查Linux系统安全配置的Bash脚本。它通过多项安全标准对系统进行评估,主要检查以下内容: IP地址获取:脚本首先获取主机的IP地址,确保其以10.115开头。 密码策略检查: 检查最小密码长度(P…...