日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手教你实现基于LSTM的情感分析(LSTM-based Sentiment) Classification

發布時間:2025/3/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你实现基于LSTM的情感分析(LSTM-based Sentiment) Classification 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先推薦一個Jupyter環境,是由Google提供的colab(https://colab.research.google.com/),有免費的GPU可以使用

第一次使用需要在實驗環境中下載相關的python庫

!pip install torch !pip install torchtext !python -m spacy download en

我們初步的設想是,首先將一個句子輸入到LSTM,這個句子有多少個單詞,就有多少個輸出,然后將所有輸出通過一個Linear Layer,這個Linear Layer的out_size是1,起到Binary Classification的作用

然后對于每個輸入,我們需要先要進行Embedding,把每個單詞轉換成固定長度的vector,再送到LSTM里面去,假設每個單詞我們都用一個長度為100的vector來表示,每句話有seq個單詞(動態的,每句話的seq長度不一定一樣),那么輸入的shape就是[seq, b, 100]。最終通過Linear Layer輸出的的shape就是[b]

我們使用的數據集是torchtext庫里面的IMDB數據集

import torch from torch import nn, optim from torchtext import data, datasetsprint("GPU:",torch.cuda.is_available()) torch.manual_seed(123)TEXT = data.Field(tokenize='spacy') LABEL = data.LabelField(dtype=torch.float) train_data, test_data = datasets.IMDB.splits(TEXT, LABEL)print('len of train data:', len(train_data)) print('len of test data:', len(test_data))print(train_data.examples[15].text) print(train_data.examples[15].label)# word2vec, glove TEXT.build_vocab(train_data, max_size=10000, vectors='glove.6B.100d') LABEL.build_vocab(train_data)batch_size = 30 device = torch.device('cuda') train_iterator, test_iterator = data.BucketIterator.splits((train_data, test_data),batch_size = batch_size,device = device )

上面這些代碼里面有些參數不懂不要緊,因為只是加載數據集而已,不是很重要。如果想要了解torchtext,可以看這篇文章(https://blog.csdn.net/u012436149/article/details/79310176)

接下來比較重要,定義網絡結構

class RNN(nn.Module):def __init__(self, vocab_size, embedding_dim, hidden_dim):super(RNN, self).__init__()# [0-10001] => [100]self.embedding = nn.Embedding(vocab_size, embedding_dim)# [100] => [200]self.rnn = nn.LSTM(embedding_dim, hidden_dim, num_layers=2,bidirectional=True, dropout=0.5)# [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, hid_dim*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 of [b, hid_dim] => [b, hid_dim*2]hidden = torch.cat([hidden[-2], hidden[-1]], dim=1)# [b, hid_dim*2] => [b, 1]hidden = self.dropout(hidden)out = self.fc(hidden)return out

nn.embedding(m, n)其中m表示單詞的總數目,n表示詞嵌入的維度(每個單詞編碼為長度為n的vector)

然后就是LSTM本身,這里就不做過多解釋了,參數介紹可以查看我的這篇文章(https://wmathor.com/index.php/archives/1400/),其中有一點之前的文章中沒有提到,就是這個bidirectional參數,設置為True表示這個LSTM是雙向的,很好理解,之前學過的RNN都是單向的,很有局限,例如下面這句話

  • 我今天不舒服,我打算___一天

如果是單向RNN,這個空肯定會填"醫院"或者"睡覺"之類的,但是如果是雙向的,它就能知道后面跟著"一天",這時"請假","休息"之類的被選擇的概率就會更大

最后的Fully Connected Layer可以理解為把所有輸出的信息做個綜合,轉化為一個一維的tensor

rnn = RNN(len(TEXT.vocab), 100, 256) pretrained_embedding = TEXT.vocab.vectors print('pretrained_embedding:', pretrained_embedding.shape) rnn.embedding.weight.data.copy_(pretrained_embedding) print('embedding layer inited.')

Embedding層如果不初始化,生成的權值是隨機的,所以必須要初始化,這個權值是通過下載Glove編碼方式得到的,下載得到的其實就是個weight,直接覆蓋掉embedding里面的weight,通過rnn.embedding.weight.data.copy_(pretrained_embedding)的方式

然后我們看一下怎么Train這個網絡

import numpy as npdef binary_acc(preds, y):"""get accuracy"""preds = torch.round(torch.sigmoid(preds))correct = torch.eq(preds, y).float()acc = correct.sum() / len(correct)return accdef train(rnn, iterator, optimizer, criteon):avg_acc = []rnn.train()for i, batch in enumerate(iterator):# [seq, b] => [b, 1] => [b]pred = rnn(batch.text).squeeze()loss = criteon(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)

Train其實很簡單了,就是把text丟進去,然后返回一個shape為[b, 1]的output,利用squeeze()函數,去掉其中維數為1的維度,shape變成[b],方便與label進行比較

同樣的道理,Test也非常簡單

def eval(rnn, iterator, criteon):avg_acc = []rnn.eval()with torch.no_grad():for batch in iterator:# [b, 1] => [b]pred = rnn(batch.text).squeeze()loss = criteon(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)

最后定義一下loss和optimizer

optimizer = optim.Adam(rnn.parameters(), lr=1e-3) criteon = nn.BCEWithLogitsLoss().to(device) rnn.to(device)

其中BCEWithLogitsLoss()主要用于二分類問題。nn.BCELoss()是針對二分類用的交叉熵,這倆都是用于二分類,有什么區別呢?區別在于BCEWithLogitsLoss將Sigmoid層和BCELoss合并在了一起。如果還是覺得不理解,可以看下這篇博客(https://blog.csdn.net/qq_22210253/article/details/85222093)

ipynb版本代碼(https://github.com/wmathor/file/blob/master/LSTM.ipynb)

py版本代碼(https://github.com/wmathor/file/blob/master/LSTM.py)

往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習在線手冊深度學習在線手冊AI基礎下載(pdf更新到25集)備注:加入本站微信群或者qq群,請回復“加群”獲取一折本站知識星球優惠券,請回復“知識星球”喜歡文章,點個在看

總結

以上是生活随笔為你收集整理的手把手教你实现基于LSTM的情感分析(LSTM-based Sentiment) Classification的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产色99 | 日本少妇做爰全过程毛片 | 啪啪免费小视频 | 69av片| 国产欧美精品一区二区在线播放 | 一级v片| 欧美日韩中文字幕在线 | 国产又粗又猛又黄视频 | 97人妻天天摸天天爽天天 | 91免费观看入口 | 国产日韩亚洲 | 欧美精品在线免费观看 | 国产ts网站 | 日韩欧美中文字幕一区二区三区 | 国产高潮又爽又无遮挡又免费 | wwwwww国产| 妞妞av| 一级黄色大片在线观看 | 国产日韩在线一区 | h色视频在线观看 | 日韩亚洲欧美一区二区三区 | 制服丝袜中文字幕在线 | 魔性诱惑 | 精品人人妻人人澡人人爽牛牛 | 五月婷婷开心中文字幕 | 午夜影院操 | 你懂的在线网站 | 欧美一级黄色片 | 亚洲区一区二区 | 久久久亚洲精品无码 | 最新免费av | 痴女扩张宫交脱垂重口小说 | 精品麻豆视频 | 琪琪色av | 99亚洲视频 | 黄色片99 | av一区二区三区 | 天天色综 | 中文字字幕在线 | 偷拍xxxx| 在线观看国产一区二区 | av在线色 | jiizzyou欧美2 | 欧美一级在线观看 | 国产三级按摩推拿按摩 | 91瑟瑟| 亚洲情侣av | 国产伦精品一区二区三区视频1 | 91九色视频在线观看 | 国外成人免费视频 | 国产精品6 | 波多野结衣视频免费在线观看 | 一二三区精品 | 欧美激情精品久久久久久蜜臀 | 久久精品国产亚洲av成人 | 国产性一乱一性一伧一色 | 日本一区二区视频在线观看 | 激情成人综合网 | 91免费黄视频 | 日韩黄色精品视频 | 在线观看免费视频国产 | 欧美成人精品一区二区男人看 | 在线观看岛国av | 精品久久久久久久久久久久久久 | 超碰美女| 美女又大又黄 | 天堂中文在线观看视频 | 秋霞午夜 | 香蕉视频国产在线观看 | 欧美精品一二区 | 国产chinesehd精品露脸 | 国产亚洲欧美日韩精品一区二区三区 | 久久蜜臀 | 久久久久久久久久久久久久久久久久久久 | www.桃色av嫩草.com | 国产日韩一区二区三区 | 国产成人 综合 亚洲 | 久久久久在线 | 啦啦啦视频在线观看 | 香蕉视频网址 | 国产精品无码久久久久久电影 | 在线观看免费视频国产 | 国产又粗又黄又爽视频 | 91精品国产乱码久久久久久久久 | 美女午夜影院 | 熟女少妇在线视频播放 | 苍井空张开腿实干12次 | 国产精品av在线 | 国产91免费在线观看 | 久草视频网站 | 欧美成人午夜精品久久久 | 久久久不卡国产精品一区二区 | 色爱av综合网 | 亚洲欧洲自拍 | 天堂中文在线资 | 第一章激情艳妇 | 蜜桃视频一区二区在线观看 | 午夜性激情 | 男人天堂2014 |