1.7 理解 Dropout

主要用在计算机视觉领域

每次迭代都会随机剔除一些隐藏单元。
在这里插入图片描述

class TransformerEmbedding(nn.Module): def __init__(self, config): super().__init__() # hyper params self.vocab_size = config["vocab_size"] self.hidden_size = config["d_model"] # 词向量维度 self.pad_idx = config["pad_idx"] dropout_rate = config["dropout"] self.max_length = config["max_length"] # layers,设置padding_idx可以让pad的词向量全为0 self.word_embedding = nn.Embedding( self.vocab_size, self.hidden_size, padding_idx=self.pad_idx ) self.pos_embedding = nn.Embedding( self.max_length, self.hidden_size, _weight=self.get_positional_encoding( self.max_length, self.hidden_size ),# 位置编码,权重通过get_positional_encoding函数计算得到 ) self.pos_embedding.weight.requires_grad_(False) # 不更新位置编码的权重 self.dropout = nn.Dropout(dropout_rate) # 随机失活层 def get_word_embedding_weights(self): return self.word_embedding.weight # 计算位置信息 @classmethod def get_positional_encoding(self, max_length, hidden_size):#max_length是最大长度,hidden_size是embedding维度相等 # Compute the positional encodings once in log space. pe = torch.zeros(max_length, hidden_size) # 初始化位置编码 # .unsqueeze(1) 是将这个一维张量转换为二维张量,即将其形状从 (max_length,) 变为 (max_length, 1)。这个操作在张量的维度上增加了一个维度,使其从一维变为二维,第二维的大小为 1。 position = torch.arange(0, max_length).unsqueeze(1) # 位置信息,从0到max_length-1 div_term = torch.exp( torch.arange(0, hidden_size, 2) * -(torch.log(torch.Tensor([10000.0])) / hidden_size) )# 计算位置编码的权重,为了性能考量(是数学上的对数函数分解) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) return pe def forward(self, input_ids): # input_ids: [batch_size, seq_len] seq_len = input_ids.shape[1] assert ( seq_len <= self.max_length ), f"input sequence length should no more than {self.max_length} but got {seq_len}" position_ids = torch.arange(seq_len, dtype=torch.long, device=input_ids.device) position_ids = position_ids.unsqueeze(0).expand_as(input_ids) print(position_ids) #为了调试 # embedding word_embeds = self.word_embedding(input_ids) # 词嵌入 pos_embeds = self.pos_embedding(position_ids) # 位置编码 embeds = word_embeds + pos_embeds embeds = self.dropout(embeds) return embeds这个代码举个具体的例子
03-27
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值