nn.Embedding维度的转变(RDCM)

原本代码是:第37行 self.load_embeddings()

应该写成下图中:34行那里self.embedding = nn.Embedding(self.vocab_size, self.embedding_dim)

其中:

1 self.vocab_size 是词汇表的大小,也就是所有可能的单词或标记的数量。例如,如果你有一个包含10,000个唯一单词的词汇表,那么 self.vocab_size 就是10,000。

2 self.embedding_dim 是嵌入向量的维度。例如,如果你设置 self.embedding_dim 为100,那么每个单词将被表示为一个100维的向量。

self.vocab_size = 1000:原本定义的self.vocab_size=1000,但报错“IndexError: index out of range in self”,考虑把它换成50000,就好了

3 维度的转变:传入的x是(32,39),x = self.embedding(x)变成(32,39,100),self.embedding(x).transpose(1, 2)变成(32,100,39),其中32是batchsize,100是inchannel,39是张量的宽度,卷积核在这上面移动,由于卷积核分别是3,4,5,步长都是1,经过卷积变化得到的x分别是(32,100,37),(32,100,36),(32,100,35)较大的卷积核能够捕捉输入数据中更大范围的空间模式或特征,但需要的参数也更多,x = [F.relu(conv(x)) for conv in self.conv],x变成包含3个张量的列表,x = [F.max_pool1d(c, c.size(-1)).squeeze(dim=-1) for c in x],对列表中的每个x都进行池化,与卷积类似,都有核,作用对象也都是宽度,以x中的(32,100,37)为例,对37进行最大池化,得到(32,100,1),squeeze(dim=-1)的含义是,如果最后一维的值为1,就去除最后一维,由此x变成了包含3个(32,100)的列表,x = torch.cat(x, dim=1),x变成(32,300),x = self.fc(self.dropout(x)),fc是一个300,100的线性层,x变成(32,100)

### PyTorch `nn.Embedding` 的维度参数及使用方法 #### 词典大小 (`num_embeddings`) `num_embeddings` 表示词典的大小,即索引的总数。这决定了可以嵌入多少个同的单词或标记[^2]。 例如,在一个有 20 个同单词的小型词汇表中: ```python import torch from torch import nn vocab_size = 20 # 即 num_embeddings embedding_layer = nn.Embedding(vocab_size, embedding_dim=5) ``` #### 嵌入向量维度 (`embedding_dim`) `embedding_dim` 定义了每个嵌入向量的维度。这个值越小,模型可能丢失的信息越多;越大则可能导致过拟合并增加计算成本。 对于上述例子中的五维向量: ```python word_indices = torch.tensor([0, 1, 2]) # 输入三个词语的位置编号 embedded_vectors = embedding_layer(word_indices) print(embedded_vectors.shape) # 输出应为 (3L, 5L),其中 L 表明这是 Long 类型张量 ``` 这段代码会创建一个形状为 `(3, 5)` 的二维张量,每一行代表输入列表里相应位置上的单词所对应的嵌入向量[^3]。 #### 可选参数 除了必填项外还有几个有用的选项: - **sparse**: 如果设置为 `True` 则允许更高效的梯度更新方式——仅针对非零元素做优化操作。 - **padding_idx**: 设定某个特定索引作为填充符,默认情况下所有未指定的索引都会被随机初始化[^4]。 #### 实际应用案例 考虑如下场景:假设有一个包含两个单词 "python" 和 "pytorch" 的小型词汇表,并希望获取它们各自的嵌入表示形式: ```python # 初始化 Embedding 层,假设有两词组成的极简词汇表 minimal_vocab_embedding = nn.Embedding(num_embeddings=2, embedding_dim=5) # 获取这两个词的索引 indices_tensor = torch.LongTensor([0, 1]) # 计算得到相应的嵌入矩阵 resulting_embeddings = minimal_vocab_embedding(indices_tensor) for idx, word_vector in enumerate(resulting_embeddings): print(f"{['python', 'pytorch'][idx]} 对应的词向量为:\n {word_vector.detach().numpy()}") ``` 此段脚本将会打印出 `"python"` 和 `"pytorch"` 各自关联的五维浮点数数组[^1]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值