《动手学深度学习》-55-2RNN的简单实现

复制代码
import torch
from torch import nn
from torch.nn import functional as F
import d2l
import test_53LanguageModel
import test_55RNNdifficult_realize
batch_size,num_steps=32,35
train_iter,vocab=test_53LanguageModel.load_data_time_machine(batch_size,num_steps)
#定义模型
num_hiddens=512
rnn_layer=nn.RNN(len(vocab),num_hiddens)
#使用张量初始化隐藏状态,形状(隐藏数,批量大小,隐藏单元)
state=torch.zeros((1,batch_size,num_hiddens))
# print(state.shape)
# X=torch.randn(size=(num_steps,batch_size,len(vocab)))
# Y,state_new=rnn_layer(X,state)
# print(Y.shape,state_new.shape)
class RNNModel(nn.Module):
    def __init__(self,rnn_layer,vocab_size,**kwargs):
        super(RNNModel,self).__init__(**kwargs)
        self.rnn=rnn_layer
        self.vocab_size=vocab_size
        self.num_hiddens=self.rnn.hidden_size
        if not self.rnn.bidirectional:
            self.num_derections=1
            self.linear=nn.Linear(self.num_hiddens,self.vocab_size)
        else:
            self.num_derections=2
            self.linear=nn.Linear(self.num_hiddens*2,self.vocab_size)
    def forward(self,inputs,state):
        X=F.one_hot(inputs.T.long(),self.vocab_size)#将输入变成(num_steps, batch_size, vocab_size)
        X=X.to(torch.float32)
        y,state=self.rnn(X,state)
        output=self.linear(y.reshape((-1,y.shape[-1])))#将y转成二维(num_steps*batch_size,vocab_size)
        return output,state
    def begin_state(self,device,batch_size=1):
        if not isinstance(self.rnn,nn.LSTM):
            return torch.zeros((self.num_derections*self.rnn.num_layers,batch_size,self.num_hiddens),device=device)#(层数*方向数,batch,隐藏数量)
        else:
            return (torch.zeros((self.num_derections*self.rnn.num_layers,batch_size,self.num_hiddens),device=device),
                    torch.zeros((self.num_derections * self.rnn.num_layers, batch_size, self.num_hiddens),
                                device=device)
            )
device=d2l.try_gpu()
net=RNNModel(rnn_layer,vocab_size=len(vocab))
net=net.to(device=device)
print(test_55RNNdifficult_realize.predict_ch8('time traveller',10,net,vocab,device))
复制代码
num_epochs=500
lr=1
test_55RNNdifficult_realize.train_ch8(net,train_iter,vocab,lr,num_epochs,device)
相关推荐
微臣愚钝几秒前
prompt
人工智能·深度学习·prompt
深小乐6 分钟前
从 AI Skills 学实战技能(六):让 AI 帮你总结网页、PDF、视频
人工智能
宝贝儿好12 分钟前
【LLM】第二章:文本表示:词袋模型、小案例:基于文本的推荐系统(酒店推荐)
人工智能·python·深度学习·神经网络·自然语言处理·机器人·语音识别
周末程序猿31 分钟前
详解 karpathy 的 microgpt:实现一个浏览器运行的 gpt
人工智能·llm
ACP广源盛1392462567337 分钟前
破局 Type‑C 切换器痛点@ACP#GSV6155+LH3828/GSV2221+LH3828 黄金方案
c语言·开发语言·网络·人工智能·嵌入式硬件·计算机外设·电脑
xixixi777771 小时前
通信领域的“中国速度”:从5G-A到6G,从地面到星空
人工智能·5g·安全·ai·fpga开发·多模态
Dfreedom.1 小时前
计算机视觉全景图
人工智能·算法·计算机视觉·图像算法
EasyDSS1 小时前
智能会议管理系统/私有化视频会议平台EasyDSS私有化部署构建企业级私域视频全场景解决方案
人工智能·音视频
zhanghongbin012 小时前
成本追踪:AI API 成本计算与预算管理
人工智能
YBAdvanceFu2 小时前
从零构建智能体:深入理解 ReAct Plan Solve Reflection 三大经典范式
人工智能·python·机器学习·数据挖掘·多智能体·智能体