transformer--编码器2(前馈全连接层、规范化层、子层链接结构、编码器层、编码器)

前馈全连接层

什么是前馈全连接层:

在Transformer中前馈全连接层就是具有两层线性层的全连接网络

前馈全连接层的作用:

考虑注意力机制可能对复杂过程的拟合程度不够,通过增加两层网络来增强模型的能力

code

# 前馈全连接层
class PositionwiseFeedForward(nn.Module):def __init__(self, d_model, d_ff,dropout=0.1) -> None:""" d_mode :第一个线下层的输入维度d_ff   :隐藏层的维度dropout:"""super(PositionwiseFeedForward,self).__init__()self.line1 = nn.Linear(d_model,d_ff)self.line2 = nn.Linear(d_ff,d_model)self.dropout = nn.Dropout(dropout)def forward(self,x):return self.line2(self.dropout(F.relu(self.line1(x))))

测试:

输出

ff_result.shape =  torch.Size([2, 4, 512])
ff_result =  tensor([[[-0.0589, -1.3885, -0.8852,  ..., -0.4463, -0.9892,  2.7384],[ 0.2426, -1.1040, -1.1298,  ..., -0.9296, -1.5262,  1.0632],[ 0.0318, -0.8362, -0.9389,  ..., -1.6359, -1.8531, -0.1163],[ 1.1119, -1.2007, -1.5487,  ..., -0.8869,  0.1711,  1.7431]],[[-0.2358, -0.9319,  0.8866,  ..., -1.2987,  0.2001,  1.5415],[-0.1448, -0.7505, -0.3023,  ..., -0.2585, -0.8902,  0.6206],[ 1.8106, -0.8460,  1.6487,  ..., -1.1931,  0.0535,  0.8415],[ 0.2669, -0.3897,  1.1560,  ...,  0.1138, -0.2795,  1.8780]]],grad_fn=<ViewBackward0>)

规范化层

规范化层的作用:

它是所有深层网络模型都需要的标准网络层,因为随着网络层数的增加,通过多层的计算后参数可能开始出现过大或过小的情况,这样可能会导致学习过程出现异常,模型可能收敛非常的慢,因此都会在一定层数后接规范化层进行数值的规范化,使其特征数值在合理范围内.

code

class LayerNorm(nn.Module):def __init__(self,features,eps=1e-6) -> None:# features 词嵌入的维度# eps 足够小的数据,防止除0,放到分母上super(LayerNorm,self).__init__()# 规范化层的参数,后续训练使用的self.w = nn.parameter(torch.ones(features))self.b = nn.Parameter(torch.zeros(features))self.eps = epsdef forward(self, x):mean = x.mean(-1,keepdim=True)stddev = x.std(-1,keepdim=True)# * 代表对应位置进行相乘,不是点积return self.w*(x-mean)/(stddev,self.eps) + self.b

test

输出:

ln_result.shape =  torch.Size([2, 4, 512])
ln_result =  tensor([[[ 1.3255e+00,  7.7968e-02, -1.7036e+00,  ..., -1.3097e-01,4.9385e-01,  1.3975e-03],[-1.0717e-01, -1.8999e-01, -1.0603e+00,  ...,  2.9285e-01,1.0337e+00,  1.0597e+00],[ 1.0801e+00, -1.5308e+00, -1.6577e+00,  ..., -1.0050e-01,-3.7577e-02,  4.1453e-01],[ 4.2174e-01, -1.1476e-01, -5.9897e-01,  ..., -8.2557e-01,1.2285e+00,  2.2961e-01]],[[-1.3024e-01, -6.9125e-01, -8.4373e-01,  ..., -4.7106e-01,2.3697e-01,  2.4667e+00],[-1.8319e-01, -5.0278e-01, -6.6853e-01,  ..., -3.3992e-02,-4.8510e-02,  2.3002e+00],[-5.7036e-01, -1.4439e+00, -2.9533e-01,  ..., -4.9297e-01,9.9002e-01,  9.1294e-01],[ 2.8479e-02, -1.2107e+00, -4.9597e-01,  ..., -6.0751e-01,3.1257e-01,  1.7796e+00]]], grad_fn=<AddBackward0>)

子层连接结构

什么是子层连接结构:

如图所示,输入到每个子层以及规范化层的过程中,还使用了残差链接(跳跃连接),因此我们把这一部分结构整体叫做子层连接(代表子层及其链接结构),在每个编码器层中,都有两个子层,这两个子层加上周围的链接结构就形成了两个子层连接结构.

code

# 子层连接结构
class SublayerConnection(nn.Module):def __init__(self,size,dropout=0.1) -> None:"""size : 词嵌入的维度"""super(SublayerConnection,self).__init__()self.norm = LayerNorm(size)self.dropout = nn.Dropout(dropout)def forward(self, x, sublayer):# sublayer 子层结构或者函数# x+ 跳跃层return x+self.dropout(sublayer(self.norm(x)))

测试代码 放到最后

输出:

sc_result.sahpe =  torch.Size([2, 4, 512])
sc_result =  tensor([[[-1.8123e+00, -2.2030e+01,  3.1459e+00,  ..., -1.3725e+01,-6.1578e+00,  2.2611e+01],[ 4.1956e+00,  1.9670e+01,  0.0000e+00,  ...,  2.3616e+01,3.8118e+00,  6.4224e+01],[-7.8954e+00,  8.5818e+00, -7.8634e+00,  ...,  1.5810e+01,3.5864e-01,  1.8220e+01],[-2.5320e+01, -2.8745e+01, -3.6269e+01,  ..., -1.8110e+01,-1.7574e+01,  2.9502e+01]],[[-9.3402e+00,  1.0549e+01, -9.0477e+00,  ...,  1.5789e+01,2.6289e-01,  1.8317e+01],[-4.0251e+01,  1.5518e+01,  1.9928e+01,  ..., -1.4024e+01,-3.4640e-02,  1.8811e-01],[-2.6166e+01,  2.1279e+01, -1.1375e+01,  ..., -1.9781e+00,-6.4913e+00, -3.8984e+01],[ 2.1043e+01, -3.5800e+01,  6.4603e+01,  ...,  2.2372e+01,3.0018e+01, -3.0919e+01]]], grad_fn=<AddBackward0>)

编码器层

编码器层的作用:

作为编码器的组成单元,每个编码器层完成一次对输入的特征提取过程,即编码过程,如下图

code

# 编码器层
class EncoderLayer(nn.Module):def __init__(self,size,self_attn, feed_forward,dropout) -> None:"""size : 词嵌入维度self_attn: 多头自注意力子层实例化对象fee_forward: 前馈全连接层网络"""super(EncoderLayer,self).__init__()self.self_attn = self_attnself.feed_forward = feed_forward# 编码器中有两个子层结构,所以使用clone实现self.sublayer = clones(SublayerConnection(size, dropout),2)self.size = sizedef forward(self,x,mask):x = self.sublayer[0](x, lambda x: self.self_attn(x,x,x,mask))return self.sublayer[1](x,self.feed_forward)

测试代码放到最后

输出 

el_result.shape =  torch.Size([2, 4, 512])
el_result =  tensor([[[-1.4834e+01, -4.3176e+00,  1.2379e+01,  ..., -1.0715e+01,-6.8350e-01, -5.2663e+00],[-1.7895e+01, -5.9179e+01,  1.0283e+01,  ...,  9.7986e+00,2.2730e+01,  1.6832e+01],[ 5.0309e+00, -6.9362e+00, -2.6385e-01,  ..., -1.2178e+01,3.1495e+01, -1.9781e-02],[ 1.6883e+00,  3.9012e+01,  3.2095e-01,  ..., -6.1469e-01,3.8988e+01,  2.2591e+01]],[[ 4.8033e+00, -5.5316e+00,  1.4400e+01,  ..., -1.1599e+01,3.1904e+01, -1.4026e+01],[ 8.6239e+00,  1.3545e+01,  3.9492e+01,  ..., -8.3500e+00,2.6721e+01,  4.4794e+00],[-2.0212e+01,  1.6034e+01, -1.9680e+01,  ..., -4.7649e+00,-1.1372e+01, -3.3566e+01],[ 1.0816e+01, -1.7987e+01,  2.0039e+01,  ..., -4.7768e+00,-1.9426e+01,  2.7683e+01]]], grad_fn=<AddBackward0>)

编码器

编码器的作用:

编码器用于对输入进行指定的特征提取过程,也称为编码,由N个编码器层堆叠而成

code  

# 编码器
class Encoder(nn.Module):def __init__(self, layer,N) -> None:super(Encoder,self).__init__()self.layers = clones(layer,N)self.norm = LayerNorm(layer.size)def forward(self, x, mask):"""forward函数的输入和编码器层相同,x代表上一层的输出,mask代表掩码张量"""# 首先就是对我们克隆的编码器层进行循环,每次都会得到一个新的x,# 这个循环的过程,就相当于输出的x经过了N个编码器层的处理,# 最后再通过规范化层的对象self.norm进行处理,最后返回结果for layre in self.layers:x = layre(x,mask)return self.norm(x)

测试代码在下面:

输出:

en_result.shape :  torch.Size([2, 4, 512])
en_result :  tensor([[[-2.7477e-01, -1.1117e+00,  6.1682e-02,  ...,  6.7421e-01,-6.2473e-02, -4.6477e-02],[-7.7232e-01, -7.6969e-01, -2.0160e-01,  ...,  2.6131e+00,-1.9882e+00,  1.3715e+00],[-1.4178e+00,  2.6184e-01,  1.1888e-01,  ..., -9.9172e-01,1.3337e-01,  1.3132e+00],[-1.3268e+00, -1.1559e+00, -1.1774e+00,  ..., -8.1548e-01,-2.8089e-02,  1.4730e-03]],[[-1.3472e+00,  4.4969e-01, -4.3498e-02,  ..., -9.8910e-01,7.4551e-02,  1.1824e+00],[-2.2395e-02,  3.1730e-01,  6.8652e-02,  ...,  4.3939e-01,2.8600e+00,  3.2169e-01],[-7.2252e-01, -7.6787e-01, -7.5412e-01,  ...,  6.3915e-02,1.2210e+00, -2.3871e+00],[ 1.6294e-02, -4.8995e-02, -2.2887e-02,  ..., -7.7798e-01,4.4148e+00,  1.7802e-01]]], grad_fn=<AddBackward0>)

测试代码

from inputs import Embeddings,PositionalEncoding
import numpy as np
import torch
import torch.nn.functional as F
import torch.nn as nn
import matplotlib.pyplot as plt
import math
import copy def subsequent_mask(size):"""生成向后遮掩的掩码张量,参数size是掩码张量最后两个维度的大小,他们最好会形成一个方阵"""attn_shape = (1,size,size)# 使用np.ones方法向这个形状中添加1元素,形成上三角阵subsequent_mask = np.triu(np.ones(attn_shape),k=1).astype('uint8')# 最后将numpy类型转化为torch中的tensor,内部做一个1-的操作,# 在这个其实是做了一个三角阵的反转,subsequent_mask中的每个元素都会被1减# 如果是0,subsequent_mask中的该位置由0变成1# 如果是1,subsequent_mask中的该位置由1变成0return torch.from_numpy(1-subsequent_mask)def attention(query, key, value, mask=None, dropout=None):""" 注意力机制的实现,输入分别是query、key、value,mask此时输入的query、key、value的形状应该是 batch * number_token * embeding"""# 获取词嵌入的维度d_k = query.size(-1)# 根据注意力公示,将query和key的转置相乘,然后乘上缩放系数得到评分,这里为什么需要转置?# batch * number_token * embeding X batch * embeding * number_token = batch * number_token * number_token# 结果是个方阵scores = torch.matmul(query,key.transpose(-2,-1))/math.sqrt(d_k)# 判断是否使用maskif mask is not None:scores = scores.masked_fill(mask==0,-1e9)# scores 的最后一维进行softmax操作,为什么是最后一维?# 因为scores是方阵,每行的所有列代表当前token和全体token的相似度值,# 因此需要在列维度上进行softmaxp_attn = F.softmax(scores,dim=-1) # 这个就是最终的注意力张量# 之后判断是否使用dropout 进行随机置0if dropout is not None:p_attn = dropout(p_attn)# 最后,根据公式将p_attn与value张量相乘获得最终的query注意力表示,同时返回注意力张量# 计算后的 维度是多少呢?# batch * number_token * number_token X batch * number_token * embeding = # batch * number_token * embedingreturn torch.matmul(p_attn,value), p_attndef clones(module, N):"""用于生成相同网络层的克隆函数,N代表克隆的数量"""return nn.ModuleList([copy.deepcopy(module) for _ in range(N)])class MultiHeadedAttention(nn.Module):def __init__(self, head,embedding_dim,dropout=0.1) -> None:""" head 代表头的数量, embedding_dim 词嵌入的维度 """super(MultiHeadedAttention,self).__init__()# 因为多头是指对embedding的向量进行切分,因此头的数量需要整除embeddingassert embedding_dim % head == 0# 计算每个头获得分割词向量维度d_kself.d_k = embedding_dim // head# 传入头数self.head = head# 获得线形层对象,因为线性层是不分割词向量的,同时需要保证线性层输出和词向量维度相同# 因此线形层权重是方阵self.linears = clones(nn.Linear(embedding_dim,embedding_dim),4)# 注意力张量self.attn = None# dropoutself.dropout = nn.Dropout(p=dropout)def forward(self,query,key,value,mask=None):if mask is not None:# 拓展维度,因为有多头了mask = mask.unsqueeze(0)batch_size = query.size(0)# 输入先经过线形层,首先使用zip将网络层和输入数据连接一起,# 模型的输出利用view和transpose进行维度和形状的变换# (query,key,value) 分别对应一个线形层,经过线形层输出后,立刻对其进行切分,注意这里切分是对query经过线形层输出后进行切分,key经过线性层进行切分,value进行线性层进行切分,在这里才是多头的由来query,key,value = \[model(x).view(batch_size, -1, self.head,self.d_k).transpose(1,2) for model,x in zip(self.linears,(query,key,value))]# 将每个头的输出传入注意力层x,self.attn = attention(query,key,value,mask,self.dropout)# 得到每个头的计算结果是4维张量,需要进行形状的转换x = x.transpose(1,2).contiguous().view(batch_size,-1,self.head*self.d_k)return self.linears[-1](x)# 前馈全连接层
class PositionwiseFeedForward(nn.Module):def __init__(self, d_model, d_ff,dropout=0.1) -> None:""" d_mode :第一个线下层的输入维度d_ff   :隐藏层的维度dropout   :"""super(PositionwiseFeedForward,self).__init__()self.line1 = nn.Linear(d_model,d_ff)self.line2 = nn.Linear(d_ff,d_model)self.dropout = nn.Dropout(dropout)def forward(self,x):return self.line2(self.dropout(F.relu(self.line1(x))))# 规范化层
class LayerNorm(nn.Module):def __init__(self,features,eps=1e-6) -> None:# features 词嵌入的维度# eps 足够小的数据,防止除0,放到分母上super(LayerNorm,self).__init__()# 规范化层的参数,后续训练使用的self.w = nn.Parameter(torch.ones(features))self.b = nn.Parameter(torch.zeros(features))self.eps = epsdef forward(self, x):mean = x.mean(-1,keepdim=True)stddev = x.std(-1,keepdim=True)# * 代表对应位置进行相乘,不是点积return self.w*(x-mean)/(stddev+self.eps) + self.b# 子层连接结构
class SublayerConnection(nn.Module):def __init__(self,size,dropout=0.1) -> None:"""size : 词嵌入的维度"""super(SublayerConnection,self).__init__()self.norm = LayerNorm(size)self.dropout = nn.Dropout(dropout)def forward(self, x, sublayer):# sublayer 子层结构或者函数# x+ 跳跃层return x+self.dropout(sublayer(self.norm(x)))# 编码器层
class EncoderLayer(nn.Module):def __init__(self,size,self_attn, feed_forward,dropout) -> None:"""size : 词嵌入维度self_attn: 多头自注意力子层实例化对象fee_forward: 前馈全连接层网络"""super(EncoderLayer,self).__init__()self.self_attn = self_attnself.feed_forward = feed_forward# 编码器中有两个子层结构,所以使用clone实现self.sublayer = clones(SublayerConnection(size, dropout),2)self.size = sizedef forward(self,x,mask):x = self.sublayer[0](x, lambda x: self.self_attn(x,x,x,mask))return self.sublayer[1](x,self.feed_forward)# 编码器
class Encoder(nn.Module):def __init__(self, layer,N) -> None:super(Encoder,self).__init__()self.layers = clones(layer,N)self.norm = LayerNorm(layer.size)def forward(self, x, mask):"""forward函数的输入和编码器层相同,x代表上一层的输出,mask代表掩码张量"""# 首先就是对我们克隆的编码器层进行循环,每次都会得到一个新的x,# 这个循环的过程,就相当于输出的x经过了N个编码器层的处理,# 最后再通过规范化层的对象self.norm进行处理,最后返回结果for layre in self.layers:x = layre(x,mask)return self.norm(x)if __name__ == "__main__":# size = 5# sm = subsequent_mask(size)# print("sm: \n",sm.data.numpy())# plt.figure(figsize=(5,5))# plt.imshow(subsequent_mask(20)[0])# plt.waitforbuttonpress()# 词嵌入dim = 512vocab  =1000emb = Embeddings(dim,vocab)x = torch.LongTensor([[100,2,321,508],[321,234,456,324]])embr  =emb(x)print("embr.shape = ",embr.shape)# 位置编码pe = PositionalEncoding(dim,0.1) # 位置向量的维度是20,dropout是0pe_result = pe(embr)print("pe_result.shape = ",pe_result.shape)# 获取注意力值# query = key = value = pe_result # attn,p_attn = attention(query,key,value)# print("attn.shape = ",attn.shape)# print("p_attn.shape = ",p_attn.shape)# print("attn: ",attn)# print("p_attn: ",p_attn)# # 带mask# mask = torch.zeros(2,4,4)# attn,p_attn = attention(query,key,value,mask)# print("mask attn.shape = ",attn.shape)# print("mask p_attn.shape = ",p_attn.shape)# print("mask attn: ",attn)# print("mask p_attn: ",p_attn)# 多头注意力测试head = 8embedding_dim = 512dropout = 0.2query = key = value = pe_result# mask 是给计算出来的点积矩阵使用的,这个矩阵是方阵,tokenmask = torch.zeros(8,4,4) mha = MultiHeadedAttention(head,embedding_dim,dropout)mha_result = mha(query,key,value,mask)print("mha_result.shape = ",mha_result.shape)print("mha_result: ",mha_result)# 前馈全连接层 测试x = mha_resultd_model  =512d_ff=128dropout = 0.2ff = PositionwiseFeedForward(d_model, d_ff, dropout)ff_result = ff(x)print("ff_result.shape = ",ff_result.shape)print("ff_result = ",ff_result)# 规范化层测试features = d_model = 512esp = 1e-6ln = LayerNorm(features,esp)ln_result = ln(ff_result)print("ln_result.shape = ",ln_result.shape)print("ln_result = ",ln_result)# 子层连接结构 测试size = 512dropout=0.2head=8d_model=512x = pe_resultmask = torch.zeros(8,4,4)self_attn = MultiHeadedAttention(head,d_model,dropout)sublayer = lambda x:self_attn(x,x,x,mask) # 子层函数sc = SublayerConnection(size,dropout)sc_result = sc(x,sublayer)print("sc_result.sahpe = ", sc_result.shape)print("sc_result = ", sc_result)# 编码器层 测试size = 512dropout=0.2head=8d_model=512d_ff = 64x = pe_resultmask = torch.zeros(8,4,4)self_attn = MultiHeadedAttention(head,d_model,dropout)ff = PositionwiseFeedForward(d_model,d_ff,dropout)mask = torch.zeros(8,4,4)el = EncoderLayer(size,self_attn,ff,dropout)el_result = el(x,mask)print("el_result.shape = ", el_result.shape)print("el_result = ", el_result)# 编码器测试size = 512dropout=0.2head=8d_model=512d_ff = 64c = copy.deepcopyx = pe_resultself_attn = MultiHeadedAttention(head,d_model,dropout)ff = PositionwiseFeedForward(d_model,d_ff,dropout)# 编码器层不是共享的,因此需要深度拷贝layer= EncoderLayer(size,c(self_attn),c(ff),dropout)N=8mask = torch.zeros(8,4,4)en = Encoder(layer,N)en_result = en(x,mask)print("en_result.shape : ",en_result.shape)print("en_result : ",en_result)

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

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

相关文章

图片如何无损放大?分享三个方法帮你快速解决

在数字时代&#xff0c;图片已成为我们生活的重要组成部分&#xff0c;无论是社交媒体的分享&#xff0c;还是专业设计的呈现&#xff0c;都离不开高质量的图片。然而&#xff0c;当我们试图放大一张图片以获取更多细节时&#xff0c;常常会遇到一个令人头疼的问题——失真。此…

多版本jdk共享jar

多版本jdk共享jar Java 9的一个有趣特性是支持多版本JAR文件。这是什么意思?过去&#xff0c;库开发人员在支持新版本的Java时有三种选择: 提供两个(或更多)不同的JAR文件&#xff0c;每个文件对应他们想要支持的Java版本。它们的版本号可能是“1.2-java-5”和“1.2-java-1.…

小工具——抖音短视频评论自动同步

很多时候喜欢看抖音的评论&#xff0c;有时候评论也是一个查疑解惑的好地方&#xff0c;很多人也喜欢把抖音的评论集中起来做分析。 因为一个朋友问过我这回事&#xff0c;闲着的时候也研究了下抖音&#xff0c;所以自己做了个小工具&#xff0c;自动同步你观看的抖音短视频的…

解读人工智能的理论基石

1956年的一个夏天&#xff0c;在达特茅斯学院的一个小会议室里&#xff0c;一群充满好奇和野心的年轻科学家聚集在一起&#xff0c;他们有一个共同的梦想&#xff1a;创造能够模仿人类智能的机器。这不仅仅是科幻小说的情节&#xff0c;更是人工智能历史上一个真实的起点。从那…

深度强化学习入门(待修改)

目录 前言 一、强化学习 1.马可洛夫链 2.蒙地卡罗 3.时序差分TD 4.gym学习​编辑 FrozenLake 二、RL基本算法 1.Q-learning和SARSA 2.DQN Deep network Qlearning DQN 三、PG策略算法 总结 前言 这段时间学习深度强化学习的总结。 一、强化学习 强化学习是做出最佳决策的科学…

useState多次渲染页面卡顿 useMemo

useState多次渲染页面卡顿 state变化了组件自然应该重新进行渲染&#xff0c;但有时我们并不需要。 React.memo()(useMemo)是一个高阶组件&#xff0c;它接收另一个组件作为参数&#xff0c;并且会返回一个包装过的新组件&#xff0c;包装过的新组件就会具有缓存作用&#xff…

Freesia 构建本地项目与远程仓库

构建远程仓库 1. 创建一个项目目录&#xff0c;根据创建远程仓库后的提示来进行 2. 本地仓库初始化 git init 初始化git文件 cd 项目目录 git init创建并提交README.md文件 touch README.md git commit -m "first commit"将本地仓库连接到远程仓库 git remote …

基于session注册JAva篇springboot

springboot3全家桶&#xff0c;数据库 &#xff1a;redis&#xff0c;mysql 背景环境&#xff1a;邮箱验证码&#xff0c;验证注册 流程&#xff1a;先通过邮箱验证&#xff0c;发送验证码&#xff0c;将获取到的session和验证码&#xff0c;存入redis里&#xff08;发送邮箱…

js截取图片地址后面的参数和在路径中截取文件名或后缀名

文章目录 前言截取地址 &#xff1f;后面的参数在路径中截取文件名或后缀名总结 前言 在处理网页上的图片资源或者其他类型的文件资源时&#xff0c;你可能会遇到需要使用这些技巧的情况。以下是一些具体的使用场景&#xff1a; 动态修改图片参数&#xff1a;如果你有一个图片U…

2024年【制冷与空调设备运行操作】考试总结及制冷与空调设备运行操作模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 制冷与空调设备运行操作考试总结参考答案及制冷与空调设备运行操作考试试题解析是安全生产模拟考试一点通题库老师及制冷与空调设备运行操作操作证已考过的学员汇总&#xff0c;相对有效帮助制冷与空调设备运行操作模…

《PyTorch深度学习实践》第八讲加载数据集

一、 1、DataSet 是抽象类&#xff0c;不能实例化对象&#xff0c;主要是用于构造我们的数据集 2、DataLoader 需要获取DataSet提供的索引[i]和len;用来帮助我们加载数据&#xff0c;比如说做shuffle(提高数据集的随机性)&#xff0c;batch_size,能拿出Mini-Batch进行训练。它…

Entry First Day 入职恩孚第一天

入职第一天&#xff0c;电脑还没配置好就去了工厂。 熟悉了一下设备&#xff0c;切了几个小玩意&#xff0c; hello world 一下。 了解了串行端口的Nodejs的库 https://github.com/serialport/node-serialport&#xff0c;以后要用这个东西和硬件通讯&#xff0c;安装&#…

【C++精简版回顾】15.继承派生

1.继承派生的区别 继承&#xff1a;子继父业&#xff0c;就是子类完全继承父类的全部内容 派生&#xff1a;子类在父类的基础上发展 2.继承方式 1.public继承为原样继承 2.protected继承会把public继承改为protect继承 3.private继承会把public&#xff0c;protected继承改为pr…

指针与malloc动态内存申请,堆和栈的差异

定义了两个函数print_stack()和print_malloc()&#xff0c;分别演示了两种不同的内存分配方式&#xff1a;栈内存和堆内存。然后在main()函数中调用这两个函数&#xff0c;并将它们返回的指针打印出来。 由于print_stack()中的数组c是在栈上分配的&#xff0c;当函数返回后&…

【论文笔记】An Effective Adversarial Attack on Person Re-Identification ...

原文标题&#xff08;文章标题处有字数限制&#xff09;&#xff1a; 《An Effective Adversarial Attack on Person Re-Identification in Video Surveillance via Dispersion Reduction》 Abstract 通过减少神经网络内部特征图的分散性攻击reid模型。 erbloo/Dispersion_r…

【论文阅读-基于VilLBERT方法的导航】Vison-Language Navigation 视觉语言导航(2)

文章目录 1. 【2023ICCV】Learning Vision-and-Language Navigation from YouTube Videos摘要和结论引言Building VLN Dataset from YouTube Videos模型框架实验 2. 【2021ICCV】Airbert: In-domain Pretraining for Vision-and-Language Navigation摘要和结论引言BnB DatasetA…

爬取某牙视频

爬取页面链接&#xff1a;游戏视频_游戏攻略_虎牙视频 爬取步骤&#xff1a;点进去一个视频播放&#xff0c;查看media看有没有视频&#xff0c;发现没有。在xhr中发现有许多ts文件&#xff0c;但这种不是很长的视频一般都有直接的播放链接&#xff0c;所以目标还是找直接的链…

逻辑漏洞(pikachu)

#水平&#xff0c;垂直越权&#xff0c;未授权访问 通过个更换某个id之类的身份标识&#xff0c;从而使A账号获取&#xff08;修改、删除&#xff09;B账号数据 使用低权限身份的账号&#xff0c;发送高权限账号才能有的请求&#xff0c;获得其高权限操作 通过删除请求中的认…

爱普生的SG2016系列高频,低相位抖动spxo样品

精工爱普生公司(TSE: 6724&#xff0c;“爱普生”)已经开始发货样品的新系列简单封装晶体振荡器(SPXO)与差分输出1。该系列包括SG2016EGN、SG2016EHN、SG2016VGN和SG2016VHN。它们在基本模式下都具有低相位抖动&#xff0c;并且采用尺寸为2.0 x 1.6 mm的小封装&#xff0c;高度…

【兔子机器人】五连杆运动学解算与VMC(virtual model control)

VMC (virtual model control&#xff0c;虚拟模型控制) 是一种直觉控制方式&#xff0c;其关键是在每个需要控制的自由度上构造恰当的虚拟构件以产生合适的虚拟力。虚拟力不是实际执行机构的作用力或力矩&#xff0c;而是通过执行机构的作用经过机构转换而成。对于一些控制问题…