【NLP】LSTM 唐诗生成器 pytorch 版
admin
2024-04-03 13:13:31
0

参考这篇文章LSTM唐诗生成器Keras版

将相关的 keras 模型代码进行修改,改成对应的 pytorch 模型,现将有区别的部分放在这里。

训练模型

搭建网络

# 把keras 模型改成 pytorch 模型
# 建立LSTM模型
import torch
import torch.nn as nn
import torch.nn.functional as F# 设置 CUDA
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
# model = Sequential()
# model.add(Embedding(10000, 128, input_length=20))
# model.add(LSTM(128, return_sequences=True))
# model.add(Dropout(0.2))
# model.add(LSTM(128))
# model.add(Dropout(0.2))
# model.add(Dense(10000, activation='softmax'))# 参考上述的 keras 模型,建立 pytorch 模型# 第二层 LSTM 只取最后一个输出,所以 return_sequences=Falseclass LSTMNet(nn.Module):def __init__(self):super(LSTMNet, self).__init__()self.embedding = nn.Embedding(10000, 128)self.lstm1 = nn.LSTM(input_size=128, hidden_size=128, num_layers=1, batch_first=True)self.dropout1 = nn.Dropout(0.2)self.lstm2 = nn.LSTM(input_size=128, hidden_size=128, num_layers=1, batch_first=True)self.dropout2 = nn.Dropout(0.2)self.fc = nn.Linear(128, 10000)def forward(self, x):x = self.embedding(x) # [batch_size, seq_len, embedding_size]x, _ = self.lstm1(x)  # [batch_size, seq_len, hidden_size]x = self.dropout1(x)  # [batch_size, seq_len, hidden_size]x, _ = self.lstm2(x)  # [batch_size, seq_len, hidden_size]x = self.dropout2(x)  # [batch_size, seq_len, hidden_size]x = x[:, -1, :] #       这里-1的意思是:取最后一个输出 [batch_size, hidden_size]x = self.fc(x)  #       [batch_size, 10000]return x
# 实例化模型
model = LSTMNet().to(device)
model

LSTMNet(
(embedding): Embedding(10000, 128)
(lstm1): LSTM(128, 128, batch_first=True)
(dropout1): Dropout(p=0.2, inplace=False)
(lstm2): LSTM(128, 128, batch_first=True)
(dropout2): Dropout(p=0.2, inplace=False)
(fc): Linear(in_features=128, out_features=10000, bias=True)
)

Pytorch 数据转换

注意:因为 y_train 和 y_test [batch, 1] 最后一个维度是没用的,
所以要把它去掉,变成 [batch] 才能正常给交叉熵损失函数计算

# 先把 x_train, x_test, y_train, y_test 转化为 tensor
x_train = torch.tensor(x_train).to(device)
x_test = torch.tensor(x_test).to(device)
y_train = torch.tensor(y_train).to(device)
y_test = torch.tensor(y_test).to(device)
# 测试样本能否正常输入网络
pred = model(x_train[0:3].to(device))
print(x_train[0:3].shape) # [3, 20] # 3个样本,每个样本20个词
print(pred.shape) # [3, 10000]     #  3个样本,每个样本10000个分类

torch.Size([3, 20])
torch.Size([3, 10000])

# 因为 y_train 和 y_test [batch, 1] 最后一个维度是没用的,
# 所以要把它去掉,变成 [batch] 才能正常给交叉熵损失函数计算
y_train = y_train.squeeze()
y_test = y_test.squeeze()# 转化成 Long
y_train = y_train.long()
y_test = y_test.long()# 查看形状
y_train.shape,y_test.shape

(torch.Size([39405]), torch.Size([16889]))

训练模型

# 训练模型
import torch.optim as optim
from tqdm import tqdm
optimizer = optim.Adam(model.parameters(), lr=0.001)batch_size = 256
epochs = 20# 注意,这里 y_train, y_test 的形状都是 [batch, 1] ,也就是说,并不是 one-hot 编码
# 所以,损失函数用的是 CrossEntropyLossloss_func = nn.CrossEntropyLoss()
for epoch in range(epochs):print('Epoch: ', epoch)for i in tqdm(range(0, len(x_train), batch_size)):x_batch = x_train[i:i+batch_size]y_batch = y_train[i:i+batch_size]pred = model(x_batch)loss = loss_func(pred, y_batch)optimizer.zero_grad()loss.backward()optimizer.step()# 每个 epoch 结束后,计算一下准确率# 训练集准确率pred = model(x_train)pred = torch.argmax(pred, dim=1)acc = (pred == y_train).sum().item() / len(y_train)print('Train acc: ', acc)# 测试集准确率pred = model(x_test)pred = torch.argmax(pred, dim=1)acc = (pred == y_test).sum().item() / len(y_test)print('Test acc: ', acc)

Epoch: 0
100%|██████████| 154/154 [00:38<00:00, 4.01it/s]
Train acc: 0.10216977540921203
Test acc: 0.10320326839955
Epoch: 1

Epoch: 19
100%|██████████| 154/154 [00:37<00:00, 4.09it/s]
Train acc: 0.20576069026773253
Test acc: 0.17970276511338742

test_string = '白日依山盡,黃河入海流,欲窮千里目,更上一'for i in range(300):# 循环 300 步,每步都要预测一个字test_string_token = tokenizer.texts_to_sequences([test_string[-20:]]) # 取最后20个字test_string_mat = np.array(test_string_token)pred = model(torch.tensor(test_string_mat).to(device)) # pred 的形状是 [1, 10000]pred_argmax = torch.argmax(pred, dim=1).item()         # pred_argmax 的形状是 [1]# 把预测的字转化为文字tokenizer.index_word[pred_argmax]test_string = test_string + tokenizer.index_word[pred_argmax]
print(test_string)

相关内容

热门资讯

摩通:华尔街银行业绩强劲提振欧... 观点网讯:7月22日,华尔街大型银行第二季度业绩表现强劲,提振了市场对欧洲投资银行即将开启的财报季的...
广州拟推动房地产纾困和发展 引... 观点网讯:7月22日,“十五五”时期,广州拟切实推动房地产纾困和发展,引导房地产市场企业转型升级。 ...
AI投入成“无底洞”?谷歌资本... 隔夜美股三大指数集体收低,道琼斯工业指数下跌0.01%报52218.58点,标普500指数跌0.14...
新太空经济从“起势”迈向“成势... 当前,全球正处于新一轮科技革命和产业变革加速演进的关键节点,人工智能、合成生物学、固态电池、高端算力...
金价四连涨,水贝又挤满人 每经记者:赵景致 每经编辑:何小桃,廖丹 记者|赵景致 编辑|何小桃 廖丹杜恒峰校对|金冥羽 金价在...
专访微亿智造董事长张志琦:在“... 本报(chinatimes.net.cn)记者石飞月 上海报道 在刚刚过去的2026世界人工智能大会...
Alphabet CEO:市场... 美东时间周三(7月22日)盘后,在Alphabet财报电话会上,公司CEO Sundar Picha...
毕马威:香港基金税制改革料吸引... 观点网讯:7月22日,毕马威发布《香港资产管理及私募股权展望》报告,指出香港基金免税制度及附带权益税...
维护资本市场平稳运行,组合拳来... 重要新闻提示 7月20日,证监会召开证券公司及基金机构座谈会,听取各方关于促进资本市场平稳健康发展的...
原创 缩... 其实这个阶段,反攻继不继续,对我来说没啥意义。因为小登估值依旧高高在上,随时可能像上周五,带崩老登。...
易方达张坤,罕见调仓 图/视觉中国 昔日公募圈“一哥”,也不“爱”白酒了。 7月21日,易方达知名基金经理张坤旗下多只产品...
宽基ETF连续2日净流出 7月23日,本周二、周三,宽基ETF连续2日资金流出。 数据显示,7月22日,ETF市场净流出216...
367 款新品换不来年轻人一句... 作者|极点商业 张先森 2026年初夏,#康师傅冰红茶卖不动了#登上热搜。 网友对此的反应颇为两极...
1元净资产市场只给5毛8!银行... 继中信银行、招商银行之后,光大银行也于7月20日在投资者互动平台透露,该行已成立市值管理小组,全面统...
风险等级为何需要运作机制更关键... 在基金投资领域,风险等级是投资者评估基金产品的重要参考指标之一。然而,很多投资者往往只关注风险等级的...
刚刚!万亿“光模块一哥”正式招... (来源:上市之家) 7月22日,中际旭创股份有限公司(300308.SZ)正式刊发H股招股章程,启动...
智象未来完成15亿元C轮融资,... 智象未来(合肥)信息技术有限公司(以下简称“智象未来”)是一家全球多模态生成式人工智能创新企业,也是...
半年赚170%、规模565亿,... 来源:市场资讯 来源:资管网 半年赚170%,管理规模从89亿干到565亿。 然后他减仓了。 财通基...
Token账单背后的资本博弈 最近大家可能有一个困惑:为什么大模型概念股,看似业务高速增长、调用量节节攀升,但估值在经历了高速攀升...
Costco签约入驻 京东成为... 观点网讯:7月22日,全球知名会员制仓储零售商Costco(开市客)与京东达成合作,京东成为Cost...