深度学习 | 基本循环神经网络

news2024/9/25 13:21:50


1、序列建模

1.1、序列数据

        序列数据 —— 时间

        不同时间上收集到的数据,描述现象随时间变化的情况。

        序列数据 —— 文本

        由一串有序的文本组成的序列,需要进行分词。

                

        序列数据 —— 图像

        有序图像组成的序列,后一帧图像可能会受前一帧的影响

                

1.2、序列模型

        Sequence Model:用于处理和预测序列数据的模型

1.2.1、自回归模型 AR模型

        

1.2.2、隐变量自回归模型        

        RNN属于隐变量自回归模型。

        防止 history 过长。

        动态变化的隐变量链也称为隐变量动态模型。

        



2、文本数据预处理

主要流程

        中文文本需要用分词算法来完成分词;

        英文文本需要拼写检查、词干提取词形还原。

        分词 也叫 词元化。

        

②、去除噪声 Text Cleaning

        删除文本中不相关或者无用的信息,提高文本处理的效率,

        非文本内容可直接使用re表达式进行删除。

        停用词:英文介词、代词、连词等,中文助词、量词、叹词等。

        

③、词元化 / 分词 / 令牌化 Tokenization

        把输入的文本流,切分成一个个子串。

④、去除停用词

        文本中出现频率过高或者并不具有实际意义的词。

⑤、标准化 主要针对英文

        词干提取 (stemming):抽取词的词干或词根形式

        词形还原(lemmatization) :把任何形式语言词汇还原为一般形式

⑥、构造词表

        将文本中出现的所有词汇组成列表

        1、遍历数据集,统计词频

        2、过滤高频词和低频词,保留中间频率词

        3、为每个词分配一个编号,并建立词表

 ⑦、特征提取 

*** 存疑

        词袋模型 ,不考虑每个单词的顺序,只是统计每个词出现的次数。

                Bag of Words:根据词表中单词在句子中出现次数转化为向量。

                —— 然后对这样的一个 矩阵/数组/列表 进行编码就可以对他进行向量化了。

                

        N-gram模型:基于概率的判别式语言模型,可以捕捉到词与词之间的关系。

                将文本表示成连续的n个词的序列。

                

        词嵌入 Word Embedding:是将词表现为实数向量的一种方法,可以捕捉到词和词之间的语义和语法关系,使得词之间可以通过数学计算进行比较和计算。

        常用的词嵌入模型包括:

                word2vec:通过预测上下文中的词来学习词向量。

                GloVe:通过统建词和词之间的贡献的关系。

                



3、循环神经网络 Recurrent Neura Network

        为什么全连接网络处理不好序列的数据?

        因为全连接网络结构上就没有顺序相关的这种处理模块。


3.1、展开计算图

         计算图是形式化一组计算结构的形式。

         展开 (unfolding)计算图导致深度网络结构中的参数共享。

         箭头表示信息流动,小黑方块表示一种计算关系。

        


3.2、网络结构及变体

网络结构

        在隐藏层之间构建了循环层。

        

        红色小球代表输入数据。每一行的网络都可以看成一个完整的全连接层。

        U 是当前时间步的输入到隐藏层的一个权重;

        W 是上一个时间步的隐藏状态再到当前隐藏状态的一个权重;

        V 是隐藏层到输出层的权重。

        

        正是因为有了隐藏层之间黄色的连线,隐藏层间连接形成循环神经网络,模型由此具备了记忆能力。

        不是网络结构更加复杂了,只是把不同时间隐藏层的状态记住了,换句话说就是不同的隐藏层之间共享W。

        

        若从隐藏层的变换函数来说,就是多了一个方向的输入。

        

        换个表示方式:

                h 是隐藏层的状态,L 是输出的损失,y 是训练目标,通过计算 y 和 o 之间的误差 L 来训练整个网络。

                三组权重参数 U V W 一起训练。

        


网络结构变体

3.2.1、free-running mode

        训练迭代过程早期的RNN预测能力非常弱,几乎不能给出好的生成结果。如果某一个unit产生了垃圾结果,必然会影响后面一片unit的学习。 

        因为没有从 h t-1向前传播的直接链接,信息是通过 h t-1 产生的预测间接的链接到当前的隐藏层变量 ht,

        这使得RNN网络结构简化,相对来说更容易训练,这是因为每个时间步可以与其他时间步进行分离训练,允许训练期间有更多的并行化。

        

其实RNN存在着两种训练模式(mode):

        free-running mode
         teacher-forcing mode

        free-running mode就是大家常见的那种训练网络的方式:上一个state的输出作为下一个state的输入。

        而Teacher Forcing是一种快速有效地训练循环神经网络模型的方法,该模型使用来自先验时间步长的输出作为输入。


3.2.2、Teacher Forcing

        Teacher Forcing是一种快速有效地训练循环神经网络模型的方法,该模型使用来自先验时间步长的输出作为输入。

        它是一种网络训练方法,对于开发用于机器翻译,文本摘要,图像字幕的深度学习语言模型以及许多其他应用程序至关重要。它每次不使用上一个state的输出作为下一个state的输入,而是直接使用训练数据的标准答案(ground truth)的对应上一项作为下一个state的输入。

        因为依赖标签数据,相当于解耦了,在训练过程中,模型会有较好的效果,但是在测试的时候因为不能得到ground truth的支持,所以如果目前生成的序列在训练过程中有很大不同,模型就会变得脆弱。

        也就是说,这种模型的cross-domain能力会更差,也就是如果测试数据集与训练数据集来自不同的领域,模型的performance就会变差。

         



*** 存疑

4、RNN的反向传播 —— BPTT 随时间反向传播算法

        RNN的反向传播称为 BPTT算法。回到过去改变权重。

        Backpropagation Through Time:将序列数据的每个时间步看作一层,然后在每个时间步上使用标准 BP 算法来计算梯度。

        

        对于每一个时间步 t  ,计算损失函数对网络参数的梯度 L(t),

        并将这些梯度的值累加起来得到总的损失:

        然后通过计算总损失的偏导数来更新网络参数。

        对于每一个节点 N ,我们需要 N 自己的 和 N 后面的所有的节点的梯度递归的计算 N 的 梯度:

        因为 L = L1+L2+L3+...+Lt,所以

        因为L^{(t)} = y_{t}-\hat{y}_{t},他们之间的差我们通常会用交叉熵损失衡量,

                采用负对数似然做损失,其中 \hat{y}_{t} = softmax(o_{t})

        则,其中 1 是真值矩阵。

        从序列的末尾开始,反向递归计算各个部分各个节点以及他们参数的偏导,这就是BPTT的目标了。

        首先我们来看它的末尾。

        最后一步 假如是 时间 τ,所以只需要对 o (τ) 求偏导数就可以了。

        根据输出方程,得出

        再来看 ht:

                

        

                 

        

整体流程:

        1、训练数据前向传播

                

        2、计算各时间预测值 y hat 与训练值比较,计算总损失 L

                

                

        3、反向传播求各个参数的梯度

                

                

        4、根据梯度更新参数

                



5、循环神经网络代码实现

5.1、时间序列数据预测

1、数据集引入

import pandas_datareader as pdr
gs10 = pdr.get_data_fred('GS10')
gs10.head()
GS10
DATE
2018-02-012.86
2018-03-012.84
2018-04-012.87
2018-05-012.98
2018-06-012.91

绘制数据图像

import matplotlib.pyplot as plt
plt.plot(gs10)
plt.show()

序列数据没办法直接使用,需要进行预处理。

        对原始数据进行切分。

        n 是超参数。用多少个去预测下一个元素。

        

2、数据预处理

初始化特征序列,列数就是预测序列的长度 seq,行数是 n - seq。

行数不是 n 的原因是因为最初的几条信息无法用来构建数据集,他们缺失了更早的时序信息。

import torch
from torch.utils.data import DataLoader, TensorDataset

num = len(gs10)                           # 总数据量
x = torch.tensor(gs10['GS10'].to_list())  # 股价列表
seq_len = 6                               # 预测序列长度
batch_size = 4                            # 设置批大小

X_feature = torch.zeros((num - seq_len, seq_len))      # 全零初始化特征矩阵,num-seq_len行,seq_len列
for i in range(seq_len):
    X_feature[:, i] = x[i: num - seq_len + i]    # 为特征矩阵赋值
y_label = x[seq_len:].reshape((-1, 1))           # 真实结果列表

train_loader = DataLoader(TensorDataset(X_feature[:num-seq_len], 
    y_label[:num-seq_len]), batch_size=batch_size, shuffle=True)  # 构建数据加载器
train_loader.dataset[:batch_size]
(tensor([[2.8600, 2.8400, 2.8700, 2.9800, 2.9100, 2.8900],
         [2.8400, 2.8700, 2.9800, 2.9100, 2.8900, 2.8900],
         [2.8700, 2.9800, 2.9100, 2.8900, 2.8900, 3.0000],
         [2.9800, 2.9100, 2.8900, 2.8900, 3.0000, 3.1500]]),
 tensor([[2.8900],
         [3.0000],
         [3.1500],
         [3.1200]]))


先用  基本神经网络模型 看看效果:

3、构建基本神经网络模型

from torch import nn
from tqdm import *

class Model(nn.Module):
    def __init__(self, input_size, output_size, num_hiddens):
        super().__init__()
        self.linear1 = nn.Linear(input_size, num_hiddens)
        self.linear2 = nn.Linear(num_hiddens, output_size)

    
    def forward(self, X):
        output = torch.relu(self.linear1(X))
        output = self.linear2(output)
        return output

# 定义超参数
input_size = seq_len
output_size = 1
num_hiddens = 10  
lr = 0.01

# 建立模型
model = Model(input_size, output_size, num_hiddens)
criterion = nn.MSELoss(reduction='none')
trainer = torch.optim.Adam(model.parameters(), lr)

4、模型训练

num_epochs = 20
loss_history = []

for epoch in tqdm(range(num_epochs)):
    # 批量训练
    for X, y in train_loader:
        trainer.zero_grad()
        y_pred = model(X)
        loss = criterion(y_pred, y)
        loss.sum().backward()
        trainer.step()
     # 输出损失
    model.eval()
    with torch.no_grad():
        total_loss = 0
        for X, y in train_loader:
            y_pred = model(X)
            loss = criterion(y_pred, y)
            total_loss += loss.sum()/loss.numel()
        avg_loss = total_loss / len(train_loader)
        print(f'Epoch {epoch+1}: Validation loss = {avg_loss:.4f}')
        loss_history.append(avg_loss)
    
# 绘制损失和准确率的曲线图
import matplotlib.pyplot as plt
plt.plot(loss_history, label='loss')
plt.legend()
plt.show()
100%|██████████| 20/20 [00:00<00:00, 130.13it/s]
Epoch 1: Validation loss = 0.7089
Epoch 2: Validation loss = 0.4812
Epoch 3: Validation loss = 0.2999
Epoch 4: Validation loss = 0.2695
Epoch 5: Validation loss = 0.2106
Epoch 6: Validation loss = 0.2270
Epoch 7: Validation loss = 0.1922
Epoch 8: Validation loss = 0.1899
Epoch 9: Validation loss = 0.1816
Epoch 10: Validation loss = 0.1578
Epoch 11: Validation loss = 0.1442
Epoch 12: Validation loss = 0.1734
Epoch 13: Validation loss = 0.1430
Epoch 14: Validation loss = 0.1842
Epoch 15: Validation loss = 0.1331
Epoch 16: Validation loss = 0.1289
Epoch 17: Validation loss = 0.1232
Epoch 18: Validation loss = 0.1135
Epoch 19: Validation loss = 0.1444
Epoch 20: Validation loss = 0.1159

 5、模型预测

单步预测:使用序列模型对序列数据进行预测,只预测序列的下一个元素。

preds = model(X_feature)
time = torch.arange(1, num+1, dtype= torch.float32)  # 时间轴

plt.plot(time[:num-seq_len], gs10['GS10'].to_list()[seq_len:num], label='gs10')
plt.plot(time[:num-seq_len], preds.detach().numpy(), label='preds')
plt.legend()
plt.show()


5.2、RNN模型预测

1、数据预处理

        一般神经网络模型结构如下: N to 1

        

        循环神经网络模型结构如下:N to N

        

       此时模型输出不再是一个简单的标量,而是x2到x7这样一个向量。

        Y_label变成了一个矩阵。

        为了使用RNN进行计算,需要对  X_feature 进行升维操作。

import torch
from torch.utils.data import DataLoader, TensorDataset

num = len(gs10)                           # 总数据量,59
x = torch.tensor(gs10['GS10'].to_list())  # 股价列表
seq_len = 6                               # 预测序列长度
batch_size = 4                            # 设置批大小

X_feature = torch.zeros((num - seq_len, seq_len))      # 构建特征矩阵,num-seq_len行,seq_len列,初始值均为0
Y_label = torch.zeros((num - seq_len, seq_len))        # 构建标签矩阵,形状同特征矩阵
for i in range(seq_len):
    X_feature[:, i] = x[i: num - seq_len + i]    # 为特征矩阵赋值
    Y_label[:, i] = x[i+1: num - seq_len + i + 1]    # 为标签矩阵赋值

train_loader = DataLoader(TensorDataset(
    X_feature[:num-seq_len].unsqueeze(2), Y_label[:num-seq_len]),
    batch_size=batch_size, shuffle=True)  # 构建数据加载器
train_loader.dataset[:batch_size]
(tensor([[[2.8600],
          [2.8400],
          [2.8700],
          [2.9800],
          [2.9100],
          [2.8900]],
 
         [[2.8400],
          [2.8700],
          [2.9800],
          [2.9100],
          [2.8900],
          [2.8900]],
 
         [[2.8700],
          [2.9800],
          [2.9100],
          [2.8900],
          [2.8900],
          [3.0000]],
 
         [[2.9800],
          [2.9100],
          [2.8900],
          [2.8900],
          [3.0000],
          [3.1500]]]),
 tensor([[2.8400, 2.8700, 2.9800, 2.9100, 2.8900, 2.8900],
         [2.8700, 2.9800, 2.9100, 2.8900, 2.8900, 3.0000],
         [2.9800, 2.9100, 2.8900, 2.8900, 3.0000, 3.1500],
         [2.9100, 2.8900, 2.8900, 3.0000, 3.1500, 3.1200]]))

2、构建循环神经网络模型

from torch import nn
from tqdm import *

class RNNModel(nn.Module):
    def __init__(self, input_size, output_size, num_hiddens, n_layers):
        super(RNNModel, self).__init__()
        self.num_hiddens = num_hiddens
        self.n_layers = n_layers
        self.rnn = nn.RNN(input_size, num_hiddens, n_layers, batch_first = True)
        self.linear = nn.Linear(num_hiddens, output_size)
       
    def forward(self, X):
        batch_size = X.size(0)
        state = self.begin_state(batch_size)
        output, state = self.rnn(X, state)
        output = self.linear(torch.relu(output))
        return output, state

    def begin_state(self, batch_size=1):
        return  torch.zeros(self.n_layers, batch_size, self.num_hiddens)

# 定义超参数
input_size = 1
output_size = 1
num_hiddens = 10
n_layers = 1
lr = 0.01

# 建立模型
model = RNNModel(input_size, output_size, num_hiddens, n_layers)
criterion = nn.MSELoss(reduction='none')
trainer = torch.optim.Adam(model.parameters(), lr)

3、训练

num_epochs = 20
rnn_loss_history = []

for epoch in tqdm(range(num_epochs)):
    # 批量训练
    for X, Y in train_loader:
        trainer.zero_grad()
        y_pred, state = model(X)
        loss = criterion(y_pred.squeeze(), Y.squeeze())
        loss.sum().backward()
        trainer.step()
     # 输出损失
    model.eval()
    with torch.no_grad():
        total_loss = 0
        for X, Y in train_loader:
            y_pred, state = model(X)
            loss = criterion(y_pred.squeeze(), Y.squeeze())
            total_loss += loss.sum()/loss.numel()
        avg_loss = total_loss / len(train_loader)
        print(f'Epoch {epoch+1}: Validation loss = {avg_loss:.4f}')
        rnn_loss_history.append(avg_loss)
    
# 绘制损失曲线图
import matplotlib.pyplot as plt
plt.plot(loss_history, label='loss')
plt.plot(rnn_loss_history, label='RNN_loss')
plt.legend()
plt.show()
 35%|███▌      | 7/20 [00:00<00:00, 62.68it/s]Epoch 1: Validation loss = 1.2063
Epoch 2: Validation loss = 0.6640
Epoch 3: Validation loss = 0.6163
Epoch 4: Validation loss = 0.5854
Epoch 5: Validation loss = 0.4029
Epoch 6: Validation loss = 0.3159
Epoch 7: Validation loss = 0.1687
Epoch 8: Validation loss = 0.1145
Epoch 9: Validation loss = 0.0840
Epoch 10: Validation loss = 0.0751
Epoch 11: Validation loss = 0.1014
Epoch 12: Validation loss = 0.0798
Epoch 13: Validation loss = 0.0535
100%|██████████| 20/20 [00:00<00:00, 63.90it/s]Epoch 14: Validation loss = 0.0552
Epoch 15: Validation loss = 0.0517
Epoch 16: Validation loss = 0.0510
Epoch 17: Validation loss = 0.0488
Epoch 18: Validation loss = 0.0574
Epoch 19: Validation loss = 0.0516
Epoch 20: Validation loss = 0.0457

4、预测

rnn_preds,_ = model(X_feature.unsqueeze(2))
preds.squeeze()
time = torch.arange(1, num+1, dtype= torch.float32)  # 时间轴

plt.plot(time[:num-seq_len], gs10['GS10'].to_list()[seq_len:num], label='gs10')
plt.plot(time[:num-seq_len], preds.detach().numpy(), label='preds')
plt.plot(time[:num-seq_len], rnn_preds[:,seq_len-1].detach().numpy(), label='RNN_preds')
plt.legend()
plt.show()

x
tensor([2.8600, 2.8400, 2.8700, 2.9800, 2.9100, 2.8900, 2.8900, 3.0000, 3.1500,
        3.1200, 2.8300, 2.7100, 2.6800, 2.5700, 2.5300, 2.4000, 2.0700, 2.0600,
        1.6300, 1.7000, 1.7100, 1.8100, 1.8600, 1.7600, 1.5000, 0.8700, 0.6600,
        0.6700, 0.7300, 0.6200, 0.6500, 0.6800, 0.7900, 0.8700, 0.9300, 1.0800,
        1.2600, 1.6100, 1.6400, 1.6200, 1.5200, 1.3200, 1.2800, 1.3700, 1.5800,
        1.5600, 1.4700, 1.7600, 1.9300, 2.1300, 2.7500, 2.9000, 3.1400, 2.9000,
        2.9000, 3.5200, 3.9800, 3.8900, 3.6200])



 6、RNN的长期依赖问题

什么是长期依赖?

        当前系统的状态,可能依赖很长时间之前系统状态。

        

长期记忆失效的原因 —— 权重矩阵连乘

        假定循环链接非常简单,去掉激活函数。

        

        h0 的系数乘指数级增长,W^t ,若W特征值的幅值如果小于1,那么就是指数级的衰减。

        则会导致类似于蝴蝶效应的现象,初始条件的很小变化就会导致结果严重的变化。

        

激活函数的选择

        RNN中可以用ReLU函数,但不能解决梯度消失、爆炸问题。

        对矩阵W的初始值敏感,十分容易引发数值问题。

        梯度的消失和爆炸沿着时间轴的级联导致的。

为什么CNN不会出现这个问题?

        因为CNN中每一层卷积的权重是不相同的,并且初始化时是独立的同分布的,因此可以互相抵消,多层之后一般不会引发数值问题。

        而RNN是共用相同的权重矩阵W,只有当W取在单位矩阵附近的时候才会有好的效果。

*** 存疑

截断时间步 TBPTT算法

        每向前传播k1步,也向后传播k2步。

        

       



部分内容参考

【循环神经网络】5分钟搞懂RNN,3D动画深入浅出_哔哩哔哩_bilibili

一文弄懂关于循环神经网络(RNN)的Teacher Forcing训练机制_free-running mode-CSDN博客

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

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

相关文章

开源持续测试平台Linux MeterSphere本地部署与远程访问

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

C# 读取Word表格到DataSet

目录 功能需求 Office 数据源的一些映射关系 范例运行环境 配置Office DCOM 关键代码 组件库引入 ​核心代码 杀掉进程 总结 功能需求 在应用项目里&#xff0c;多数情况下我们会遇到导入 Excel 文件数据到数据库的功能需求&#xff0c;但某些情况下&#xff0c;也存…

算法中的数学一:判定质数和求约数相关

1.试除法求质数 质数就是大于1的整数中除了1和自身没有其他因数的数 1.1暴力求解 暴力求解的思路就是从2遍历到自身判断是否有被整除的数&#xff0c;时间复杂度为O(n)的 bool is_prime(int x) {if(x<2)return false;for(int i2;i<x;i){if(x%i0){return false;}}return…

LSTM和GRU vs 循环神经网络RNN

1、考虑下列三种情况下&#xff0c;对比一下普通RNN的表现和LSTM和GRU表现&#xff1a; &#xff08;1&#xff09;早期观测值对预测未来观测者具有非常重要的意义。 考虑一个极端情况&#xff0c;其中第一个观测值包含一个校验和&#xff0c; 目标是在序列的末尾辨别校验和是…

Scala安装

Scala安装使用 windows安装,配置环境变量 以下载Scala2.11为例&#xff0c;操作在Windows中安装Scala。 官网下载scala2.11&#xff1a;All Available Versions | The Scala Programming Language下载好后安装。双击msi包安装,记住安装的路径。配置环境变量&#xff08;和配…

精品Nodejs实现的微信小程序的校园跑腿系统-快递收取件

《[含文档PPT源码等]精品Nodejs实现的微信小程序的校园跑腿系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 …

C++:list增删查改模拟实现

C:list增删查改模拟实现 前言一、list底层双链表验证、节点构造1.1 list底层数据结构1. 2 节点构造 二、迭代器封装实现&#xff08;重点、难点&#xff09;2.1 前置说明2.2 迭代器实现 三、list实现3.1 基本框架3.2 迭代器和const迭代器3.2 构造函数、析构函数、拷贝构造、赋值…

解决FTP传输慢的问题(ftp传输慢为什么)

在企业运营中&#xff0c;使用FTP进行文件或数据传输是相当普遍的做法。尽管FTP是一种传统的文件传输工具&#xff0c;但在实际应用中&#xff0c;我们可能会面临传输速度缓慢的问题&#xff0c;这不仅影响工作效率&#xff0c;还浪费时间。为了解决这一问题&#xff0c;我们可…

Vue中Render函数、_ref属性、_props配置的使用

Render函数 由于导入的vue为vue.runtime.xxx.js是运行版的vue.只包含&#xff1a;核心功能&#xff1a;没有模板解析器 完整版的Vue为vue.js包含&#xff1a;核心功能模板解析器 vue.runtime.esm.js中的esm为ES6的模块化 //导入的vue并非完整的vue&#xff0c;这样做的好处是…

实战:朴素贝叶斯文本分类器搭建与性能评估

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

Druid源码阅读-DruidStatInterceptor实现

上次我们在druid-spring-boot-starter里面看到有一个DruidSpringAopConfiguration的配置类&#xff0c;然后引入了DruidStatInterceptor这样一个切面逻辑。今天我们就来看一下这个类的实现。 DruidStatInterceptor 这个类的包路径下入com.alibaba.druid.support.spring.stat。…

服务器代码上传到gitlab

服务器代码上传到gitlab 安装Git工具linux&#xff1a;安装Git&#xff0c;使用自带的源安装 yum install git生成密钥文件&#xff1a;使用ssh-keygen生成密钥文件.ssh/id_rsa.pub ssh-keygen 使用cat命令查看密钥&#xff0c;将下面的密钥复制一份 在gitlab上建立一个和…

2023年12月16日~12月22日(自适应反馈机制下基于卷积神经网络的高清晰反射波反演算法:CNN-RWI)

标题&#xff1a;Adaptive Feedback Convolutional-Neural-Network-Based High-Resolution Reflection-Waveform Inversion 全波形反演&#xff08;FWI&#xff09;是一种非线性拟合观测地震记录从而获得高清晰速度模型的最优化算法。FWI能够通过拟合浅层初至波和反射波获得较准…

浅学JWT跨域认证

Json Web令牌简称JWT 由HeaderPayloadSignature组成 Header JWT头是一个描述JWT元数据的JSON对象&#xff0c;alg属性表示签名使用的算法&#xff0c;默认为HMAC SHA256&#xff08;写为HS256&#xff09;&#xff1b;typ属性表示令牌的类型&#xff0c;JWT令牌统一写为JWT。…

湘沪数字产业(上海)协同创新中心正式启动!

前言 随着全球化的加速和市场竞争的日益激烈&#xff0c;产业协作已成为推动科技创新和经济发展的重要手段。在创新驱动战略的推动下&#xff0c;全国形成了在科创核心城市建设科创中心的浪潮&#xff0c;旨在充分利用不同区域的产业优势&#xff0c;加强产业协作&#xff0c;…

BFS解决FloodFill算法相关leetcode算法题

文章目录 1.图像渲染2.岛屿数量3.岛屿的最大面积4.被围绕的区域 1.图像渲染 图像渲染 class Solution {int dx[4] {0,0,1,-1};int dy[4] {1,-1,0,0}; public:vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int…

计算机视觉技术-使用图像增广进行训练

让我们使用图像增广来训练模型。 这里&#xff0c;我们使用CIFAR-10数据集&#xff0c;而不是我们之前使用的Fashion-MNIST数据集。 这是因为Fashion-MNIST数据集中对象的位置和大小已被规范化&#xff0c;而CIFAR-10数据集中对象的颜色和大小差异更明显。 CIFAR-10数据集中的前…

【MIMO 从入门到精通】[P4]【MIMO Communications】

前言&#xff1a; Explains the main approaches to multi-input multi-output (MIMO) communications, including Beamforming, Zero Forcing, and MMSE. * Note that at the 9:19min mark, I made a slight "voice typo", where I should have said: "you nee…

AI进化太快了!Stability AI开源视频生成大模型Stable Video Diffusion

对于 Stable Diffusion&#xff0c;想必读者朋友们对此都不陌生。 自 Stability AI 公司发布 SD&#xff08;全称&#xff1a;Stable Diffusion) 以来&#xff0c;受到了很多人的喜爱。 SDXL 效果 随后技术升级&#xff0c;又发布了 SDXL&#xff0c;名字很有喜感&#xff0c…