赞
踩
在Colab环境下安装包
class RNN(nn.Module): def __init__(self,vocab_size,embedding_dim,hidden_dim): super(RNN,self).__init__() # [vocab_size 10000] => [embedding_dim:100] self.embedding = nn.Embedding(vocab_size,embedding_dim) # [embedding_dim 100] => [hidden_dim 256] 两层 双向lstm dropout防止过拟合 self.rnn = nn.LSTM(embedding_dim,hidden_dim,num_layers=2,bidirectional=True,dropout=0.5) # lstm输出的h层信息[256*2] => 1 self.fc = nn.Linear(hidden_dim*2,1) self.dropout = nn.Dropout(0.5) def forward(self,x): # [seq,b,1] => [seq,b,100] embedding = self.dropout(self.embedding(x)) # output:[seq,b,hidden*2] # hidden/h:[num_layers*2,b,hid_dim] # cell/c:[num_layers*2,b,hid_dim] output,(hidden,cell) = self.rnn(embedding) # [num_layers*2,b,hid_dim] => 拼接2个[b,hid_dim] => [b,hid_dim*2] hidden = torch.cat([hidden[-2],hidden[-1]],dim=1) hidden = self.dropout(hidden) # [b,hid_dim*2] => [b,1] out = self.fc(hidden) return out
def train(rnn,iterator,optimizer,criterion): avg_acc = [] rnn.train() for i,batch in enumerate(iterator): # [seq,b] => [b,1] = [b] pred = rnn(batch.text).squeeze(1) loss = criterion(pred,batch.label) acc = binary_acc(pred,batch.label).item() avg_acc.append(acc) optimizer.zero_grad() loss.backward() optimizer.step() if i%10==0: print(i,acc) avg_acc = np.array(avg_acc).mean() print('avg_acc',avg_acc)
def binary_acc(preds,y): preds = torch.round(torch.sigmoid(preds)) correct = torch.eq(preds,y).float() acc = correct.sum()/len(correct) return acc def eval(rnn,iterator,criterion): avg_acc = [] rnn.eval() with torch.no_grad(): for batch in iterator: pred = rnn(batch.text).squeeze(1) loss = criterion(pred,batch.label) acc = binary_acc(pred,batch.label).item() avg_acc.append(acc) avg_acc = np.array(avg_acc).mean() print('>>test:',avg_acc)
2. 初始化模型 用GLoVe编码的权重 替换 模型的embedding权重
设置batch_size optimizer criterion
epoch 训练
用Gensim/GLoVe/Bert预训练获得的词向量进行LSTM训练 会获得更好的性能
可以见这篇blogNLP 预训练
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。