1 深度学习网络DNN

news2024/9/24 0:09:29

代码来自B站up爆肝杰哥

测试版本

import torch
import torchvision

def print_hi(name):
    print(f'Hi, {name}')  

if __name__ == '__main__':
    print_hi('陀思妥耶夫斯基')
    print("HELLO pytorch {}".format(torch.__version__))
    print("torchvision.version:", torchvision.__version__)
    print("torch.cuda.is_available? ", torch.cuda.is_available())

    x = torch.rand(3, 6)
    print(x)
Hi, 陀思妥耶夫斯基
HELLO pytorch 1.12.0
torchvision.version: 0.13.0
torch.cuda.is_available?  False
tensor([[0.7461, 0.6500, 0.3676, 0.5967, 0.1452, 0.3587],
        [0.0439, 0.9415, 0.9146, 0.8264, 0.3982, 0.3910],
        [0.2620, 0.0925, 0.9572, 0.6554, 0.2681, 0.0893]])

一个搭建过程

ts1=torch.randn(3,2)
ts1
tensor([[-1.3440,  1.6731],
        [ 0.2274,  1.1744],
        [-0.7912,  1.0309]])
# 转移到GPU上
# ts2=ts1.to('cuda:0')
# model = DNN().to('cuda:0') 
简单搭建
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
%matplotlib inline

from matplotlib_inline import backend_inline
backend_inline.set_matplotlib_formats('svg')
# 生成数据集
X1 = torch.rand(10000,1) # 输入特征 1
X2 = torch.rand(10000,1) # 输入特征 2
X3 = torch.rand(10000,1) # 输入特征 3
Y1 = ( (X1+X2+X3)<1 ).float() # 输出特征 1
Y2 = ( (1<(X1+X2+X3)) & ((X1+X2+X3)<2) ).float() # 输出特征 2
Y3 = ( (X1+X2+X3)>2 ).float() # 输出特征 3
Data = torch.cat([X1,X2,X3,Y1,Y2,Y3],axis=1) # 整合数据集
# Data = Data.to('cuda:0') # 把数据集搬到 GPU 上
Data.shape
torch.Size([10000, 6])
train_size=int(len(Data)*0.7)
test_size=len(Data)-train_size
Data=Data[torch.randperm(Data.size(0)),:] # 打乱样本顺序
train_Data = Data[:train_size, :]
test_Data = Data[train_size:, :]
train_Data.shape, test_Data.shape
(torch.Size([7000, 6]), torch.Size([3000, 6]))
class DNN(nn.Module):

    def __init__(self):
        ''' 搭建神经网络各层 '''
        super(DNN, self).__init__()
        self.net = nn.Sequential(  # 按顺序搭建各层
            nn.Linear(3, 5),
            nn.ReLU(),  # 第 1 层:全连接层
            nn.Linear(5, 5),
            nn.ReLU(),  # 第 2 层:全连接层
            nn.Linear(5, 5),
            nn.ReLU(),  # 第 3 层:全连接层
            nn.Linear(5, 3)  # 第 4 层:全连接层
        )

    def forward(self, x):
        ''' 前向传播 '''
        y = self.net(x)  # x 即输入数据
        return y  # y 即输出数据
model=DNN()
model
DNN(
  (net): Sequential(
    (0): Linear(in_features=3, out_features=5, bias=True)
    (1): ReLU()
    (2): Linear(in_features=5, out_features=5, bias=True)
    (3): ReLU()
    (4): Linear(in_features=5, out_features=5, bias=True)
    (5): ReLU()
    (6): Linear(in_features=5, out_features=3, bias=True)
  )
)
# 查看内部参数(非必要)
for name, param in model.named_parameters():
    print(f"参数:{name}\n 形状:{param.shape}\n 数值:{param}\n")
参数:net.0.weight
 形状:torch.Size([5, 3])
 数值:Parameter containing:
tensor([[-0.3450, -0.0658, -0.4716],
        [ 0.4366, -0.2939, -0.2635],
        [ 0.0442, -0.4962, -0.2176],
        [ 0.0285, -0.1640, -0.2958],
        [ 0.0790,  0.4858,  0.1398]], requires_grad=True)

参数:net.0.bias
 形状:torch.Size([5])
 数值:Parameter containing:
tensor([ 0.5582, -0.4712,  0.4455,  0.2119, -0.2546], requires_grad=True)

参数:net.2.weight
 形状:torch.Size([5, 5])
 数值:Parameter containing:
tensor([[ 0.2466,  0.1161, -0.2335, -0.3888, -0.1425],
        [ 0.0706,  0.0777,  0.0081,  0.0236, -0.0326],
        [ 0.3518,  0.0702,  0.4115, -0.2355, -0.2249],
        [-0.0715, -0.1902, -0.1665, -0.1604, -0.1973],
        [-0.0658,  0.0639, -0.1540, -0.4332, -0.3613]], requires_grad=True)

参数:net.2.bias
 形状:torch.Size([5])
 数值:Parameter containing:
tensor([ 0.3787,  0.2764,  0.2568,  0.3191, -0.2946], requires_grad=True)

参数:net.4.weight
 形状:torch.Size([5, 5])
 数值:Parameter containing:
tensor([[-0.1057,  0.0083,  0.0652,  0.3027,  0.1454],
        [ 0.1724,  0.0562,  0.3369,  0.0071, -0.1573],
        [-0.3154, -0.0760,  0.0859, -0.3460, -0.0201],
        [ 0.2442, -0.3927, -0.0244, -0.2937,  0.1900],
        [ 0.3870, -0.3930,  0.1015, -0.2828, -0.0344]], requires_grad=True)

参数:net.4.bias
 形状:torch.Size([5])
 数值:Parameter containing:
tensor([ 0.3448, -0.2331,  0.3587,  0.3233,  0.0216], requires_grad=True)

参数:net.6.weight
 形状:torch.Size([3, 5])
 数值:Parameter containing:
tensor([[ 0.3056, -0.1478, -0.1536,  0.0831,  0.2769],
        [-0.2593, -0.4269,  0.1112, -0.0393, -0.4057],
        [-0.3688,  0.3386, -0.2689, -0.2382, -0.0796]], requires_grad=True)

参数:net.6.bias
 形状:torch.Size([3])
 数值:Parameter containing:
tensor([-0.0037,  0.2068, -0.0956], requires_grad=True)
# 损失函数的选择
loss_fn = nn.MSELoss()
# 优化算法的选择
learning_rate = 0.01 # 设置学习率
optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)
# 训练网络
epochs = 1000
losses = []  # 记录损失函数变化的列表
# 给训练集划分输入与输出
X = train_Data[:, :3]  # 前 3 列为输入特征
Y = train_Data[:, -3:]  # 后 3 列为输出特征
for epoch in range(epochs):
    Pred = model(X)  # 一次前向传播(批量)
    loss = loss_fn(Pred, Y)  # 计算损失函数
    losses.append(loss.item())  # 记录损失函数的变化
    optimizer.zero_grad()  # 清理上一轮滞留的梯度
    loss.backward()  # 一次反向传播
    optimizer.step()  # 优化内部参数
    
Fig = plt.figure()
plt.plot(range(epochs), losses)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

在这里插入图片描述

# 测试网络
# 给测试集划分输入与输出
X = test_Data[:, :3]  # 前 3 列为输入特征
Y = test_Data[:, -3:]  # 后 3 列为输出特征
with torch.no_grad():  # 该局部关闭梯度计算功能
    Pred = model(X)  # 一次前向传播(批量)
    # 将每行最大的数置 1,将不是 1 的数字置 0
    Pred[:, torch.argmax(Pred, axis=1)] = 1
    Pred[Pred != 1] = 0
    correct = torch.sum((Pred == Y).all(1))  # 预测正确的样本数量
    total = Y.size(0)  # 全部的样本数量
    print(f'测试集精准度: {100*correct/total} %')
测试集精准度: 67.19999694824219 %
# 保存网络
torch.save(model, 'model.pth')
# 把模型赋给新网络
new_model = torch.load('model.pth')
# 测试网络
# 给测试集划分输入与输出
X = test_Data[:, :3]  # 前 3 列为输入特征
Y = test_Data[:, -3:]  # 后 3 列为输出特征
with torch.no_grad():  # 该局部关闭梯度计算功能
    Pred = new_model(X)  # 一次前向传播(批量)
    # 将每行最大的数置 1,将不是 1 的数字置 0
    Pred[:, torch.argmax(Pred, axis=1)] = 1
    Pred[Pred != 1] = 0
    correct = torch.sum((Pred == Y).all(1))  # 预测正确的样本数量
    total = Y.size(0)  # 全部的样本数量
    print(f'测试集精准度: {100*correct/total} %')
测试集精准度: 67.19999694824219 %

一个例子:批量梯度下降

import numpy as np
import pandas as pd
import torch
import torch.nn as nn
import matplotlib.pyplot as plt
%matplotlib inline

# 展示高清图
from matplotlib_inline import backend_inline

backend_inline.set_matplotlib_formats('svg')
# 准备数据集
df = pd.read_excel('./深度学习(4):深度神经网络(DNN)/Data.xlsx', index_col=0) # 导入数据
arr = df.values # Pandas 对象退化为 NumPy 数组
arr = arr.astype(np.float32) # 转为 float32 类型数组
ts = torch.tensor(arr) # 数组转为张量
# ts = ts.to('cuda') # 把训练集搬到 cuda 上
ts.shape
torch.Size([759, 9])
# 划分训练集与测试集
train_size = int(len(ts) * 0.7)  # 训练集的样本数量
test_size = len(ts) - train_size  # 测试集的样本数量
ts = ts[torch.randperm(ts.size(0)), :]  # 打乱样本的顺序
train_Data = ts[:train_size, :]  # 训练集样本
test_Data = ts[train_size:, :]  # 测试集样本
train_Data.shape, test_Data.shape
(torch.Size([531, 9]), torch.Size([228, 9]))
class DNN(nn.Module):

    def __init__(self):
        super(DNN, self).__init__()
        self.net = nn.Sequential(nn.Linear(8, 32), nn.Sigmoid(),
                                 nn.Linear(32, 8),
                                 nn.Sigmoid(), nn.Linear(8, 4), nn.Sigmoid(),
                                 nn.Linear(4, 1), nn.Sigmoid())

    def forward(self, x):
        y = self.net(x)
        return y


model = DNN()
loss_fn = nn.BCELoss(reduction='mean')
optimizer = torch.optim.Adam(model.parameters(), lr=0.005)

# 训练网络
epochs = 5000
losses = []  # 记录损失函数变化的列表
# 给训练集划分输入与输出
X = train_Data[:, :-1]  # 前 8 列为输入特征
Y = train_Data[:, -1].reshape((-1, 1))
# 此处的.reshape((-1,1))将一阶张量升级为二阶张量

for _ in range(epochs):
    Pred = model(X)
    loss = loss_fn(Pred, Y)
    losses.append(loss.item())
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

Fig = plt.figure()
plt.plot(range(epochs), losses)
plt.ylabel('loss')
plt.xlabel('epoch')
plt.show()

在这里插入图片描述

# 测试网络
# 给测试集划分输入与输出
X = test_Data[:, :-1]  # 前 8 列为输入特征
Y = test_Data[:, -1].reshape((-1, 1))  # 后 1 列为输出特征
with torch.no_grad():  # 该局部关闭梯度计算功能
    Pred = model(X)  # 一次前向传播(批量)
    Pred[Pred >= 0.5] = 1
    Pred[Pred < 0.5] = 0
    correct = torch.sum((Pred == Y).all(1))  # 预测正确的样本
    total = Y.size(0)  # 全部的样本数量
    print(f'测试集精准度: {100*correct/total} %')
测试集精准度: 69.7368392944336 %

接着上一个例子:改用小批量梯度下降

在使用小批量梯度下降时,必须使用 3 个 PyTorch 内置的实用工具(utils):

  • DataSet 用于封装数据集;
  • DataLoader 用于加载数据不同的批次;
  • random_split 用于划分训练集与测试集。
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader, random_split
import matplotlib.pyplot as plt
%matplotlib inline

# 展示高清图
from matplotlib_inline import backend_inline

backend_inline.set_matplotlib_formats('svg')

在封装我们的数据集时,必须继承实用工具(utils)中的 DataSet 的类,这
个过程需要重写_init_、_getitem_、__len__三个方法,分别是为了加载数据集、获取数据索引、获取数据总量。

# 制作数据集
class MyData(Dataset):  # 继承 Dataset 类

    def __init__(self, filepath):
        df = pd.read_excel(filepath, index_col=0)  # 导入数据
        arr = df.values  # 对象退化为数组
        arr = arr.astype(np.float32)  # 转为 float32 类型数组
        ts = torch.tensor(arr)  # 数组转为张量
#         ts = ts.to('cuda')  # 把训练集搬到 cuda 上
        self.X = ts[:, :-1]  # 前 8 列为输入特征
        self.Y = ts[:, -1].reshape((-1, 1))  # 后 1 列为输出特征
        self.len = ts.shape[0]  # 样本的总数

    def __getitem__(self, index):
        return self.X[index], self.Y[index]

    def __len__(self):
        return self.len
# 划分训练集与测试集
Data = MyData('./深度学习(4):深度神经网络(DNN)/Data.xlsx')
train_size = int(len(Data) * 0.7)  # 训练集的样本数量
test_size = len(Data) - train_size  # 测试集的样本数量
train_Data, test_Data = random_split(Data, [train_size, test_size])
# 批次加载器
train_loader = DataLoader(dataset=train_Data, shuffle=True, batch_size=128) # 在每个 epoch 开始时,数据会被随机打乱顺序
test_loader = DataLoader(dataset=test_Data, shuffle=False, batch_size=64)
class DNN(nn.Module):

    def __init__(self):
        super(DNN, self).__init__()
        self.net = nn.Sequential(nn.Linear(8, 32), nn.Sigmoid(),
                                 nn.Linear(32, 8),
                                 nn.Sigmoid(), nn.Linear(8, 4), nn.Sigmoid(),
                                 nn.Linear(4, 1), nn.Sigmoid())

    def forward(self, x):
        y = self.net(x)
        return y
model = DNN()
loss_fn = nn.BCELoss(reduction='mean')
optimizer = torch.optim.Adam(model.parameters(), lr=0.005)

# 训练网络
epochs = 500
losses = []  # 记录损失函数变化的列表

for _ in range(epochs):
    for (x,y) in train_loader:
        Pred = model(x)
        loss = loss_fn(Pred, y)
        losses.append(loss.item())
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

Fig = plt.figure()
plt.plot(range(len(losses)), losses)
plt.show()

在这里插入图片描述

# 测试网络
correct = 0
total = 0
with torch.no_grad(): # 该局部关闭梯度计算功能
    for (x, y) in test_loader: # 获取小批次的 x 与 y
        Pred = model(x) # 一次前向传播(小批量)
        Pred[Pred>=0.5] = 1
        Pred[Pred<0.5] = 0
        correct += torch.sum( (Pred == y).all(1) )
        total += y.size(0)
print(f'测试集精准度: {100*correct/total} %') # 可见这里小批量梯度下降比批量梯度下降效果好
测试集精准度: 76.31578826904297 %

手写数字识别

在 MNIST 中,模型的输入是一副图像,模型的输出就是一个与图像中对应的数字(0 至 9 之间的一个整数,不是独热编码)。我们不用手动将输出转换为独热编码,PyTorch 会在整个过程中自动将数据集的输出转换为独热编码.只有在最后测试网络时,我们对比测试集的预测输出与真实输出时,才需要注意一下。每个图像都是形状为28 × 28的二维数组。

在这种多分类问题中,神经网络的输出层需要一个 softmax 激活函数,它可以把输出层的数据归一化到 0-1 上,且加起来为 1,这样就模拟出了概率的意思。

import torch
import torch.nn as nn
from torch.utils.data import DataLoader
from torchvision import transforms, datasets
import matplotlib.pyplot as plt
%matplotlib inline

# 展示高清图
from matplotlib_inline import backend_inline

backend_inline.set_matplotlib_formats('svg')
# 数据集转换参数
transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize(0.1307, 0.3081)])

train_dataset = datasets.MNIST(root='./data',
                               train=True,
                               transform=transform,
                               download=False)  # 我已下载,所以改成False,没下载改成True,test_dataset同理
test_dataset = datasets.MNIST(root='./data',
                              train=False,
                              transform=transform,
                              download=False)
train_loader = DataLoader(dataset=train_dataset, batch_size=128, shuffle=True)
test_loader = DataLoader(dataset=test_dataset, batch_size=128, shuffle=False)

每个样本的输入都是形状为28 × 28的二维数组,那么对于 DNN 来说,输入层的神经元节点就要有28 × 28 = 784个;输出层使用独热编码,需要 10 个节点。

class DNN(nn.Module):

    def __init__(self):
        ''' 搭建神经网络各层 '''
        super(DNN, self).__init__()
        self.net = nn.Sequential(  # 按顺序搭建各层
            nn.Flatten(),  # 把图像铺平成一维
            nn.Linear(784, 512),
            nn.ReLU(),  # 第 1 层:全连接层
            nn.Linear(512, 256),
            nn.ReLU(),  # 第 2 层:全连接层
            nn.Linear(256, 128),
            nn.ReLU(),  # 第 3 层:全连接层
            nn.Linear(128, 64),
            nn.ReLU(),  # 第 4 层:全连接层
            nn.Linear(64, 10)  # 第 5 层:全连接层
        )

    def forward(self, x):
        ''' 前向传播 '''
        y = self.net(x)  # x 即输入数据
        return y  # y 即输出数据
model = DNN()
loss_fn = nn.CrossEntropyLoss() # 自带 softmax 激活函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01,momentum=0.5)

# 训练网络
epochs = 5
losses = []  # 记录损失函数变化的列表

for _ in range(epochs):
    for (x,y) in train_loader:
        Pred = model(x)
        loss = loss_fn(Pred, y)
        losses.append(loss.item())
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

Fig = plt.figure()
plt.plot(range(len(losses)), losses)
plt.show()

在这里插入图片描述

# 测试网络
correct = 0
total = 0
with torch.no_grad(): # 该局部关闭梯度计算功能
    for (x, y) in test_loader: # 获取小批次的 x 与 y
        Pred = model(x) # 一次前向传播(小批量
        _, predicted = torch.max(Pred.data, dim=1) # 每一行最大值,最大值对应的列索引
        correct += torch.sum( (predicted == y) )
        total += y.size(0)
    
print(f'测试集精准度: {100*correct/total} %') 
测试集精准度: 95.16999816894531 %

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1946064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++(week13): C++基础: 标准模板库 STL

文章目录 零、标准模板库 STL一、容器 (Container)1.序列式容器(1)vector2.五种遍历10.vector的迭代器失效问题 (2)deque(3)list 2.关联式容器(1)set4.set的查找(2)find() 8.set中存储自定义类型&#xff1a;三种方法 (2)multiset7.multiset的特殊操作&#xff1a;bound系列函数…

LeetCode/NowCoder-二叉树OJ练习

励志冰檗&#xff1a;形容在清苦的生活环境中激励自己的意志。&#x1f493;&#x1f493;&#x1f493; 目录 说在前面 题目一&#xff1a;单值二叉树 题目二&#xff1a;相同的树 题目三&#xff1a;对称二叉树 题目四&#xff1a;二叉树的前序遍历 题目五&#xff1a;另…

Python | Leetcode Python题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; class Solution:def hIndex(self, citations: List[int]) -> int:n len(citations)left 0; right n - 1while left < right:mid left (right - left) // 2if citations[mid] > n - mid:right mid - 1else:left mid 1retur…

C语言之2048小游戏理解分析

目录 游戏程序思维导图&#xff1a; ​编辑 功能介绍&#xff1a; 代码管理&#xff1a; 主函数&#xff1a; 头文件&#xff1a; 游戏程序思维导图&#xff1a; 功能介绍&#xff1a; 按键W --------------- 向上 按键A --------------- 向左 按键S --------------- 向…

科技云报道:算网筑基AI注智,中国联通如何讲出AI时代的“新故事”?

科技云报道原创。 AI从未停止进化&#xff0c;也从未停止给人类带来惊喜。 从ChatGPT代表的文生文、Dall-E代表的文生图&#xff0c;到Sora代表的文生视频&#xff0c;Suno为代表的文生音乐&#xff0c;生成式AI的“暴力美学”持续突破内容生产的天花板&#xff0c;大模型技术…

【黑马java基础】特殊文件,日志

目录 特殊文件&#xff1a;Properties属性文件特点、作用使用Properties读取属性文件里的键值对数据使用properties把键值对数据写到属性文件中去案例 特殊文件&#xff1a;XML文件概述读取XML文件中的数据把数据写出到XML文件中去补充知识&#xff1a;约束XML文件的编写[了解]…

打卡第21天------二叉树

我现在每天都是在与时间赛跑&#xff0c;分秒必争&#xff0c;不想浪费一点我自己的时间。 希望通过算法训练营可以把我自己的逻辑思维建立起来&#xff0c;把自己的算法能力给提上去。 一、修剪二叉搜索树 题目链接&#xff1a;669. 修剪二叉搜索树 题目描述&#xff1a; 给…

最优化原理(笔记)

内积是线性代数运算的一个结果&#xff0c;一行*一列。 内积的性质&#xff01; 什么是范数&#xff1f;&#xff1f;&#xff1f; 对称矩阵&#xff1a;关于主对角线对称&#xff01; 正定对称矩阵&#xff1a; 二阶导是正定的&#xff0c;f(x)就是严格的凸函数&#xff01;&a…

element的el-autocomplete带输入建议搜索+搜索匹配文字高亮显示

element的el-autocomplete带输入建议搜索搜索匹配文字高亮显示 直接上代码 // vue代码块 添加插槽<el-autocompleteclearableplaceholder"请输入关键词进行搜索"input"searchInput"v-model"searchInputData":fetch-suggestions"queryS…

Android APP 音视频(02)MediaProjection录屏与MediaCodec编码

说明&#xff1a; 此MediaProjection 录屏和编码实操主要针对Android12.0系统。通过MediaProjection获取屏幕数据&#xff0c;将数据通过mediacodec编码输出H264码流&#xff08;使用ffmpeg播放&#xff09;&#xff0c;存储到sd卡上。 1 MediaProjection录屏与编码简介 这里…

【测开能力提升-Javascript】JavaScript运算符流程结构

1. 递增递减运算符 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><script>// 前置递增运算符var age10age //类似于ageage1&#xff0c; 先加1后返回值alert(age)// 后置…

【数据结构 | 哈希表】一文了解哈希表(散列表)

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

【SQL语句大全(MySQL)】

SQL语法 添加删除修改查询基本查询条件查询分组函数/聚合函数分组查询排序分页查询&#xff08;限制查询&#xff09;多表查询连接查询根据年代分类连接查询根据连接方式分类1、内连接2、左外连接3、右外连接 多张表连接的语法格式 嵌套查询 SQL语句书写顺序 添加 INSERT INTO…

什么是STP环路保护

在运行生成树协议的网络中&#xff0c;根端口和其他阻塞端口状态是依靠不断接收来自上游设备的BPDU维持。当由于链路拥塞或者单向链路故障导致这些端口收不到来自上游交换设备的BPDU时&#xff0c;设备会重新选择根端口。原先的根端口会转变为指定端口&#xff0c;而原先的阻塞…

2019年9月全国英语等级考试第三级笔试真题

2019年9月全国英语等级考试第三级笔试真题

vue3.0学习笔记(三)——计算属性、监听器、ref属性、组件通信

1. computed 函数 定义计算属性&#xff1a; computed 函数&#xff0c;是用来定义计算属性的&#xff0c;计算属性不能修改。 计算属性应该是只读的&#xff0c;特殊情况可以配置 get set 核心步骤&#xff1a; 导入 computed 函数 执行函数 在回调参数中 return 基于响应…

尚品汇-sku存入Redis缓存(二十三)

目录&#xff1a; &#xff08;1&#xff09;分布式锁改造获取sku信息 &#xff08;2&#xff09;使用Redisson 分布式锁 AOP实现缓存 &#xff08;3&#xff09;定义缓存aop注解 &#xff08;1&#xff09;分布式锁改造获取sku信息 前面学习了本地锁的弊端&#xff0c;…

Springboot validated JSR303校验

1.导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-validation</artifactId></dependency> 2.测试类 package com.jmj.gulimall.product.testC;import lombok.Data;import javax.val…

《0基础》学习Python——第二十讲__网络爬虫/<3>

一、用post请求爬取网页 同样与上一节课的get强求的内容差不多&#xff0c;即将requests.get(url,headershead)代码更换成requests.post(url,headershead),其余的即打印获取的内容&#xff0c;如果content-typejson类型的&#xff0c;打印上述代码的请求&#xff0c;则用一个命…

argon主题调整日记

前言 argon主题是一款由solstice23开发的一款简洁美观的WordPress主题&#xff0c;在使用过程中也发现了几个可以优化的点&#xff0c;在查阅主题文档无果后对其进行以下几点修改。 1、使用子主题 为了避免修改源文件而引起主题更新后修改丢失的问题&#xff0c;还是尽量使用子…