【深度学习】PyTorch深度学习实践 - Lecture_11_Advanced_CNN

news2025/1/19 23:02:36

文章目录

  • 一、GoogLe Net
    • 1.1 网络结构
    • 1.2 Inception Model
    • 1.3 1×1 Convolution
    • 1.4 PyTorch-GPU 实现 GoogLe Net
  • 二、Residual Net
    • 2.1 梯度消失和梯度爆炸
    • 2.2 残差模块
    • 2.3 PyTorch-GPU 实现 Simple Residual Net
      • 2.3.1 整体结构
      • 2.3.2 残差块对象
      • 2.3.3 残差网络对象
      • 2.3.4 完整代码
  • 三、课后作业
    • 3.1 实现不同结构的残差块
      • 3.1.1 Original
      • 3.1.2 Constant Scaling
      • 3.1.3 Exclusive Gating
      • 3.1.4 Shortcut-Only Gating
      • 3.1.5 Conv Shortcut
      • 3.1.6 Dropout Shortcut
    • 3.2 尝试实现 Densely Net
  • 四、后期学习


在CNN基础篇中介绍的CNN都是串行结构,而在实际应用中,还存在很多具有更复杂结构的CNN,例如存在分支、存在回溯等等,下面对一些具有复杂结构的CNN进行介绍。

一、GoogLe Net

1.1 网络结构

在这里插入图片描述

1.2 Inception Model

在这里插入图片描述

1.3 1×1 Convolution

什么是1×1的卷积核,有什么用?可以参考这篇文章 1*1卷积核的作用

总结一下:

  • 跨通道的特征整合
  • 特征通道的升维和降维
  • 减少卷积核参数(简化模型)
    在这里插入图片描述
    由下图可以看到,没有加1×1卷积核的网络结构将192×28×28的数据转化为32×28×28的数据的运算量为120422400,加了1×1卷积核的网络结构,同样是将192×28×28的数据转化为32×28×28的数据,运算量减少到了12433648,直接把运算量降低了一个数量级!!!
    (原理:通过1×1的卷积核首先对原始数据进行降维,即减少通道数)
    在这里插入图片描述

1.4 PyTorch-GPU 实现 GoogLe Net

Inception Net类的实现:
在这里插入图片描述
整体网络对象:
在这里插入图片描述
完整代码:

import torch
import torch.nn as nn
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.optim as optim
import torch.nn.functional as F


class InceptionA(nn.Module):
    def __init__(self, in_channels):
        super(InceptionA, self).__init__()
        self.branch1x1 = nn.Conv2d(in_channels, 16, kernel_size=(1, 1))

        self.branch5x5_1 = nn.Conv2d(in_channels, 16, kernel_size=(1, 1))
        self.branch5x5_2 = nn.Conv2d(16, 24, kernel_size=(5, 5), padding=(2, 2))

        self.branch3x3_1 = nn.Conv2d(in_channels, 16, kernel_size=(1, 1))
        self.branch3x3_2 = nn.Conv2d(16, 24, kernel_size=(3, 3), padding=(1, 1))
        self.branch3x3_3 = nn.Conv2d(24, 24, kernel_size=(3, 3), padding=(1, 1))

        self.branch_pool = nn.Conv2d(in_channels, 24, kernel_size=(1, 1))

    def forward(self, x):
        branch1x1 = self.branch1x1(x)

        branch5x5 = self.branch5x5_1(x)
        branch5x5 = self.branch5x5_2(branch5x5)

        branch3x3 = self.branch3x3_1(x)
        branch3x3 = self.branch3x3_2(branch3x3)
        branch3x3 = self.branch3x3_3(branch3x3)

        branch_pool = F.avg_pool2d(x, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
        branch_pool = self.branch_pool(branch_pool)

        outputs = [branch1x1, branch5x5, branch3x3, branch_pool]
        return torch.cat(outputs, dim=1)


class GoogLeNet(torch.nn.Module):
    def __init__(self):
        super(GoogLeNet, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=(5, 5))
        self.conv2 = nn.Conv2d(88, 20, kernel_size=(5, 5))

        self.incep1 = InceptionA(in_channels=10)
        self.incep2 = InceptionA(in_channels=20)

        self.mp = nn.MaxPool2d(kernel_size=(2, 2))
        self.fc = nn.Linear(1408, 10)

    def forward(self, x):
        in_size = x.size(0)
        x = torch.relu(self.mp(self.conv1(x)))
        x = self.incep1(x)
        x = torch.relu(self.mp(self.conv2(x)))
        x = self.incep2(x)
        x = x.view(in_size, -1)
        x = self.fc(x)
        return x


# 单次训练函数
def train(epoch, criterion):
    running_loss = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        inputs, target = data
        # 将inputs, target转移到Gpu或者Cpu上
        inputs, target = inputs.to(device), target.to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if batch_idx % 300 == 299:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))
            running_loss = 0.0


# 单次测试函数
def ttt():
    correct = 0.0
    total = 0.0
    with torch.no_grad():
        for data in test_loader:
            images, labels = data
            # 将images, labels转移到Gpu或者Cpu上
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print('Accuracy on test set: %d %% [%d/%d]' % (100 * correct / total, correct, total))


if __name__ == '__main__':
    batch_size = 64
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
    train_dataset = datasets.MNIST(root='../dataset/', train=True, download=True, transform=transform)

    train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)

    test_dataset = datasets.MNIST(root='../dataset/', train=False, download=True, transform=transform)
    test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)

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

    # 声明模型
    model = GoogLeNet()
    # 将模型转移道Gpu或者Cpu上
    model.to(device)
    # 定义损失函数
    criterion = torch.nn.CrossEntropyLoss()
    # 定义优化器
    optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

    for epoch in range(10):
        train(epoch, criterion)
        ttt()

输出:

[1,   300] loss: 0.980
[1,   600] loss: 0.199
[1,   900] loss: 0.137
Accuracy on test set: 95 % [9581/10000]
[2,   300] loss: 0.104
[2,   600] loss: 0.090
[2,   900] loss: 0.092
Accuracy on test set: 97 % [9791/10000]
[3,   300] loss: 0.081
[3,   600] loss: 0.065
[3,   900] loss: 0.069
Accuracy on test set: 98 % [9806/10000]
[4,   300] loss: 0.068
[4,   600] loss: 0.058
[4,   900] loss: 0.057
Accuracy on test set: 98 % [9843/10000]
[5,   300] loss: 0.048
[5,   600] loss: 0.056
[5,   900] loss: 0.053
Accuracy on test set: 98 % [9869/10000]
[6,   300] loss: 0.049
[6,   600] loss: 0.043
[6,   900] loss: 0.048
Accuracy on test set: 98 % [9856/10000]
[7,   300] loss: 0.043
[7,   600] loss: 0.045
[7,   900] loss: 0.040
Accuracy on test set: 98 % [9871/10000]
[8,   300] loss: 0.035
[8,   600] loss: 0.042
[8,   900] loss: 0.040
Accuracy on test set: 98 % [9881/10000]
[9,   300] loss: 0.035
[9,   600] loss: 0.036
[9,   900] loss: 0.038
Accuracy on test set: 98 % [9884/10000]
[10,   300] loss: 0.034
[10,   600] loss: 0.032
[10,   900] loss: 0.036
Accuracy on test set: 99 % [9900/10000]

二、Residual Net

2.1 梯度消失和梯度爆炸

随着网络层数的增加,反向传播的过程也会变长,如果梯度小于1,在漫长的反向传播过程中,梯度不断连乘,最终在网络的入口附近会得到非常小、接近于0的数,使得网络入口附近的节点没有办法得到更新,我们称之为梯度消失或者梯度弥散

同理,如果梯度大于1,在漫长的反向传播过程中,梯度不断连乘,最终在网络的入口附近会得到非常大的数,使得网络入口附近的节点得到“不切实际的更新”,我们称之为梯度爆炸

梯度消失梯度爆炸现象的出现,意味着加深网络层数,不能很好地提高模型的识别准确度,甚至还会导致网络识别能力下降
在这里插入图片描述

2.2 残差模块

为了缓解梯度消失、梯度爆炸的问题,残差网络(Residual Net)引入了特有的残差模块。

残差模块中,输入会和输出建立一个“跳跃连接”,有了跳连接之后,原本的输出就变为了
H ( x ) = F ( x ) + x H(x)=F(x)+x Hx=Fx+x 这样对其求偏导,当F对x的偏导值较小时,就可以将梯度稳定在1附近,缓解了梯度消失和梯度爆炸的现象

注意:跳连接的出口是在relu之前
在这里插入图片描述在这里插入图片描述

2.3 PyTorch-GPU 实现 Simple Residual Net

2.3.1 整体结构

在这里插入图片描述

2.3.2 残差块对象

在这里插入图片描述

2.3.3 残差网络对象

在这里插入图片描述

2.3.4 完整代码

import torch
import torch.nn as nn
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.optim as optim
import torch.nn.functional as F


class ResidualBlock(nn.Module):
    def __init__(self, in_channels):
        super(ResidualBlock, self).__init__()
        self.in_channels = in_channels
        self.conv1 = nn.Conv2d(in_channels,in_channels,kernel_size=(3,3),padding=(1,1))
        self.conv2 = nn.Conv2d(in_channels,in_channels,kernel_size=(3,3),padding=(1,1))

    def forward(self, x):
        y = torch.relu(self.conv1(x))
        y = self.conv2(x)
        return torch.relu(x+y)

class ResidualNet(torch.nn.Module):
    def __init__(self):
        super(ResidualNet, self).__init__()
        self.conv1 = nn.Conv2d(1,16,kernel_size=(5,5))
        self.conv2 = nn.Conv2d(16,32,kernel_size=(5,5))

        self.mp = nn.MaxPool2d(kernel_size=(2,2))
        
        self.res_block1 = ResidualBlock(16)
        self.res_block2 = ResidualBlock(32)

        self.fc = nn.Linear(512,10)

    def forward(self, x):
        in_size = x.size(0)
        x = self.res_block1(self.mp(torch.relu(self.conv1(x))))
        x = self.res_block2(self.mp(torch.relu(self.conv2(x))))
        x = x.view(in_size,-1)
        x = self.fc(x)
        return x

# 单次训练函数
def train(epoch, criterion):
    running_loss = 0.0
    for batch_idx, data in enumerate(train_loader, 0):
        inputs, target = data
        # 将inputs, target转移到Gpu或者Cpu上
        inputs, target = inputs.to(device), target.to(device)
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, target)
        loss.backward()
        optimizer.step()
        running_loss += loss.item()
        if batch_idx % 300 == 299:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, running_loss / 300))
            running_loss = 0.0


# 单次测试函数
def ttt():
    correct = 0.0
    total = 0.0
    with torch.no_grad():
        for data in test_loader:
            images, labels = data
            # 将images, labels转移到Gpu或者Cpu上
            images, labels = images.to(device), labels.to(device)
            outputs = model(images)
            _, predicted = torch.max(outputs.data, dim=1)
            total += labels.size(0)
            correct += (predicted == labels).sum().item()
    print('Accuracy on test set: %d %% [%d/%d]' % (100 * correct / total, correct, total))


if __name__ == '__main__':
    batch_size = 64
    transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))])
    train_dataset = datasets.MNIST(root='../dataset/', train=True, download=True, transform=transform)

    train_loader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size)

    test_dataset = datasets.MNIST(root='../dataset/', train=False, download=True, transform=transform)
    test_loader = DataLoader(test_dataset, shuffle=False, batch_size=batch_size)

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

    # 声明模型
    model = ResidualNet()
    # 将模型转移道Gpu或者Cpu上
    model.to(device)
    # 定义损失函数
    criterion = torch.nn.CrossEntropyLoss()
    # 定义优化器
    optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)

    for epoch in range(10):
        train(epoch, criterion)
        ttt()

输出:

[1,   300] loss: 0.471
[1,   600] loss: 0.143
[1,   900] loss: 0.104
Accuracy on test set: 97 % [9732/10000]
[2,   300] loss: 0.084
[2,   600] loss: 0.071
[2,   900] loss: 0.067
Accuracy on test set: 98 % [9833/10000]
[3,   300] loss: 0.055
[3,   600] loss: 0.054
[3,   900] loss: 0.058
Accuracy on test set: 98 % [9880/10000]
[4,   300] loss: 0.045
[4,   600] loss: 0.042
[4,   900] loss: 0.048
Accuracy on test set: 98 % [9860/10000]
[5,   300] loss: 0.038
[5,   600] loss: 0.039
[5,   900] loss: 0.037
Accuracy on test set: 99 % [9900/10000]
[6,   300] loss: 0.030
[6,   600] loss: 0.035
[6,   900] loss: 0.034
Accuracy on test set: 98 % [9884/10000]
[7,   300] loss: 0.027
[7,   600] loss: 0.028
[7,   900] loss: 0.034
Accuracy on test set: 99 % [9901/10000]
[8,   300] loss: 0.029
[8,   600] loss: 0.025
[8,   900] loss: 0.023
Accuracy on test set: 99 % [9900/10000]
[9,   300] loss: 0.021
[9,   600] loss: 0.021
[9,   900] loss: 0.027
Accuracy on test set: 98 % [9887/10000]
[10,   300] loss: 0.019
[10,   600] loss: 0.023
[10,   900] loss: 0.021
Accuracy on test set: 98 % [9886/10000]

三、课后作业

3.1 实现不同结构的残差块

参考论文2016-《Identity Mappings in Deep Residual Networks》,复现论文中提出的几种残差块

3.1.1 Original

原始残差块
在这里插入图片描述

class OriginalResidualBlock(nn.Module):
    def __init__(self, in_channels):
        super(OriginalResidualBlock, self).__init__()
        self.in_channels = in_channels
        self.conv1 = nn.Conv2d(in_channels,in_channels,kernel_size=(3,3),padding=(1,1))
        self.conv2 = nn.Conv2d(in_channels,in_channels,kernel_size=(3,3),padding=(1,1))

    def forward(self, x):
        y = torch.relu(self.conv1(x))
        y = self.conv2(x)
        return torch.relu(x+y)

3.1.2 Constant Scaling

恒定放缩残差块
在这里插入图片描述

class ConstantScalingResidualBlock(nn.Module):
    def __init__(self, in_channels):
        super(ConstantScalingResidualBlock, self).__init__()
        self.in_channels = in_channels
        self.conv1 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.conv2 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))

    def forward(self, x):
        y = torch.relu(self.conv1(x))
        y = self.conv2(x)
        return torch.relu(0.5 * (x + y))

3.1.3 Exclusive Gating

独家门控残差块
在这里插入图片描述

class ExclusiveGatingResidualBlock(nn.Module):
    def __init__(self, in_channels):
        super(ExclusiveGatingResidualBlock, self).__init__()
        self.in_channels = in_channels
        self.conv3x3_1 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.conv3x3_2 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.conv1x1 = nn.Conv2d(in_channels, in_channels, kernel_size=(1, 1))

    def forward(self, x):
        y1 = self.conv1x1(x) * self.conv3x3_2(torch.relu(self.conv3x3_1(x)))

        y2 = (1 - torch.sigmoid(self.conv1x1(x))) * x

        return torch.relu(y1 + y2)

3.1.4 Shortcut-Only Gating

仅捷径走通残差块
在这里插入图片描述

class ShortcutOnlyGatingResidualBlock(nn.Module):
    def __init__(self, in_channels):
        super(ShortcutOnlyGatingResidualBlock, self).__init__()
        self.in_channels = in_channels
        self.conv3x3_1 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.conv3x3_2 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.conv1x1 = nn.Conv2d(in_channels, in_channels, kernel_size=(1, 1))

    def forward(self, x):
        y1 = self.conv3x3_2(torch.relu(self.conv3x3_1(x)))

        y2 = (1 - torch.sigmoid(self.conv1x1(x))) * x

        return torch.relu(y1 + y2)

3.1.5 Conv Shortcut

卷积快捷方式残差块
在这里插入图片描述

class ConvShortcutResidualBlock(nn.Module):
    def __init__(self, in_channels):
        super(ConvShortcutResidualBlock, self).__init__()
        self.in_channels = in_channels
        self.conv3x3_1 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.conv3x3_2 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.conv1x1 = nn.Conv2d(in_channels, in_channels, kernel_size=(1, 1))

    def forward(self, x):
        y1 = self.conv3x3_2(torch.relu(self.conv3x3_1(x)))

        y2 = self.conv1x1(x)

        return torch.relu(y1 + y2)

3.1.6 Dropout Shortcut

丢弃捷径残差块
在这里插入图片描述

class DropoutShortcutResidualBlock(nn.Module):
    def __init__(self, in_channels):
        super(DropoutShortcutResidualBlock, self).__init__()
        self.in_channels = in_channels
        self.conv3x3_1 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.conv3x3_2 = nn.Conv2d(in_channels, in_channels, kernel_size=(3, 3), padding=(1, 1))
        self.dropout = nn.Dropout(0.5)  # 以0.5的概率失活

    def forward(self, x):
        y1 = self.conv3x3_2(torch.relu(self.conv3x3_1(x)))

        y2 = self.dropout(x)

        return torch.relu(y1 + y2)

3.2 尝试实现 Densely Net

参考论文《Densely Connected Convolutional Networks》

【论文阅读及复现】(2017)Densely Connected Convolutional Networks + Pytorch代码实现

在这里插入图片描述

四、后期学习

在这里插入图片描述

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

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

相关文章

微服务框架 SpringCloud微服务架构 分布式事务 38 动手实践 38.7 案例实现TCC 模式【分析】

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 分布式事务 文章目录微服务框架分布式事务38 动手实践38.7 案例实现TCC 模式【分析】38.7.1 实现TCC 模式38.7.2 TCC 的空回滚 和业务悬挂38…

Redis框架(八):大众点评项目 逻辑过期时间处理缓存击穿

大众点评项目 逻辑过期时间处理缓存击穿需求:逻辑过期时间处理缓存击穿业务实现总结SpringCloud章节复习已经过去,新的章节Redis开始了,这个章节中将会回顾Redis实战项目 大众点评 主要依照以下几个原则 基础实战的Demo和Coding上传到我的代…

七分钟教会你如何编写一个合格的测试用例

目录 1、测试用例的基本要素 2、根据测试用例去测试带来的好处 3、测试用例的设计方法 3.1、等价类 3.2、边界值 3.3、错误猜测法 3.4、场景法 3.5、因果图法 3.6、正交排列 4、怎样判断一个测试用例是好的测试用例 1、测试用例的基本要素 测试用例是为了实施测试而向…

基于LEACH和HEED的WSN路由协议研究与改进(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

Google谷歌浏览器Post请求预见strict-origin-when-cross-origin跨域问题的 解决办法

问题概述 关于这个问题,后端接口开发完成,前端功能界面和函数方法体编写完成后,博主在前后端联调的时候遇到的,接口是调用成功了,但是没有返回任何结果, 错误信息:“ Referrer Policy: strict-…

C++中二叉树的非递归遍历方法2-1

1 二叉树简介 树是一种数学上的抽象,在算法的设计与分析中起到一个中心作用。树是有n个节点的有限集合。二叉树是树的一种特殊形式,这种树的每个节点最多有2个子节点。 2 二叉树的遍历方法 二叉树的遍历分为前序遍历、中序遍历、后序遍历和层序遍历四…

【华为上机真题 2022】寻找身高相近的小朋友

🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊! &…

力扣(LeetCode)147. 对链表进行插入排序(C++)

排序 ①遍历链表,当前遍历的结点记作 ppp 。 ②从前往后遍历链表,找到最后一个值小于 ppp 的结点 curcurcur 。 ③(关键操作) 插入,如图,将 ppp 插入 curcurcur 的后面。 p->next cur->next; cur->next p; p next;…

关于Mac启动人人开源前端项目遇到node-sass下载不了的问题!

今天在网上看到了一个前后端分离用户管理系统,于是心血来潮下载下来看一看,结果发现前端项目中用Mac开发的话坑比较多 1.关于node版本问题 node版本最好不要太高,我对于该项目使用的node版本是v10.16.3 node版本最好使用nvm来管理&#xff0c…

[附源码]Python计算机毕业设计Django的图书互换系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

java基于springboot的在线电影评论投票系统

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代…

可以提高开发效率的vscode插件

1,koroFileHeader 我们在新建一个文件后,常常需要在文件头部加入默认注释,vscode中提供了一个 的插件,可以帮助我们实现。 1.1,安装插件 在vscode extensions中搜索并按照koroFileHeader 插件 installl完成后&…

大数据-HDFS的Shell操作

一、了解HDFS常用Shell命令 1、三种Shell命令方式 命令适用场合hadoop fs适用于任何不同的文件系统,比如本地文件系统和HDFS文件系统hadoop dfs只能适用于HDFS文件系统hdfs dfshdfs dfs跟hadoop dfs的命令作用一样,也只能适用于HDFS文件系统 2、常用HD…

基于C+++Mysql实现(WinForm)图书管理系统【100010034】

图书管理系统 实验内容、步骤以及结果 做出数据流图和数据字典。 在数据流图和字典的基础上做出 E-R 图(概念结构设计)。 学生: 图书: 管理员: 汇总: 在 E-R 图基础上进行关系模式设计(至少满足 3NF)&am…

b站黑马的Vue快速入门案例代码——计数器

目录 目标效果: 重点原理: 1.创建Vue实例的时候: 2.v-on——为元素绑定事件 3.v-text——【解析文本用】设置标签的文本值 v-text【简写】为{{}} 实现步骤: 代码部分: 1.计数器模板.html(全是重点&#xf…

【Redis缓存】主从、哨兵、 Cluster集群一锅端,一文带你全了解

Redis主从Redis哨兵Redis Cluster集群公众号:捡田螺的小男孩 \1. Redis 主从 面试官经常会问到Redis的高可用。Redis高可用回答包括两个层面,一个就是数据不能丢失,或者说尽量减少丢失;另外一个就是保证Redis服务不中断。 对于尽量减少数据…

KKALRRQETVDAL,129198-88-5,钙调蛋白激酶底物

Autocamtide 2是钙/钙调蛋白依赖的蛋白激酶II (CaMKII)的高选择性肽底物。 它可以用于测定CaMKII的活力。Autocamtide 2 is a highly selective peptide substrate of calcium/calmodulin-dependent protein kinase II (CaMKII). It can be used in the CaMKII activity assay.…

被天空盒裁剪

一般来说天空盒都是在最后一层,最近发现一个天空盒裁剪的问题 距离放的太远了被裁剪了。 经研究发现是因为平时因为怕摄像机近截面裁剪到近距离的物品,习惯改成0.然后系统会自动改成0.01 只要改成大于0.01的值就可以了,比如默认的0.3.就会…

web网页设计期末课程大作业:旅游网页主题网站设计——中国风的温泉酒店预订网(13页)HTML+CSS+JavaScript

👨‍🎓学生HTML静态网页基础水平制作👩‍🎓,页面排版干净简洁。使用HTMLCSS页面布局设计,web大学生网页设计作业源码,这是一个不错的旅游网页制作,画面精明,排版整洁,内容…

中高频多因子库存储最佳实践

1. 概述 因子挖掘是量化交易的基础。随着量化交易竞争的加剧,量化投资团队需要处理大量因子。在许多情况下,因子数据量甚至会远远超过高频的行情数据量。以 5,000 只股票 10,000 个因子为例,一年的 10 分钟线数据量为 2.3TB,1分钟…