AWS人工智能主题学习月:深度学习入门笔记

news2024/11/18 13:34:48

目录

一、深度学习入门课程的学习重点📕

二、简单介绍一下深度学习和神经网络💡

1.深度学习

2.神经网络

3.深度学习储备知识拓展

三、深度学习生产生活实际案例🚗

四、深度学习的框架介绍🌳

总结


深度学习是机器学习中的一种方法,它利用多层神经网络来学习数据的特征表示。近年来,深度学习在许多领域取得了巨大的成功,包括计算机视觉、语音识别、自然语言处理等。

深度学习使用多层神经网络来解决各种问题。神经网络由输入层、隐藏层和输出层组成,每层都有多个神经元。输入层接收输入数据,隐藏层对数据进行处理,输出层生成预测结果。每个神经元都有一些权重和偏差,它们都是模型的参数。深度学习的核心思想是让模型自动学习这些参数,从而解决问题。

深度学习的优势在于它可以处理大量的数据和高维度的特征。它在计算机视觉、自然语言处理等领域有着广泛的应用。

我的博客里也有我自己深度学习的学习记录,Pytorch、RNN、yolov5等都有涉及,也欢迎大家去交流学习,最后也感谢亚马逊云科技提供的深度学习入门课程,让我进一步了解了深度学习,同时也拥有更深层次的体会。


一、深度学习入门课程的学习重点📕

翻译一下就是

1.什么是深度学习?
2.理解一些深度学习的概念。
3.亚马逊深度学习资源。
4.使用案例。

二、简单介绍一下深度学习和神经网络💡

1.深度学习

深度学习算法是学习数据表示的更广泛的机器学习领域的一个子集,而机器学习本身是人工智能的一个子集。深度学习使用多层非线性处理单元进行特征提取和转换,每个连续层都使用前一层的输出作为输入。

早在上个世纪50年代就有许多种深度学习算法的研究,当时研究者们开始探索神经网络的概念。1960年,Frank Rosenblatt提出了“感知器”,这是一种基于神经网络的机器学习模型,它可以用来识别特定的模式。1970年,Paul Werbos提出了反向传播算法,这是一种用于训练神经网络的算法,它可以让神经网络更好地拟合数据。1980年,John Hopfield提出了Hopfield网络,这是一种可以解决优化问题的神经网络模型。
1990年,Yann LeCun提出了卷积神经网络(CNN),这是一种用于图像分类的神经网络模型,它可以提取图像中的特征。2006年,Geoffrey Hinton提出了深度置信网络(DBN),这是一种可以解决复杂问题的深度学习模型。2012年,Alex Krizhevsky等人提出了AlexNet,这是一种用于图像分类的深度学习模型,它在ImageNet比赛中取得了巨大的成功。
自2012年以来,深度学习技术发展迅速,出现了许多新的模型,如残差网络(ResNet)、注意力机制(Attention Mechanism)、生成对抗网络(GAN)等。深度学习技术已经被广泛应用于计算机视觉、自然语言处理、语音识别等领域,取得了巨大的成功。

同时,随着科技进步和数据的膨胀,GPU逐渐成为了通用的计算工具。这使得神经网络得以进步。GPU的出现和训练时间的缩短成为了神经网络和深度学习的支柱。08年以后,神经网络成为深度学习的主流方法。

ANN神经网络

不同于传统的机器学习,深度学习侧重基于原始特征的端到端学习。后者使用多层神经网络来进行机器学习的方法。每一层负责分析数据中的其他复杂特征。这些多层神经网络被称为深度神经网络,因此这种方法被称为深度学习。深度学习可以用来解决许多机器学习问题,包括图像分类、语音识别和自然语言处理等。

2.神经网络

 接下来简单介绍一下神经网络。(以下代码为构建CNN网络和RNN网络为样例)

import torch.nn.functional as F
 
class Network_bn(nn.Module):
    def __init__(self):
        super(Network_bn, self).__init__()
       
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=12, kernel_size=5, stride=1, padding=0)
        self.bn1 = nn.BatchNorm2d(12)
        self.conv2 = nn.Conv2d(in_channels=12, out_channels=12, kernel_size=5, stride=1, padding=0)
        self.bn2 = nn.BatchNorm2d(12)
        self.pool = nn.MaxPool2d(2,2)
        self.conv4 = nn.Conv2d(in_channels=12, out_channels=24, kernel_size=5, stride=1, padding=0)
        self.bn4 = nn.BatchNorm2d(24)
        self.conv5 = nn.Conv2d(in_channels=24, out_channels=24, kernel_size=5, stride=1, padding=0)
        self.bn5 = nn.BatchNorm2d(24)
        self.fc1 = nn.Linear(24*50*50, len(classeNames))
 
    def forward(self, x):
        x = F.relu(self.bn1(self.conv1(x)))      
        x = F.relu(self.bn2(self.conv2(x)))     
        x = self.pool(x)                        
        x = F.relu(self.bn4(self.conv4(x)))     
        x = F.relu(self.bn5(self.conv5(x)))  
        x = self.pool(x)                        
        x = x.view(-1, 24*50*50)
        x = self.fc1(x)
 
        return x
 
device = "cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))
 
model = Network_bn().to(device)
print(model)

import tensorflow
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,SimpleRNN
 
model = Sequential()
model.add(SimpleRNN(200, input_shape= (13,1), activation='relu'))
model.add(Dense(100, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.summary()

 神经网络是一种人工智能技术,它模仿人脑的神经元网络来处理信息。 神经网络由输入层、隐藏层和输出层组成,每层由许多神经元组成。 神经元之间通过权重相连,神经网络通过学习调整权重来处理输入信息并生成输出结果。神经网络是一个简单可训练的数学单元的集合,可以共同学习复杂的函数。

神经网络由三种层组成,分别是一个输入层、一些隐藏层和一个输出层。人工神经网络的基本单元是人工神经元(又称为节点),其有数个输入通道,一个神经元在处理阶段将这些输入相加,并得到一个可以展开到多个人工神经元的输出。

 如下面这个示例,输入值乘以权重即可得到加权值。节点将偏移矢量添加到总和中,称为偏差,用于基于先前的成功或失败预测来调整总和以生成更准确的预测。对输入进行加权,然后求和并加上适当偏差。如果前面的步骤得到的最终值达到或超过确定的激活阈值,则神经元激活。这就是所谓的神经元激活,这是提供输出之前的最后一步 。

 前馈神经网络是不在神经元之间形成循环的任何神经网络,这意味着数据从一个输入移动到输出而没有向后循环。还有另一种类型的神经网络是向后循环的,称为循环神经网络。

循环神经网络的主要价值在于处理序列信息,像文本、语言和手写内容等,比如要把下一个单词或字母之前的单词或字母计算在内,则预测该单词或字母的能力会大大提高。

 最后,可以总结到,神经网络是一种模拟人脑的计算模型,它可以用来解决复杂的问题,比如识别图像、语音识别、自然语言处理等。它的重要性在于它可以模拟人类的大脑,从而解决复杂的问题,而不需要人工编程。神经网络也可以用来提高机器学习的性能,从而更好地解决实际问题。

3.深度学习储备知识拓展

 这里稍微拓展一下深度学习的计算知识,常用到的有卷积层的计算:⭐
输入图片矩阵I 大小:w×w                       

卷积核K:k×k

步长S:s

填充大小(padding):p

 当卷积函数中padding='same'时,会动态调整p 值,确保o=w ,即保证输入与输出一致。例如:输入是 28*28*1 输出也为 28*28*1 。

步长为1,卷积核为3*3,padding='same'的卷积情况如下:

 池化层的计算:

torch.nn.MaxPool2d()函数原型:

torch.nn.MaxPool2d(kernel_size, stride=None, padding=0, dilation=1, return_indices=False, ceil_mode=False)

 关键参数说明:
●kernel_size:最大的窗口大小
●stride:窗口的步幅,默认值为kernel_size
●padding:填充值,默认为0
●dilation:控制窗口中元素步幅的参数,默认为1

📐池化层计算公式:
●Input:(N, C, Hin, Win) or (C, Hin, Win)
●Output:(N, C, Hout, Wout) or (C, Hout, Wout)

 

例子: 

import torch
import torch.nn as nn

m = nn.MaxPool2d(2)
input_x = torch.randn(3, 32, 32)
print("输入数据input_x.shape:",input_x.shape)
output = m(input_x)
print("输出数据output.shape:",output.shape)

输入数据input_x.shape: torch.Size([3, 32, 32])
输出数据output.shape: torch.Size([3, 16, 16])

三、深度学习生产生活实际案例🚗

深度学习在许多领域都有广泛的应用,其中包括:
1. 语音识别:深度学习技术可以用于语音识别,从而实现语音转文本的功能。
2. 自然语言处理:深度学习技术可以用于自然语言处理,从而实现自然语言理解和自然语言生成的功能。
3. 图像识别:深度学习技术可以用于图像识别,从而实现图像分类、目标检测和图像分割的功能。

通过yolov5实现的数字识别

4. 计算机视觉:深度学习技术可以用于计算机视觉,从而实现视觉识别、视觉定位和视觉分析的功能。
5. 机器人:深度学习技术可以用于机器人,从而实现机器人的自主导航、自主学习和自主控制的功能。
6. 推荐系统:深度学习技术可以用于推荐系统,从而实现基于用户的个性化推荐的功能

 亚马逊云科技也提供了三种深度学习api接口供我们实践学习。

四、深度学习的框架介绍🌳

一些框架允许我们定义模型,然后对其进行大规模训练。

这里自荐一下我自己~首先对比一下两种常见的深度学习框架。

  • TensorFlow:TensorFlow是一个使用数据流图进行数值计算的开源软件库。它由谷歌大脑团队开发,供谷歌内部使用,并根据Apache 2.0开源许可证发布。TensorFlow用于各种任务,包括机器学习、深度学习、自然语言处理、图像识别等。它的设计是灵活和可扩展的,允许开发人员构建和部署自定义模型和算法。相对简单,模块封装比较好,容易上手,对新手比较友好。在工业界最重要的是模型落地,目前国内的大部分企业支持TensorFlow模型在线部署,不支持Pytorch。
  • PyTorch:PyTorch是一个开源的Python机器学习库,用于自然语言处理,计算机视觉和深度学习应用。它提供了一个灵活的编程环境,可以轻松地实现和调试模型,并且可以使用GPU加速。前沿算法多为PyTorch版本,如果是你在校学生,建议学这个。相对于TensorFlow,Pytorch在易用性上更有优势,更加方便调试。

我写的一些文章,用到了pytorch搭建的cnn神经网络,这里放一个链接供大家参考学习。深度学习Week8-咖啡豆识别(Pytorch)_牛大了2022的博客-CSDN博客 这是它的源码,详细可以去读读这篇文章。

import torch
import torch.nn as nn
import torchvision.transforms as transforms
import torchvision
from torchvision import transforms, datasets

import os, PIL, pathlib

device = torch.device("cuda" if torch.cuda.is_available() else "cpu")

print(device)



data_dir = './49-data/'
data_dir = pathlib.Path(data_dir)

data_paths = list(data_dir.glob('*'))
classeNames = [str(path).split("\\")[1] for path in data_paths]
print(classeNames)

# 关于transforms.Compose的更多介绍可以参考:https://blog.csdn.net/qq_38251616/article/details/124878863
train_transforms = transforms.Compose([
    transforms.Resize([224, 224]),  # 将输入图片resize成统一尺寸
    # transforms.RandomHorizontalFlip(), # 随机水平翻转
    transforms.ToTensor(),          # 将PIL Image或numpy.ndarray转换为tensor,并归一化到[0,1]之间
    transforms.Normalize(           # 标准化处理-->转换为标准正太分布(高斯分布),使模型更容易收敛
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225])  # 其中 mean=[0.485,0.456,0.406]与std=[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。
])

test_transform = transforms.Compose([
    transforms.Resize([224, 224]),  # 将输入图片resize成统一尺寸
    transforms.ToTensor(),          # 将PIL Image或numpy.ndarray转换为tensor,并归一化到[0,1]之间
    transforms.Normalize(           # 标准化处理-->转换为标准正太分布(高斯分布),使模型更容易收敛
        mean=[0.485, 0.456, 0.406],
        std=[0.229, 0.224, 0.225])  # 其中 mean=[0.485,0.456,0.406]与std=[0.229,0.224,0.225] 从数据集中随机抽样计算得到的。
])

total_data = datasets.ImageFolder("./49-data/",transform=train_transforms)
print(total_data.class_to_idx)

train_size = int(0.8 * len(total_data))
test_size  = len(total_data) - train_size
train_dataset, test_dataset = torch.utils.data.random_split(total_data, [train_size, test_size])

batch_size = 4 
train_dl = torch.utils.data.DataLoader(train_dataset,
                                           batch_size=batch_size,
                                           shuffle=True,
                                           num_workers=0)
test_dl = torch.utils.data.DataLoader(test_dataset,
                                          batch_size=batch_size,
                                          shuffle=True,
                                          num_workers=0)
for X, y in test_dl:
    print("Shape of X [N, C, H, W]: ", X.shape)
    print("Shape of y: ", y.shape, y.dtype)
    break

from torchvision.models import vgg16

device = "cuda" if torch.cuda.is_available() else "cpu"
print("Using {} device".format(device))

# 加载预训练模型,并且对模型进行微调
model = vgg16(pretrained=True).to(device)  # 加载预训练的vgg16模型

for param in model.parameters():
    param.requires_grad = False  # 冻结模型的参数,这样子在训练的时候只训练最后一层的参数

# 修改classifier模块的第6层(即:(6): Linear(in_features=4096, out_features=2, bias=True))
# 注意查看我们下方打印出来的模型
model.classifier = nn.Sequential(
            # 14
            nn.Linear(25088, 1024),
            nn.BatchNorm1d(1024),
            # nn.ReLU(True),
            nn.Dropout(0.4),
            # 15
            nn.Linear(1024, 128),
            nn.BatchNorm1d(128),
            # nn.ReLU(True),
            nn.Dropout(0.4),
            # 16
            nn.Linear(128, len(classeNames)),
            nn.Softmax()
        )
model.to(device)
print(model)

import torchsummary as summary
summary.summary(model, (3, 224, 224))


# 训练循环
def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)  # 训练集的大小
    num_batches = len(dataloader)  # 批次数目, (size/batch_size,向上取整)

    train_loss, train_acc = 0, 0  # 初始化训练损失和正确率

    for X, y in dataloader:  # 获取图片及其标签
        X, y = X.to(device), y.to(device)

        # 计算预测误差
        pred = model(X)  # 网络输出
        loss = loss_fn(pred, y)  # 计算网络输出和真实值之间的差距,targets为真实值,计算二者差值即为损失

        # 反向传播
        optimizer.zero_grad()  # grad属性归零
        loss.backward()  # 反向传播
        optimizer.step()  # 每一步自动更新

        # 记录acc与loss
        train_acc += (pred.argmax(1) == y).type(torch.float).sum().item()
        train_loss += loss.item()

    train_acc /= size
    train_loss /= num_batches

    return train_acc, train_loss


def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)  # 测试集的大小
    num_batches = len(dataloader)  # 批次数目
    test_loss, test_acc = 0, 0

    # 当不进行训练时,停止梯度更新,节省计算内存消耗
    with torch.no_grad():
        for imgs, target in dataloader:
            imgs, target = imgs.to(device), target.to(device)

            # 计算loss
            target_pred = model(imgs)
            loss = loss_fn(target_pred, target)

            test_loss += loss.item()
            test_acc += (target_pred.argmax(1) == target).type(torch.float).sum().item()

    test_acc /= size
    test_loss /= num_batches

    return test_acc, test_loss

import torch, gc

gc.collect()
torch.cuda.empty_cache()


import copy


learn_rate = 1e-4 # 初始学习率
lambda1 = lambda epoch: 0.92 ** (epoch // 10)
optimizer = torch.optim.Adam(model.parameters(), lr=learn_rate)
scheduler = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda=lambda1)

loss_fn    = nn.CrossEntropyLoss() # 创建损失函数

epochs = 40

train_loss = []
train_acc = []
test_loss = []
test_acc = []

best_acc = 0  # 设置一个最佳准确率,作为最佳模型的判别指标

for epoch in range(epochs):
    # 更新学习率(使用自定义学习率时使用)
    # adjust_learning_rate(optimizer, epoch, learn_rate)

    model.train()
    epoch_train_acc, epoch_train_loss = train(train_dl, model, loss_fn, optimizer)
    # scheduler.step() # 更新学习率(调用官方动态学习率接口时使用)

    model.eval()
    epoch_test_acc, epoch_test_loss = test(test_dl, model, loss_fn)

    # 保存最佳模型到 best_model
    if epoch_test_acc > best_acc:
        best_acc = epoch_test_acc
        best_model = copy.deepcopy(model)

    train_acc.append(epoch_train_acc)
    train_loss.append(epoch_train_loss)
    test_acc.append(epoch_test_acc)
    test_loss.append(epoch_test_loss)

    # 获取当前的学习率
    lr = optimizer.state_dict()['param_groups'][0]['lr']

    template = ('Epoch:{:2d}, Train_acc:{:.1f}%, Train_loss:{:.3f}, Test_acc:{:.1f}%, Test_loss:{:.3f}, Lr:{:.2E}')
    print(template.format(epoch + 1, epoch_train_acc * 100, epoch_train_loss,
                          epoch_test_acc * 100, epoch_test_loss, lr))

# 保存最佳模型到文件中
PATH = './best_model.pth'  # 保存的参数文件名
torch.save(model.state_dict(), PATH)

print('Done')

import matplotlib.pyplot as plt
#隐藏警告
import warnings
warnings.filterwarnings("ignore")               #忽略警告信息
plt.rcParams['font.sans-serif']    = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False      # 用来正常显示负号
plt.rcParams['figure.dpi']         = 100        #分辨率

epochs_range = range(epochs)

plt.figure(figsize=(12, 3))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, train_acc, label='Training Accuracy')
plt.plot(epochs_range, test_acc, label='Test Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, train_loss, label='Training Loss')
plt.plot(epochs_range, test_loss, label='Test Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

from PIL import Image

classes = list(total_data.class_to_idx)


from PIL import Image

classes = list(total_data.class_to_idx)


def predict_one_image(image_path, model, transform, classes):
    test_img = Image.open(image_path).convert('RGB')
    plt.imshow(test_img)  # 展示预测的图片

    test_img = transform(test_img)
    img = test_img.to(device).unsqueeze(0)

    model.eval()
    output = model(img)

    _, pred = torch.max(output, 1)
    pred_class = classes[pred]
    print(f'预测结果是:{pred_class}')

# 预测训练集中的某张照片
predict_one_image(image_path='./49-data/Green/green (9).png',
                  model=model,
                  transform=train_transforms,
                  classes=classes)

系统地学完只后,不仅会对深度学习有一定的理解与认识,也可以更进一步去深入地学习更多常用的模型,比如yolov5模型。

yolov5结构示意图
  yolov5结构示意图

当然也可以用亚马逊的资源构建自定义模型,Deep Learning AMI,种类非常多。当然需要破费一下。

深度学习常用GPU进行训练数据,并选择CPU进行学习预测或推断。这两者都可为您提供一个稳定、安全且高性能的执行环境。最后用生成的模型运行自己的程序。

同时,运行的时候也会涉及到优化器的选择,优化器是一种算法,它在模型优化过程中,动态地调整梯度的大小和方向,使模型能够收敛到更好的位置,或者用更快的速度进行收敛。

以梯度下降法 (Gradient Descent)举例:

我们可以把模型的参数空间想象成是一个曲面,曲面的高度是整体上模型预测值与真实值的误差。我们的目的就是找到整个曲面的最低点,这样我们其实就找到了模型参数的最优点。梯度下降法是最基本的优化算法之一,它让参数朝着梯度下降最大的方向去变化。

 假设模型参数为 θ,损失函数为 J(θ) ,损失函数 J(θ) 关于参数 θ 的偏导数,也就是梯度为 ▽θJ(θ) ,学习率为 α ,则使用梯度下降法更新参数的公式为:

 梯度下降算法中,沿着梯度的方向不断减小模型参数,从而最小化损失函数。基本策略可以理解为”在你目光所及的范围内,不断寻找最陡最快的路径下山

 算法缺点:
●训练速度慢:每走一步都要计算调整下一步的方向,下山的速度变慢。在应用于大型数据集中,每输入一个样本都要更新一次参数,且每次迭代都要遍历所有的样本。会使得训练过程及其缓慢,需要花费很长时间才能得到收敛解。
●容易陷入局部最优解:由于是在有限视距内寻找下山的方向。当陷入平坦的洼地,会误以为到达了山地的最低点,从而不会继续往下走。

 真正在使用时,主要是经过改进的以下三类方法,区别在于每次参数更新时计算的样本数据量不同:
●批量梯度下降法(BGD, Batch Gradient Descent)
●随机梯度下降法(SGD, Stochastic Gradient Descent)
●小批量梯度下降法(Mini-batch Gradient Descent)

更多优化器欢迎看我的文章,咱们一同交流。

最后,可以选择亚马逊云科技提供的收费架构,会极大方便训练的流程。但我建议小白还是一点一点先打好基础,从入门的pytorch架构入手,尝试自己搭建一个深度学习模型。
最后感谢亚马逊云科技AI团队的Dan Mbanga教授的授课。

总结

随着人工智能的蓬勃发展,行业对技术人员的要求越来越高了。其中本篇的深度学习便是人工智能领域的重要部分,深度学习的重要性在于它可以解决复杂的问题,比如计算机视觉、自然语言处理、语音识别等,这些问题在传统机器学习方法中很难解决。作为一名大学生,能很早地接触到有趣的人工智能课程我感到非常幸运。最后再次感谢亚马逊云科技平台提供的学习资料,深入浅出地介绍了深度学习,希望亚马逊云科技以后能提供更加优质的免费课程~

师傅领进门,修行靠个人。如果你是对人工智能与深度学习十分感兴趣的小白,我十分推荐这门课。

最后希望大家点点关注点点赞,我的主页有许多有关深度学习的文章,希望我们一同进步。

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

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

相关文章

Arch/Manjaro安装搜狗输入法

装好系统以后,没有输入法,只能打英文的感觉很难受,现在我们来看看如何给Arch系列的系统安装搜狗输入法。 加入Skype Linux群来这里一起解决问题吧!腾讯不支持Linux,让我们一起抛弃微信~ Join conversationhttps://join…

⌈ 2022杀青 ⌋ 一个普通人的年终总结,这一年我获得了更多的新鲜体验 | 普通而平凡的一年 | 向前走,走到光里 | 2023你好

💛年度总结💛 时间转瞬便是年末,在此写下告别 成长是一场踏实的幻灭 有哭有笑有酸有甜,失去与获得也同在 即使生活再忙,也不要忘记那些美好治愈我们的瞬间 起起伏伏的日子,这依然是很长很好的一年&…

python 爬虫 使用selenium 控制浏览器 进行搜索操作

首先需要安装selenium: 第一种:可以自己下载selenium tar.gz包,下载到python目录下:解压到当前文件夹 在cmd命令行:进入到解压包中,进行安装。安装完成之后,如果是eclipse中,请 clean project之…

APSIM练习3:氮循环

在本练习中,您将观察休耕情况下的氮肥循环;尿素转化为铵,铵转化为硝酸盐,以及土壤硝酸盐通过反硝化作用流失。此模拟将介绍编辑一个简单的管理器规则以及绘制模拟结果的更多高级功能。 开始基于 Continuous Wheat.apsim 的新模拟。…

【20221230】栈和队列的小结

一、栈(stack) 栈是先进后出的(FILO)的数据结构,它只有一个出口。 二、队列 队列是一种先进先出(FIFO)的数据结构,它有两个出口。 栈和队列是STL(C标准库)里面…

【攻防世界】Web easyupload

知识点讲解 本题的主要考点为利用fastcgi的.user.ini特性进行任意命令执行 关于.user.ini文件是怎么利用的,可以点此查看非常详细,我这里截取一段 .user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式为“PHP…

创作者身份认证申请规则及审核标准

当前创作者身份主要包括优质创作者、新星创作者、其他(特殊情况)。 有一些身份认证,比如:企业员工认证、学生认证等,不属于创作者身份认证范畴,申请的时候需要找到对应的认证进行申请(https://…

python【多态特性】

多态:同样的行为(函数),传入不同的对象,得到不同的状态 特点:通过继承的方式体验抽象动作相同而具体实现细节不同细节的特性 如,定义函数(方法),通过类型注…

NetInside帮助IT提高应用性能分析能力(一)

前言 某大学信息中心老师反应,用户反馈科研创新服务器平台有访问慢的情况,需要通过流量分析系统来了解系统的运行情况,此报告专门针对系统的性能数据做了分析。 信息中心已部署NetInside流量分析系统,使用流量分析系统提供实时和…

进销存管理系统哪个比较好?

在如今互联网的刺激之下,企业之间的竞争逐渐加剧,很多企业之所以会逐渐被市场淘汰,主要原因都来源于管理上的混乱,而进销存软件的出现可以帮助企业解决管理难题。 选择一款合适的省心的进销存软件,有效提升企业的核心…

Redis中缓存穿透、击穿、雪崩以及解决方案

缓存穿透 理解: 缓存穿透是指查询一个根本不存在的数据,缓存层和持久层都不会命中。在日常工作中出于容错的考虑,如果从持久层查不到数据则不写入缓存层,缓存穿透将导致不存在的数据每次请求都要到持久层去查询,失去…

【正点原子FPGA连载】第八章使用Vitis开发Linux应用摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第八章使用Vitis…

日本知名汽车零部件公司巡礼系列之株式会社140

株式会社140 业务内容: ・特殊切削工具汽车零件加工用特殊工具的设计、制作・特殊零件海斯、超硬、陶瓷、cBNCD工具的设计与制作・制造用夹具、安装用具、检查用具、定位用具、消耗工具等一制造装饰零件相关的装置或专用机的构成零件等・模具零件制作…钳子、模具…

Spring Boot整合MyBatis(保姆级教程)

前言 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objec…

【正点原子FPGA连载】第九章Linux图形界面的搭建摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id692450874670 3)全套实验源码手册视频下载地址: http://www.openedv.com/thread-340252-1-1.html 第九章Linux图形…

单片机之震动传感器、继电器、433M无线发射接收等模块介绍及应用

目录 一、震动传感器模块 二、继电器介绍 三、433M无线发射接收模块 1、 无线控制报警器代码 2、电动车简易防盗器代码实现 一、震动传感器模块 单片机供电VCC GND接单片机 产品不震动,输出高电平、模块上的AO口 产品震动,输出低电平&#xff0c…

Python使用库(一)

Python使用库 库 就是是别人已经写好了的代码, 可以让我们直接拿来用. 荀子曰: “君子性非异也,善假于物也” 一个编程语言能不能流行起来, 一方面取决于语法是否简单方便容易学习, 一方面取决于生态是否完备. 所谓的 “生态” 指的就是语言是否有足够丰富的库, 来…

day11-分类和static

1.案例驱动模式 1.1案例驱动模式概述 (理解) 通过我们已掌握的知识点,先实现一个案例,然后找出这个案例中,存在的一些问题,在通过新知识点解决问题 1.2案例驱动模式的好处 (理解) 解决重复代码过多的冗余,提高代码的复用性解决业务逻辑聚集紧密导致的可读性差,提高代码的可…

【python Turtle源码】教你如何画一只迎福虎将~

前言 大家早好、午好、晚好吖 ❤ ~ 代码展示 导入模块 from turtle import * import time因代码体量有点多 这里就给大家部分展示了,有需要的可以文章下方名片获取哦~ (或者评论已点赞收藏,求代码,我私你呀) COLO…

用Python实现童年小游戏贪吃蛇

贪吃蛇游戏是有史以来最受欢迎的街机游戏之一。在这个游戏中,玩家的主要目标是在不撞墙或不撞墙的情况下抓住最大数量的水果。在学习 Python 或 Pygame 时,可以将创建蛇游戏视为一项挑战。这是每个新手程序员都应该接受的最好的初学者友好项目之一。学习…