PyTorch 深度学习实践-循环神经网络基础篇
视频指路
参考博客笔记
参考笔记二
文章目录
- 上课笔记
- 基于RNNCell实现
- 总代码
- 基于RNN实现
- 总代码
- 含嵌入层的RNN网络
- 嵌入层的作用
- 含嵌入层的RNN网络架构
- 总代码
- 其他RNN扩展
- 基本注意力机制
- 自注意力机制(Self-Attention)
- 自注意力计算
- 多头注意力机制(Multi-Head Attention)
- Transformer模型
- 简单的Transformer编码器
上课笔记
例子:每天若干特征,若干天作为输出
使用cnn的时候要明确全连接层占的权重比例特别大,是训练的瓶颈,通过权重共享的概念来减少需要训练的权重的数量
RNN cell本质就是一个线性层,但是这个线性层是共享的,如下图,每次把hi和xi+1计算得到的hi+1传送到下一层进行计算,同时xi+1还需要通过某种运算融合xi的信息(比如求和、求乘积等)h0是先验知识,比如对于图像生成文本,可以先通过cnn+fc生成h0,也可以把h0设成和h1等统一维度的向量,值都设成0。所有的rnnc都处于同一个线性层
RNN网络最大的特点就是可以处理序列特征,就是我们的一组动态特征。比如,我们可以通过将前三天每天的特征(是否下雨,是否有太阳等)输入到网络,从而来预测第四天的天气。
知识点:RNN处理数据维度,两种构建RNN的方法
问题描述:对于序列数据采用循环神经网络
11.1 RNNCell
主要内容:随机生成seq_size个句子,通过h0为全零的RNN网络,探究输入输出以及隐层的维度
代码实现:利用RNNCell处理单个运算,RNNCell只是RNN的一个单元,用于处理一个时间步的输入数据,需要在循环中手动处理时间步。
seqLen:每个句子所含词的个数
batchSize:每次处理词的批数
InputSize:每个词嵌入向量的位数
dataset: (seq_size, batch_size, input_size)——>整个数据集维度
input: (batch_size, input_size)——>每个时间步处理的输入(input in dataset)
hidden: (batch_size, output_size)——>每次处理的隐层(即为output)
import torchbatch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2# Construction of RNNCell
cell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size)
# Wrapping the sequence into:(seqLen,batchSize,InputSize)
dataset = torch.randn(seq_len, batch_size, input_size) # (3,1,4)
# Initializing the hidden to zero
hidden = torch.zeros(batch_size, hidden_size) # (1,2)for idx, input in enumerate(dataset):print('=' * 20, idx, '=' * 20)print('Input size:', input.shape) # (batch_size, input_size)# 按序列依次输入到cell中,seq_len=3,故循环3次hidden = cell(input, hidden) # 返回的hidden是下一次的输入之一,循环使用同一个cellprint('output size:', hidden.shape) # (batch_size, hidden_size)print(hidden.data)
Wih的size应该是(hidden * input),whh的size应该是(hidden * hidden):输入 * 一个权重和上一个隐藏层 * 一个权重。w1 * h + w2 * x = [w1 w2] [h x]^T,也就是(h * (h+i)) * (h + i) * 1 = h * 1的矩阵 然后丢到tanh()里去计算
写成下面公式
h t = t a n h ( W i h x t + b i h + W h h h t − 1 + b h h ) h_t=tanh(W_{ih}x_t+b_{ih}+W_{hh}h_{t-1}+b_{hh}) ht=tanh(Wihxt+bih+Whhht−1+bhh)
如果使用rnncell主要用下面代码,需要输入维度和隐藏层维度作为函数输入
import torchbatch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2cell = torch.nn.RNNCell(input_size=input_size, hidden_size=hidden_size)
# #(seqLen, batchSize, inputSize)
datasets = torch.randn(seq_len, batch_size, input_size)
hidden = torch.zeros(batch_size, hidden_size)for idx, input in enumerate(datasets):print("=" * 20, idx, "=" * 20)print("input size:", input.shape)hidden= cell(input, hidden)print("output size:", hidden.shape)print(hidden)
Train a model to learn: “hello” -> “ohlol”
基于RNNCell实现
先给每个字母编号(索引),然后对于’hello’序列写出其对应的序列表,将表展开成一个独热向量,出现的位置是1,其他位置是0
每个字母相当于一个独热向量送进去,输出是一个四维向量,经过softmax输出概率最大的值,在本题里应该是"ohlol" -》 “31232”
总代码
import torch# 输入样本特征数
input_size = 4
# 隐藏层样本特征数(分类数)
hidden_size = 4
# batch大小
batch_size = 1idx2char = ['e', 'h', 'l', 'o']
# hello
x_data = [1, 0, 2, 2, 3]#输入字典
# ohlol
y_data = [3, 1, 2, 3, 2]#输出词典# 将x_data转换为one_hot表示
'''
torch.eye()
参数:
n (int ) – 行数
m (int, optional) – 列数.如果为None,则默认为n
out (Tensor, optinal) - Output tensor
'''
x_one_hot = torch.eye(n=4)[x_data, :]
y_one_hot = torch.eye(n=4)[y_data, :]# x_data转换维度为(seqlen, batch_size, input_size),此维度为RNN的输入
inputs = x_one_hot.view(-1, batch_size, input_size)
# y_data转换维度为(seqlen,1)
labels = torch.LongTensor(y_data).view(-1, 1)# 构建神经网络模型
class Model(torch.nn.Module):def __init__(self):super(Model, self).__init__()self.input_size = input_sizeself.batch_size = batch_sizeself.hidden_size = hidden_size# 对于RNNCell输入为(batch_size, input_size),隐层为(batch_size, hidden_size)self.rnncell = torch.nn.RNNCell(input_size=self.input_size, hidden_size=self.hidden_size)def forward(self, input, hidden):# h_t=Cell(x_t, h_t-1)hidden = self.rnncell(input, hidden)return hidden# 初始化隐层h_0def init_hidden(self):return torch.zeros(self.batch_size, self.hidden_size)model = Model()# 构建损失函数和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)# 训练
for epoch in range(60):loss = 0optimizer.zero_grad()# h_0hidden = model.init_hidden()print('Predicted string:', end='')for input, label in zip(inputs, labels):hidden = model(input, hidden)loss += criterion(hidden, label)_, idx = hidden.max(dim=1)print(idx2char[idx.item()], end='')loss.backward()optimizer.step()print(', epoch[%d/60] loss=%.4f' % (epoch+1, loss.item()))
基于RNN实现
RNN需要输入三个参数:input_size, hidden_size, num_layers
输入:input的shape(seqSize, batch, input_size)
hidden的shape(numLayers, batch, hidden_size)
输出:output的shape(seqSize, batch, hidden_size)
hidden的shape(numLayers, batch, hidden_size)
import torchbatch_size = 1
seq_len = 3
input_size = 4
hidden_size = 2
num_layers =1cell = torch.nn.RNN(input_size=input_size, hidden_size=hidden_size, num_layers=num_layers, batch_first=True)#(seqLen, batchSize, inputSize)
inputs = torch.randn(batch_size, seq_len, input_size)
hidden = torch.zeros(num_layers, batch_size, hidden_size)out, hidden = cell(inputs, hidden)
print("output size:", out.shape)
print("output:", out)
print("hidden size:", hidden.shape)
print("hidden:", hidden)
总代码
import torch# 1.参数设置
seq_len = 5
input_size = 4
hidden_size = 4
batch_size = 1# 2.数据准备
index2char = ['e', 'h', 'l', 'o']
x_data = [1, 0, 2, 2, 3]
y_data = [3, 1, 2, 3, 2]
one_hot_lookup = [[1, 0, 0, 0],[0, 1, 0, 0],[0, 0, 1, 0],[0, 0, 0, 1]]
x_one_hot = [one_hot_lookup[x] for x in x_data]
inputs = torch.Tensor(x_one_hot).view(-1, batch_size, input_size)
labels = torch.LongTensor(y_data)# 3.模型构建
class Model(torch.nn.Module):def __init__(self, input_size, hidden_size, batch_size, num_layers=1): # 需要指定输入,隐层,批super(Model, self).__init__()self.batch_size = batch_sizeself.input_size = input_sizeself.hidden_size = hidden_sizeself.num_layers = num_layersself.rnn = torch.nn.RNN(input_size=self.input_size, hidden_size=self.hidden_size, num_layers=self.num_layers)def forward(self, input):hidden = torch.zeros(self.num_layers,self.batch_size,self.hidden_size)out, _ = self.rnn(input, hidden) # out: tensor of shape (seq_len, batch, hidden_size)return out.view(-1, self.hidden_size) # 将输出的三维张量转换为二维张量,(𝒔𝒆𝒒𝑳𝒆𝒏×𝒃𝒂𝒕𝒄𝒉𝑺𝒊𝒛𝒆,𝒉𝒊𝒅𝒅𝒆𝒏𝑺𝒊𝒛𝒆)net = Model(input_size, hidden_size, batch_size)# 4.损失和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.5)# 5.训练
for epoch in range(15):optimizer.zero_grad()outputs = net(inputs)print(outputs.shape)loss = criterion(outputs, labels)loss.backward()optimizer.step()_, idx = outputs.max(dim=1)idx = idx.data.numpy()print('Predicted string: ', ''.join([index2char[x] for x in idx]), end='')print(',Epoch [%d / 15] loss:%.4f' % (epoch+1, loss.item()))
one-hot的缺点:高维、稀疏、硬编码
需求:低维、稠密、从数据中学习
实现方法:embedding
含嵌入层的RNN网络
from gpt4o:
含嵌入层的RNN网络是结合嵌入层(Embedding Layer)和循环神经网络(RNN)的一种神经网络架构,常用于自然语言处理(NLP)任务。嵌入层的主要作用是将离散的词汇映射到连续的向量空间中,从而为RNN提供密集的、低维的输入表示,这比直接使用稀疏的one-hot编码更为高效。
嵌入层的作用
嵌入层将词汇表中的每个词映射到一个固定维度的向量。它的主要优点包括:
- 降低维度:从高维的one-hot编码(词汇表大小)转换为低维的密集向量表示。
- 捕捉语义关系:相似的词在嵌入空间中往往具有相近的向量表示,从而能够捕捉词与词之间的语义关系。
含嵌入层的RNN网络架构
一个典型的含嵌入层的RNN网络架构包括以下几个部分:
- 嵌入层:将输入的词汇索引序列转换为嵌入向量序列。
- RNN层:处理嵌入向量序列,捕捉序列中的时序依赖关系。
- 输出层:根据任务的不同,可以是分类层、回归层等,用于生成最终的预测结果。
以下是一个含嵌入层的RNN网络的具体代码示例和详细解释:
import torch
import torch.nn as nn# 定义超参数
vocab_size = 10 # 词汇表大小
embed_size = 8 # 嵌入向量的维度
hidden_size = 16 # RNN隐藏层的维度
output_size = 5 # 输出层的大小(例如类别数)
num_layers = 1 # RNN的层数# 定义含嵌入层的RNN模型
class RNNModelWithEmbedding(nn.Module):def __init__(self, vocab_size, embed_size, hidden_size, output_size, num_layers=1):super(RNNModelWithEmbedding, self).__init__()self.embedding = nn.Embedding(vocab_size, embed_size) # 嵌入层self.rnn = nn.RNN(embed_size, hidden_size, num_layers, batch_first=True)self.fc = nn.Linear(hidden_size, output_size) # 全连接层,输出最终结果def forward(self, x):embedded = self.embedding(x) # 输入序列通过嵌入层out, hidden = self.rnn(embedded) # 嵌入向量序列通过RNN层out = self.fc(out[:, -1, :]) # 取RNN的最后一个时间步的输出,经过全连接层return out# 创建模型实例
model = RNNModelWithEmbedding(vocab_size, embed_size, hidden_size, output_size, num_layers)# 打印模型结构
print(model)# 创建随机输入,形状为(batch_size, seq_len)
input_data = torch.randint(0, vocab_size, (2, 3)) # 例如 batch_size=2, seq_len=3# 前向传播
output = model(input_data)print("输入:", input_data)
print("输出:", output)
嵌入层:self.embedding = nn.Embedding(vocab_size, embed_size)
vocab_size
:词汇表的大小,即词汇数量。embed_size
:每个词的嵌入向量的维度。- 嵌入层的作用是将输入的词汇索引序列(如
[1, 2, 3]
)转换为嵌入向量序列。
RNN层:self.rnn = nn.RNN(embed_size, hidden_size, num_layers, batch_first=True)
embed_size
:RNN的输入维度,即嵌入向量的维度。hidden_size
:RNN隐藏层的维度。num_layers
:RNN的层数。batch_first=True
:输入和输出的形状为(batch_size, seq_len, feature_size)
。
全连接层:self.fc = nn.Linear(hidden_size, output_size)
hidden_size
:RNN隐藏层的维度。output_size
:输出层的大小,例如分类任务中的类别数。- 全连接层的作用是将RNN的输出转换为最终的预测结果。
前向传播函数:def forward(self, x)
- 输入
x
是词汇索引序列(形状为(batch_size, seq_len)
)。 - 通过嵌入层将输入序列转换为嵌入向量序列
embedded
。 - 嵌入向量序列通过RNN层得到输出
out
和隐藏状态hidden
。 - 取RNN层最后一个时间步的输出
out[:, -1, :]
,通过全连接层得到最终输出out
。
gpt结束
在下面加一层embed层
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
torch.nn.Embedding(num_embeddings, embedding_dim, padding_idx=None, max_norm=None, norm_type=2.0, scale_grad_by_freq=False, sparse=False)
"""
参数解释
num_embeddings:嵌入字典的大小,即词汇表的大小。比如,如果有 10000 个不同的单词,那么 num_embeddings 就是 10000。
embedding_dim:每个嵌入向量的维度。比如,如果希望每个单词表示为 128 维的向量,那么 embedding_dim 就是 128。
padding_idx (可选):如果指定了这个参数,那么这个索引将在计算梯度时总是返回零向量,并且其对应的嵌入向量不会更新。这个通常用于处理填充(padding)。
max_norm (可选):如果指定了这个参数,每个嵌入向量的范数(norm)将不会超过这个值。如果某个嵌入向量的范数超过了 max_norm,那么它将被重新缩放到 max_norm。
norm_type (可选):用于计算范数的类型。默认为2(L2范数)。
scale_grad_by_freq (可选):如果设为 True,则根据单词在小批量中的频率来缩放梯度。
sparse (可选):如果设为 True,则使用稀疏更新。
"""
当使用嵌入层(torch.nn.Embedding
)作为 RNN 的输入时,输入张量通常需要是长整型(torch.LongTensor
),因为嵌入层的输入是索引,索引通常以长整型表示。嵌入层将这些索引映射到相应的嵌入向量,然后这些嵌入向量可以作为 RNN 的输入。
总代码
import torch# 1、确定参数
num_class = 4
input_size = 4
hidden_size = 8
embedding_size = 10
num_layers = 2
batch_size = 1
seq_len = 5# 2、准备数据
index2char = ['e', 'h', 'l', 'o'] # 字典
x_data = [[1, 0, 2, 2, 3]] # (batch_size, seq_len) 用字典中的索引(数字)表示来表示hello
y_data = [3, 1, 2, 3, 2] # (batch_size * seq_len) 标签:ohlolinputs = torch.LongTensor(x_data) # (batch_size, seq_len)
labels = torch.LongTensor(y_data) # (batch_size * seq_len)# 3、构建模型
class Model(torch.nn.Module):def __init__(self):super(Model, self).__init__()self.emb = torch.nn.Embedding(num_class, embedding_size)self.rnn = torch.nn.RNN(input_size=embedding_size, hidden_size=hidden_size, num_layers=num_layers,batch_first=True)self.fc = torch.nn.Linear(hidden_size, num_class)def forward(self, x):hidden = torch.zeros(num_layers, x.size(0), hidden_size) # (num_layers, batch_size, hidden_size)x = self.emb(x) # 返回(batch_size, seq_len, embedding_size)x, _ = self.rnn(x, hidden) # 返回(batch_size, seq_len, hidden_size)x = self.fc(x) # 返回(batch_size, seq_len, num_class)return x.view(-1, num_class) # (batch_size * seq_len, num_class)net = Model()# 4、损失和优化器
criterion = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.Adam(net.parameters(), lr=0.05) # Adam优化器# 5、训练
for epoch in range(15):optimizer.zero_grad()outputs = net(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()_, idx = outputs.max(dim=1)idx = idx.data.numpy()print('Predicted string: ', ''.join([index2char[x] for x in idx]), end='')print(', Epoch [%d/15] loss: %.4f' % (epoch + 1, loss.item()))
其他RNN扩展
- LSTM(长短期记忆网络)
- LSTM通过引入细胞状态和门控机制(输入门、遗忘门和输出门)来保留和控制长期依赖信息。
- 解决了标准RNN在处理长序列时的梯度消失问题。
import torch
import torch.nn as nnclass LSTMModel(nn.Module):def __init__(self, input_size, hidden_size, batch_size, num_layers=1):super(LSTMModel, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.lstm = nn.LSTM(input_size, hidden_size, num_layers)def forward(self, input):h0 = torch.zeros(self.num_layers, input.size(1), self.hidden_size)c0 = torch.zeros(self.num_layers, input.size(1), self.hidden_size)out, _ = self.lstm(input, (h0, c0))return out.view(-1, self.hidden_size)
- GRU(门控循环单元)
- GRU是LSTM的简化版本,使用更新门和重置门来控制信息的流动。
- 与LSTM相比,GRU的参数较少,因此计算效率更高。
import torch
import torch.nn as nnclass GRUModel(nn.Module):def __init__(self, input_size, hidden_size, batch_size, num_layers=1):super(GRUModel, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.gru = nn.GRU(input_size, hidden_size, num_layers)def forward(self, input):h0 = torch.zeros(self.num_layers, input.size(1), self.hidden_size)out, _ = self.gru(input, h0)return out.view(-1, self.hidden_size)
- Bidirectional RNN(双向RNN)
- 双向RNN在输入序列的两个方向(正向和反向)上进行训练,从而捕获更多的上下文信息。
- 可以用于LSTM和GRU。
python复制代码import torch
import torch.nn as nnclass BidirectionalLSTMModel(nn.Module):def __init__(self, input_size, hidden_size, batch_size, num_layers=1):super(BidirectionalLSTMModel, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.lstm = nn.LSTM(input_size, hidden_size, num_layers, bidirectional=True)def forward(self, input):h0 = torch.zeros(self.num_layers * 2, input.size(1), self.hidden_size)c0 = torch.zeros(self.num_layers * 2, input.size(1), self.hidden_size)out, _ = self.lstm(input, (h0, c0))return out.view(-1, self.hidden_size * 2)
- Attention Mechanism(注意力机制)
- 注意力机制用于在处理序列时动态地关注重要部分。
- 常用于提高序列到序列模型(如机器翻译)的性能。
python复制代码import torch
import torch.nn as nnclass AttentionModel(nn.Module):def __init__(self, input_size, hidden_size, batch_size, num_layers=1):super(AttentionModel, self).__init__()self.hidden_size = hidden_sizeself.num_layers = num_layersself.lstm = nn.LSTM(input_size, hidden_size, num_layers)self.attention = nn.Linear(hidden_size, hidden_size)def forward(self, input):h0 = torch.zeros(self.num_layers, input.size(1), self.hidden_size)c0 = torch.zeros(self.num_layers, input.size(1), self.hidden_size)out, _ = self.lstm(input, (h0, c0))attn_weights = torch.softmax(self.attention(out), dim=1)out = torch.bmm(attn_weights.transpose(1, 2), out)return out.view(-1, self.hidden_size)
这些RNN变体在不同的应用中各有优势,选择适当的变体可以显著提高模型的性能。
注意力机制(Attention Mechanism)是深度学习中一种强大的技术,尤其在自然语言处理(NLP)任务中。它允许模型在处理序列数据时动态地关注序列的不同部分,从而捕捉更丰富的上下文信息。以下是一些关于注意力机制的详细信息和其主要变体。
基本注意力机制
基本的注意力机制可以用在编码器-解码器结构中,以动态地聚焦在输入序列的不同部分。下面是一个简单的注意力机制示例:
python复制代码import torch
import torch.nn as nnclass BasicAttention(nn.Module):def __init__(self, hidden_size):super(BasicAttention, self).__init__()self.attention = nn.Linear(hidden_size, hidden_size)def forward(self, encoder_outputs, decoder_hidden):# 计算注意力权重attn_weights = torch.bmm(encoder_outputs, decoder_hidden.unsqueeze(2)).squeeze(2)attn_weights = torch.softmax(attn_weights, dim=1)# 用注意力权重加权平均编码器输出context = torch.bmm(attn_weights.unsqueeze(1), encoder_outputs).squeeze(1)return context, attn_weights
自注意力机制(Self-Attention)
自注意力机制用于捕获序列中各位置之间的关系,尤其适用于序列到序列任务。它是Transformer模型的核心组件。
自注意力计算
自注意力计算涉及三个矩阵:查询矩阵(Query)、键矩阵(Key)和值矩阵(Value)。下面是自注意力计算的公式:
Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
python复制代码import torch
import torch.nn as nnclass SelfAttention(nn.Module):def __init__(self, input_size, hidden_size):super(SelfAttention, self).__init__()self.query = nn.Linear(input_size, hidden_size)self.key = nn.Linear(input_size, hidden_size)self.value = nn.Linear(input_size, hidden_size)self.scale = torch.sqrt(torch.FloatTensor([hidden_size]))def forward(self, x):Q = self.query(x)K = self.key(x)V = self.value(x)attention_weights = torch.bmm(Q, K.transpose(1, 2)) / self.scaleattention_weights = torch.softmax(attention_weights, dim=-1)context = torch.bmm(attention_weights, V)return context, attention_weights
多头注意力机制(Multi-Head Attention)
多头注意力机制是自注意力的扩展,它通过多个注意力头(head)来捕获不同的特征子空间。每个头独立地执行自注意力,然后将所有头的输出连接起来。
import torch
import torch.nn as nnclass MultiHeadAttention(nn.Module):def __init__(self, input_size, hidden_size, num_heads):super(MultiHeadAttention, self).__init__()self.num_heads = num_headsself.hidden_size = hidden_sizeself.query = nn.Linear(input_size, hidden_size * num_heads)self.key = nn.Linear(input_size, hidden_size * num_heads)self.value = nn.Linear(input_size, hidden_size * num_heads)self.fc = nn.Linear(hidden_size * num_heads, hidden_size)def forward(self, x):batch_size = x.size(0)Q = self.query(x).view(batch_size, -1, self.num_heads, self.hidden_size).transpose(1, 2)K = self.key(x).view(batch_size, -1, self.num_heads, self.hidden_size).transpose(1, 2)V = self.value(x).view(batch_size, -1, self.num_heads, self.hidden_size).transpose(1, 2)attention_weights = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.FloatTensor([self.hidden_size]))attention_weights = torch.softmax(attention_weights, dim=-1)context = torch.matmul(attention_weights, V).transpose(1, 2).contiguous().view(batch_size, -1, self.hidden_size * self.num_heads)output = self.fc(context)return output, attention_weights
Transformer模型
Transformer模型是基于自注意力和多头注意力机制的架构。它广泛应用于NLP任务,并通过引入位置编码(Positional Encoding)解决了序列位置问题。
简单的Transformer编码器
class TransformerEncoder(nn.Module):def __init__(self, input_size, hidden_size, num_heads, num_layers):super(TransformerEncoder, self).__init__()self.layers = nn.ModuleList([nn.TransformerEncoderLayer(hidden_size, num_heads) for _ in range(num_layers)])self.embedding = nn.Linear(input_size, hidden_size)def forward(self, src):src = self.embedding(src)for layer in self.layers:src = layer(src)return src
相关文章:
PyTorch 深度学习实践-循环神经网络基础篇
视频指路 参考博客笔记 参考笔记二 文章目录 上课笔记基于RNNCell实现总代码 基于RNN实现总代码 含嵌入层的RNN网络嵌入层的作用含嵌入层的RNN网络架构总代码 其他RNN扩展基本注意力机制自注意力机制(Self-Attention)自注意力计算多头注意力机制…...
vue实现可拖拽dialog封装
一、实现modal弹窗组件 <template><divv-if"visible"class"customer-dialog"id"customer-dialog":style"dialogStyles"v-dialogDrag:[dialogDrag]><div class"dialog-container"><divclass"dial…...
本地多模态看图说话-llava
其中图片为bast64转码,方便json序列化。 其中模型llava为本地ollama运行的模型,如:ollama run llava 还有其它的模型如:llava-phi3,通过phi3微调过的版本。 实际测试下来,发现本地多模型的性能不佳&…...
人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程14-神经网络的优化与设计之拟合问题及优化与代码详解。在机器学习和深度学习领域,模型的训练目标是找到一组参数,使得模型能够从训练数据中学习到有用的模式&am…...
Java异常抛出与处理方法
在Java编程中,异常处理是一个非常重要的部分。通过正确的异常处理,我们可以提高程序的健壮性和可靠性,避免程序在运行过程中出现意外的崩溃。本文将详细讲述Java异常的抛出与处理方法,并通过示例代码进行说明。 一、Java异常的分类 Java中的异常体系结构可以分为三类: 检…...
兼容性测试主要有什么类型?
兼容性测试的类型 有两种类型的兼容性测试。这是一个快速细分。 1、前向兼容性测试 向前兼容性测试或向上兼容性测试可确保当前软件版本在相关组件(例如操作系统、浏览器和第三方库)的未来版本中保持功能。此类测试对于在系统升级期间保持稳定性和用户体验至关重要。 例如&…...
设计模式--组合模式
组合模式(Composite Pattern)详解 组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 适用场景 需要表示对象的部分-整体层次结构时&am…...
ArduPilot开源代码之AP_DAL_RangeFinder
ArduPilot开源代码之AP_DAL_RangeFinder 1. 源由2. 框架设计2.1 枚举 Status2.2 公有方法2.3 私有成员变量 3. 重要例程3.1 应用函数3.1.1 ground_clearance_cm_orient3.1.2 max_distance_cm_orient3.1.3 has_orientation3.1.4 get_backend 3.2 其他函数3.2.1 AP_DAL_RangeFind…...
SpringCloud教程 | 第九篇: 使用API Gateway
1、参考资料 SpringCloud基础篇-10-服务网关-Gateway_springcloud gateway-CSDN博客 2、先学习路由,参考了5.1 2.1、建了一个cloudGatewayDemo,这是用来配置网关的工程,配置如下: http://localhost:18080/aaa/name 该接口代码如…...
数据结构——hash(hashmap源码探究)
hash是什么? hash也称为散列,就是把任意长度的输入,通过散列算法,变成固定长度的输出,这个输出值就是散列值。 举例来说明一下什么是hash: 假设我们要把1~12存入到一个大小是5的hash表中,我们…...
国产麒麟、UOS在线打开pdf加盖印章
PageOffice支持两种电子印章方案,可实现对Word、Excel、PDF文档加盖PageOffice自带印章或ZoomSeal电子印章(全方位保护、防篡改、防伪造)。Word和Excel的盖章功能请参考:Word和Excel加盖印章和签字功能 (目前只支持win…...
破解反爬虫策略 /_guard/auto.js(二)实战
这次我们用上篇文章讲到的方法来真正破解一下反爬虫策略,这两个案例是两个不同的网站,一个用的是 /_guard/auto.js,另一个用的是/_guard/delay_jump.js。经过解析发现这两个网站用的反爬虫策略基本是一模一样,只不过在js混淆和生成…...
同样是人工智能 客户在哪儿AI和GPT等大模型有什么不同
书接上回。为了统一回答朋友们的疑惑,此前的两篇文章,着重讲述了客户在哪儿AI的企业全历史行为数据和企业信息查询平台上的数据的区别,以及客户在哪儿AI的ToB获客服务和AI外呼机器人的获客服务的不同。本期接着讲——客户在哪儿AI VS 大模型&…...
AES Android IOS H5 加密方案
前景: 1、本项目原有功能RSA客户端对敏感信息进行加密 2、本次漏洞说是服务端返回值有敏感信息,需要密文返回 3、最初只跟H5联调成功,后续APP联调失败(H5和APP的需求排期不一致),没关注到通用性 方案: 本次方案不…...
一文了解变阻器和电位器的定义、原理、应用及其对比
变阻器的定义 两端可变电阻器(称为变阻器)利用电阻来调节电流。电阻丝环绕在陶瓷或瓷器等绝缘芯上。当刮水器沿着电阻丝移动时,电路的有效电阻会发生变化。因此,它提供了精确的电流控制。调光器、电机速度控制器和加热元件使用变…...
WPF实现一个带旋转动画的菜单栏
WPF实现一个带旋转动画的菜单栏 一、创建WPF项目及文件1、创建项目2、创建文件夹及文件3、添加引用 二、代码实现2.ControlAttachProperty类 一、创建WPF项目及文件 1、创建项目 打开VS2022,创建一个WPF项目,如下所示 2、创建文件夹及文件 创建资源文件夹&…...
使用Dockerfile构建镜像
目录 1.使用Dockerfile构建tomcat镜像 1.1 通过ARG传参构建不同版本的tomcat 2.缩小镜像的体积大小 2.1 使用较小体积的基础镜像 2.2 多级构建减少体积 1.使用Dockerfile构建tomcat镜像 cd /opt mkdir tomcat cd tomcat/ 上传tomcat所需的依赖包 使用tar xf 解压三个压缩…...
概率论原理精解【3】
文章目录 向量值向量值函数导数对称矩阵定义性质例子应用 向量值理论基础定义性质应用示例 向量值函数的导数定义性质应用 向量值 向量值函数导数 D n ⊂ R n , 向量值函数 f : D n → R m D^n \subset R^n,向量值函数f:D^n\rightarrow R^m Dn⊂Rn,向量值函数f:Dn→Rm 1. 向量…...
[C/C++入门][循环]14、计算2的幂(2的n次方)
计算2的幂(即2的n次方)非常经典。你懂几种方法呢?很多人只会一种,我们来分析一下。 可以通过多种方式实现: 1、最简单的方法之一是使用位运算符<<,它本质上是在二进制表示下对2进行左移操作&#x…...
RPC与服务的注册发现
文章目录 1. 什么是远程过程调用(RPC)?2. RPC的流程3. RPC实践4. RPC与REST的区别4.1 RPC与REST的相似之处4.2 RPC与REST的架构原则4.3 RPC与REST的主要区别 5. RPC与服务发现5.1 以zookeeper为服务注册中心5.2 以etcd为服务注册中心 6. 小结参考 1. 什么是远程过程调用(RPC)?…...
3112. 访问消失节点的最少时间 Medium
给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点࿰…...
FastAPI 学习之路(五十二)WebSockets(八)接受/发送json格式消息
前面我们发送的大多数都是text类型的消息,对于text消息来说,后端处理出来要麻烦的多,那么我们可以不可以传递json格式的数据,对于前后端来说都比较友好,答案是肯定的,我们需要做下处理。 首先,…...
Go语言并发编程-案例_3
案例 并发目录大小统计 业务逻辑 统计目录的文件数量和大小(或其他信息)。示例输出: // 某个目录:2637 files 1149.87 MB 实现思路 给定一个或多个目录,并发的统计每个目录的size,最后累加到一起。 当…...
pikachu之跨站脚本攻击(x‘s‘s)
1get型 输入a看一下 接着输入<a> 发现<>没有被过滤当做标签处理了 尝试在表单提交的框里面,输入xss语句 尝试输入<script>alert(1)</script> 发现有长度限制 因为这里是get请求 get请求的特点是:传参是在url中的 所以我们可以在…...
Qt模型/视图架构——委托(delegate)
一、为什么需要委托 模型(model)用来数据存储,视图(view)用来展示数据。因此,模型/视图架构是一种将数据存储和界面展示分离的编程方法。具体如下图所示: 由图可知,模型向视图提供数…...
python3.11SSL: SSLV3_ALERT_HANDSHAKE_FAILURE
参考:python request包 版本不兼容 报错sslv3 alert handshake failure 解决方法-CSDN博客 修改:Python311\Lib\site-packages\urllib3\util\ssl_.py 新版本3.11里默认没有DEFAULT_CIPHERS 补回来: #__imported from 3.6.8 # A secure default. # So…...
[深度学习]基于yolov10+streamlit目标检测演示系统设计
YOLOv10结合Streamlit构建的目标检测系统,不仅极大地增强了实时目标识别的能力,还通过其直观的用户界面实现了对图片、视频乃至摄像头输入的无缝支持。该系统利用YOLOv10的高效检测算法,能够快速准确地识别图像中的多个对象,并标注…...
开源模型应用落地-FastAPI-助力模型交互-进阶篇(三)
一、前言 FastAPI 的高级用法可以为开发人员带来许多好处。它能帮助实现更复杂的路由逻辑和参数处理,使应用程序能够处理各种不同的请求场景,提高应用程序的灵活性和可扩展性。 在数据验证和转换方面,高级用法提供了更精细和准确的控制&#…...
机器人及其相关工科专业课程体系
机器人及其相关工科专业课程体系 前言传统工科专业机械工程自动化/控制工程计算机科学与技术 新兴工科专业智能制造人工智能机器人工程 总结Reference: 前言 机器人工程专业是一个多领域交叉的前沿学科,涉及自然科学、工程技术、社会科学、人文科学等相关学科的理论…...
C#数字医学影像系统(RIS/PACS)源码,Oracle数据库,C/S架构,运行稳定
数字医学影像系统(RIS/PACS)源码,三甲以下的医院都能满足。PACS 系统全套成品源码。 开发技术:C/S架构,C#开发语言,数据库服务器采用Oracle数据库。 医学影像存储与传输系统,融合了医学信息化…...
动态网站的表单设计/站内搜索引擎
写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天。 nhibernate系列从开始着手写,到现在前后耗费大概两个月的时间,通过总结这个系…...
wordpress分类目录名称/网络公司排名
ADO.NET 对象模型中有五个主要的组件,分别是Connection 对象、Command 对象、DataSetCommand、DataSet 以及DataReader。这些组件中负责建立联机和数据操作的部分我们称为数据操作组件(Managed Providers) ,分别由Connection 对象…...
Wordpress html5 动画/万能优化大师下载
今天要动态添加几条数据如果使用recyclerview就不划算和不够简洁。于是在网上看了addview的使用。 于是就开始来使用了,结果直接。。。。无法形式怎么回事,因为是在OkhttpUtils工具中使用的,以为是更新ui是要在线程中进行的。后面一想不对&a…...
html主页面模板/seo推广关键词公司
互动直播、线上会议、在线医疗和在线教育是实时音视频技术应用的重要场景,而这些场景对高可用、高可靠、低延时有着苛刻的要求,很多团队在音视频产品开发过程中会遇到各种各样的问题。例如:流畅性,如果在视频过程中频繁卡顿&#…...
简网 互联 专业wordpress主机/媒体公关
C语言 _ 编辑、调试工具一、GCC编译器1、GNU工具2、GCC简介3、GCC编译器的版本4、gcc所支持后缀名解释5、编译器的主要组件6、GCC的基本用法和选项7、GCC的错误类型及对策8、**GCC编译过程**条件编译二、GDB调试工具1、Gdb调试流程:2、进入代码调试模式后一、GCC编译…...
网站空间商盗取数据/网站互联网推广
上一篇刚刚完成了nagios的自动安装,这篇继续吧,想到前些天手动配置kickstart服务器过程比较繁琐,思路也不够清晰,还是把安装配置过程写进脚本非常方便,感觉是一劳永逸,降低后续工作的劳动量,而且…...