m0_72190144 2022-08-14 21:34 采纳率: 100%
浏览 80
已结题

embedding的原理

我想在matlab 上复现一段python代码的功能
主要是将一段DNA序列用(1 2 3 4)编码后提取特征矩阵
然后进行神经网络训练。
这里第一步就是用embedding把数字变成向量
但是我不知道这里的向量究竟是如何得到的?
是依据我输入的数组的数据的关系还是有一个词典进行匹配?(我觉得更有可能是前者,但是不知道具体怎么得到的)

def __init__(self):
        super(Prediction, self).__init__()
        self.Embedding = torch.nn.Embedding(num_embeddings=5,embedding_dim=DIM_embedding)
        self.dropout = nn.Dropout(p=0.2)
        
        self.conv1 = nn.Conv1d(in_channels = DIM_embedding, out_channels = DIM, kernel_size = 5,padding = 2)
        self.BatchNorm1d = nn.BatchNorm1d(DIM)
        self.relu1 = nn.ReLU()
        self.MaxPool1d = nn.MaxPool1d(kernel_size=2)
       
        self.conv2 = nn.Conv1d(in_channels = DIM, out_channels = DIM, kernel_size = 5,padding = 2)
        self.BatchNorm1d = nn.BatchNorm1d(DIM)
        self.relu1 = nn.ReLU()
        self.MaxPool1d = nn.MaxPool1d(kernel_size=3,stride=2)
        
        self.dropout = nn.Dropout(p=0.2)
        self.LSTM = nn.LSTM(input_size=DIM,hidden_size=DIM,num_layers=1)
        self.linear = nn.Linear(60 * DIM, 1)
        
    def forward(self,x):
        x = self.Embedding(x) #(batch_size, seq_len, embedding_dim)
        x = self.dropout(x)  #(batch_size, seq_len, embedding_dim)
        
        x = x.permute(0, 2, 1)#(batch_size, embedding_dim, seq_len)
        x = self.conv1(x)   #(batch_size, dim, seq_len)
        x = self.dropout(x)
        x = self.relu1(x)#(batch_size, dim, seq_len)
        x = self.MaxPool1d(x)#(batch_size, dim, 30)
        #x = self.BatchNorm1d(x)#(batch_size, dim, 30)
        x = x.permute(0, 2, 1)#(batch_size,30,dim,)
        x1,(hn,cn) = self.LSTM(x)#(batch_size, 30, dim)
        
        x = x.permute(0, 2, 1)#(batch_size, dim, 30)
        x = self.conv2(x)   #(batch_size, dim, 30)
        x = self.dropout(x)
        x = self.relu1(x)#(batch_size, dim, 30)
        x = self.BatchNorm1d(x)#(batch_size, dim, 30)
        x = x.permute(0, 2, 1)#(batch_size,30,dim,)
        x2,(hn,cn) = self.LSTM(x)#(batch_size, 30, dim)
        
        x = torch.cat((x1,x2),1)
        x = self.dropout(x)
        x = torch.reshape(x, (-1, 60 * DIM)) #(batch_size, seq_len * dim)
        x = self.linear(x) #(batch_size, 1)
        x = x.squeeze(-1)
        return x

希望知道这里的nn.embedding的底层原理,就是数字和嵌入的向量的关系
另外不知道有没有能在matlab上能实现类似的num2vec的功能的函数
万分感谢

  • 写回答

2条回答 默认 最新

  • kakaccys 2022-08-14 22:04
    关注

    embedding的原理你可以去搜cbow和skip-gram,说白了就是用两边的字或词预测中间的,或者用中间的字或词预测两边的。
    第一,每个文本,我们可以取字也可以取词,以字为例,先生成字典{"以":0,"字":1,"为":2,"例":3}
    第二,然后将上述字典转为one-hot。
    第三,开始将文本放入训练,以cbow为例,说白了比如训练"为"这个字的时候,x是以,字,例等one-hot,y是为的one-hot,中间计算说白了就是神经网络。
    至于matlab里,我看他官网有,但是我还是劝你早点用python吧,有时候选择比努力更重要。
    https://ww2.mathworks.cn/products/text-analytics.html

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 3月7日
  • 已采纳回答 2月27日
  • 创建了问题 8月14日

悬赏问题

  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败
  • ¥15 树莓派5怎么用camera module 3啊
  • ¥20 java在应用程序里获取不到扬声器设备
  • ¥15 echarts动画效果的问题,请帮我添加一个动画。不要机器人回答。
  • ¥15 Attention is all you need 的代码运行