Deep learning 如何在pytorch中连接嵌入层

Deep learning 如何在pytorch中连接嵌入层,deep-learning,concatenation,pytorch,embedding,Deep Learning,Concatenation,Pytorch,Embedding,我正在尝试将嵌入层与其他功能连接起来。它不会给我任何错误,但也不会做任何训练。这个模型定义有什么问题吗?如何调试 注意:my X中的最后一列(功能)是带有word2ix(单个单词)的功能。 注:如果没有嵌入功能/层,网络工作正常 最初发布在pytorch上 类别网络(火炬网络模块): def_uuuinit_uuu(self、n_功能、h_大小、num_单词、嵌入尺寸、out_大小、dropout=None): super()。\uuuu init\uuuuu() self.num_layer

我正在尝试将嵌入层与其他功能连接起来。它不会给我任何错误,但也不会做任何训练。这个模型定义有什么问题吗?如何调试

注意:my X中的最后一列(功能)是带有word2ix(单个单词)的功能。 注:如果没有嵌入功能/层,网络工作正常

最初发布在pytorch上


类别网络(火炬网络模块):
def_uuuinit_uuu(self、n_功能、h_大小、num_单词、嵌入尺寸、out_大小、dropout=None):
super()。\uuuu init\uuuuu()
self.num_layers=len(h_大小)#隐藏+输入
self.embedding=torch.nn.embedding(num\u words,embed\u dim)
self.hidden=torch.nn.ModuleList()
self.bnorm=torch.nn.ModuleList()
如果辍学者不是无:
self.dropout=torch.nn.ModuleList()
其他:
self.dropout=无
对于范围内的k(透镜(h_尺寸)):
如果k==0:
self.hidden.append(torch.nn.Linear(n_特征,h_大小[0]))
self.bnorm.append(torch.nn.BatchNorm1d(h_size[0]))
如果self.dropout不是None:
self.dropout.append(torch.nn.dropout(p=dropout))
其他:
如果k==1:
输入尺寸=h尺寸[0]+嵌入尺寸
其他:
输入尺寸=h尺寸[k-1]
self.hidden.append(torch.nn.Linear(输入尺寸,h尺寸[k]))
self.bnorm.append(torch.nn.BatchNorm1d(h_size[k]))
如果self.dropout不是None:
self.dropout.append(torch.nn.dropout(p=dropout))
#输出层
self.out=torch.nn.线性(h_尺寸[-1],out_尺寸)
def前进档(自身,输入):
#前馈
对于范围内的l(self.num\u层):
如果l==0:
x=self.hidden[l](输入[:,:-1])
x=自身.B形式[l](x)
如果self.dropout不是None:
x=自退出[l](x)
embeds=self.embedding(输入[:,-1])#.view((1,-1)
x=焊炬。类别((嵌入件,x),尺寸=1)
其他:
x=自隐藏[l](x)
x=自身.B形式[l](x)
如果self.dropout不是None:
x=自退出[l](x)
x=F.relu(x)
输出=自输出(x)
返回输出

有几个问题。关键问题是数据类型。我混合了浮点特性和整数索引

修复前的样本数据和培训:

NUM_目标=4
NUM_FEATURES=3
NUM_TEXT_FEATURES=1
x=np.random.rand(5,NUM\u特征)
y=np.random.rand(5,NUM_目标)
单词_ix=np.arange(5)。重塑(-1,1)。aType(int)
x_列=np.追加(x,单词x,轴=1)
x\u列=火炬从\u numpy(x).float()到(设备)
y\u列=火炬。从y.float()到(设备)
h_尺寸=[2,2]
net=net(x_train.shape[1],h_size=h_size,num_words=5,embed_dim=2,out_size=y_train.shape[1],dropout=.01)#定义网络
打印(网络)#网络架构
net=net.float()
net.to(设备)
optimizer=torch.optim.Adam(净参数(),lr=0.0001,权重衰减=0.01)
损失_func=torch.nn.MSELoss()#这是回归均方损失
#一个训练循环
预测=净(x#列车)#输入x并基于x进行预测
损失=损失函数(预测,y序列)#必须是(1.nn输出,2.target)
optimizer.zero_grad()#为下一列车清除坡度
loss.backward()#反向传播,计算梯度
optimizer.step()#应用渐变
#列\u loss.append(loss.detach().to('cpu').numpy())
为了解决这个问题,我将单词索引功能从x中分离出来,并删除了
net.float()

将数据类型转换更改为:

x\u train=torch.from\u numpy(x).float()到(设备)
y\u列=火炬。从y.float()到(设备)
#注意:单词索引需要很长
word_ix=火炬。from_numpy(word_ix)。to(火炬。长)。to(设备)
转发
方法更改为:


def转发(自身、输入、字_ix):
#前馈
对于范围内的l(self.num\u层):
如果l==0:
x=自隐藏[l](输入)
x=自身.B形式[l](x)
如果self.dropout不是None:
x=自退出[l](x)
嵌入=自嵌入(word_ix)
#注:
#嵌入的形状为(批量大小,1,嵌入尺寸)
#若要将此更改与x合并,请将其重塑为
#(批量大小、嵌入尺寸)
embeds=embeds.view(embeds.shape[0],embeds.shape[2])
x=焊炬目录((x,嵌入视图(x.shape)),尺寸=1)
其他:
x=自隐藏[l](x)
x=自身.B形式[l](x)
如果self.dropout不是None:
x=自退出[l](x)
x=F.relu(x)
输出=自输出(x)
返回输出

是整数类型或单词(比如
字符串
)的
输入吗?您可以打印上次功能返回的值并检查嵌入(可能是
self。在您的情况下,嵌入
始终返回占位符值
0
)。这意味着什么?没有培训?损失根本不会改变,还是发散或挂起?嵌入得到整数索引。我使用word2ix并将其作为最后一列添加到输入。将尝试用小示例进行更新。请添加所有相关部分(例如,
word2ix
函数)及其调用。是的,拥有MCVE将非常棒。