当前位置: 首页 > news >正文

网站菜单样式怎么根据已有网站做新网站

网站菜单样式,怎么根据已有网站做新网站,ui网站设计模板,深圳别墅设计公司首选本章将从零开始#xff0c;基于循环神经网络实现字符级语言模型#xff08;不是单词级#xff09; 首先我们把从0开始深度学习#xff08;30#xff09;——语言模型和数据集中的load_corpus_time_machine()函数进行引用#xff0c;用于导入数据#xff1a; train_iter… 本章将从零开始基于循环神经网络实现字符级语言模型不是单词级 首先我们把从0开始深度学习30——语言模型和数据集中的load_corpus_time_machine()函数进行引用用于导入数据 train_iter, vocab load_corpus_time_machine() train_iter运行结果 train_iter中的每个数字都表示在vocab中的索引将这些索引直接输入神经网络可能会使学习变得困难我们通常将每个词元表示为更具表现力的特征向量即one-hot编码。 1 one-hot编码 假设词表中不同词元的数目为 N N N也就是len(vocab)所以词元索引的范围为 0 N − 1 0~N-1 0 N−1。如果词元的索引是整数 i i i 那么我们将创建一个长度为 N N N的全 0 0 0向量 并将第 i i i处的元素设置为 1 1 1。例如索引为 0 0 0和 2 2 2的独热向量如下所示 from torch.nn import functional as F import torchF.one_hot(torch.tensor([0, 2]), len(vocab))运行结果 tensor([[1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0],# 第0处设置为1表示索引1[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0]])# 第2处设置为1表示索引2由于我们每次采样的小批量数据形状是二维张量批量大小时间步数one_hot函数会将这样一个小批量数据转换成三维张量 张量的最后一个维度等于词表大小len(vocab)。我们经常转换输入的维度以便获得形状为 时间步数批量大小词表大小的输出。 这将使我们能够更方便地通过最外层的维度 一步一步地更新小批量数据的隐状态。 转化这一步将在后面进行 2 初始化模型参数 初始化循环神经网络模型的模型参数 隐藏单元数num_hiddens是一个可调的超参数。 当训练语言模型时输入和输出来自相同的词表因此它们具有相同的维度即词表的大小 def get_params(vocab_size, num_hiddens, device):num_inputs num_outputs vocab_sizedef normal(shape):return torch.randn(sizeshape, devicedevice) * 0.01# 隐藏层参数W_xh normal((num_inputs, num_hiddens))W_hh normal((num_hiddens, num_hiddens))b_h torch.zeros(num_hiddens, devicedevice)# 输出层参数W_hq normal((num_hiddens, num_outputs))b_q torch.zeros(num_outputs, devicedevice)# 附加梯度params [W_xh, W_hh, b_h, W_hq, b_q]for param in params:param.requires_grad_(True)return params3 循环神经网络模型 为了定义循环神经网络模型 我们首先需要一个init_rnn_state函数在初始化时返回隐状态这个函数的返回是一个张量形状为批量大小隐藏单元数 def init_rnn_state(batch_size, num_hiddens, device):return (torch.zeros((batch_size, num_hiddens), devicedevice), )下面的rnn函数定义了如何在一个时间步内计算隐状态和输出。 def init_rnn_state(batch_size, num_hiddens, device):return (torch.zeros((batch_size, num_hiddens), devicedevice), )def rnn(inputs, state, params):# inputs的形状(时间步数量批量大小词表大小)W_xh, W_hh, b_h, W_hq, b_q paramsH, state # 提取隐状态outputs []# X的形状(批量大小词表大小)for X in inputs:H torch.tanh(torch.mm(X, W_xh) torch.mm(H, W_hh) b_h) # 使用激活函数Y torch.mm(H, W_hq) b_q # 做矩阵乘法即 (隐变量*权重偏置)outputs.append(Y)return torch.cat(outputs, dim0), (H,)# cat()函数将所有时间步的输出拼接成一个张量形状为 (时间步数量 * 批量大小, 输出大小)# (H,)为最后一个时间步的隐藏状态定义了所有需要的函数之后接下来我们创建一个类来包装这些函数 并存储从零开始实现的循环神经网络模型的参数 class RNNModelScratch: #save从零开始实现的循环神经网络模型def __init__(self, vocab_size, num_hiddens, device,get_params, init_state, forward_fn):self.vocab_size, self.num_hiddens vocab_size, num_hiddensself.params get_params(vocab_size, num_hiddens, device)self.init_state, self.forward_fn init_state, forward_fndef __call__(self, X, state):X F.one_hot(X.T, self.vocab_size).type(torch.float32)# 进行one-hot编码return self.forward_fn(X, state, self.params)# 调用前向传播函数传入编码后的输入数据、初始隐藏状态和模型参数def begin_state(self, batch_size, device):return self.init_state(batch_size, self.num_hiddens, device)# 初始化的隐藏状态我们可以做一个测试 num_hiddens 512 net RNNModelScratch(len(vocab), num_hiddens, d2l.try_gpu(), get_params,init_rnn_state, rnn) state net.begin_state(X.shape[0], d2l.try_gpu()) Y, new_state net(X.to(d2l.try_gpu()), state) Y.shape, len(new_state), new_state[0].shape # 输出形状隐状态形状运行结果 (torch.Size([10, 28]), 1, torch.Size([2, 512]))输出形状是时间步数*批量大小词表大小 隐状态形状是批量大小隐藏单元数符合要求 4 梯度裁剪 在编写训练函数之前要引入一个方法——梯度裁剪用于防止梯度爆炸问题。 对于长度为 T T T的序列在迭代时要计算 T T T个时间步上的梯度于是会在反向传播中产生长度为 O ( T ) O(T) O(T)的矩阵乘法链当 T T T过大时有可能导致梯度爆炸问题所以循环神经网络需要额外的方式来支持稳定的训练下面不讲解原理直接给出一种流行的方法。 不过注意梯度裁剪提供了一个快速修复梯度爆炸的方法 虽然它并不能完全解决问题但它是众多有效的技术之一。 def grad_clipping(net, theta): #save裁剪梯度if isinstance(net, nn.Module):params [p for p in net.parameters() if p.requires_grad]else:params net.paramsnorm torch.sqrt(sum(torch.sum((p.grad ** 2)) for p in params))if norm theta:for param in params:param.grad[:] * theta / norm5 训练 与线性神经网络的训练有三个不同之处 序列数据的不同采样方法随机采样和顺序分区将导致隐状态初始化的差异。在更新模型参数之前裁剪梯度这样即使训练过程中某个点上发生了梯度爆炸也能保证模型不会发散。使用困惑度来评价模型 对于第一点做一些解释 随机采样 由于每次抽取的数据点是独立的模型在处理每个样本时通常需要重新初始化隐状态。通常情况下模型会在每个新的随机样本开始时使用初始的隐状态。顺序分区 由于数据点是按时间顺序排列的模型在处理每个子序列时可以利用前一个子序列的隐状态作为当前子序列的初始隐状态。 def predict_ch8(prefix, num_preds, net, vocab, device): #save在prefix后面生成新字符state net.begin_state(batch_size1, devicedevice)outputs [vocab[prefix[0]]]get_input lambda: torch.tensor([outputs[-1]], devicedevice).reshape((1, 1))for y in prefix[1:]: # 预热期_, state net(get_input(), state)outputs.append(vocab[y])for _ in range(num_preds): # 预测num_preds步y, state net(get_input(), state)outputs.append(int(y.argmax(dim1).reshape(1)))return .join([vocab.idx_to_token[i] for i in outputs]) def train_epoch_ch8(net, train_iter, loss, updater, device, use_random_iter):训练一个迭代周期state, timer None, 0metric [0, 0] # 累积损失总词元数量for X, Y in train_iter:if X.shape[0] 0 or Y.shape[0] 0: # 跳过空批次continueif state is None or use_random_iter:state net.begin_state(batch_sizeX.shape[0], devicedevice)else:if isinstance(state, tuple):state tuple(s.detach() for s in state)else:state state.detach()X, Y X.to(device), Y.T.reshape(-1).to(device)y_hat, state net(X, state)l loss(y_hat, Y.long()).mean()if isinstance(updater, torch.optim.Optimizer):updater.zero_grad()l.backward()grad_clipping(net, 1)updater.step()else:l.backward()grad_clipping(net, 1)updater(batch_size1)metric[0] l.item() * Y.numel() # 使用 l.item() 累积标量损失metric[1] Y.numel() # 累计总词元数量return metric[0] / max(1, metric[1]) # 避免除以零def train_ch8(net, train_iter, vocab, lr, num_epochs, device,use_random_iterFalse):训练模型loss nn.CrossEntropyLoss()updater torch.optim.SGD(net.params, lr)for epoch in range(num_epochs):avg_loss train_epoch_ch8(net, train_iter, loss, updater,device, use_random_iter)ppl torch.exp(torch.tensor(avg_loss)) # 转换为 Tensor 以使用 torch.expprint(fepoch {epoch 1}, perplexity {ppl:.1f})print(predict_ch8(time traveller, 50, net, vocab, device))# 设置设备 device torch.device(cuda if torch.cuda.is_available() else cpu)# 模型初始化 num_hiddens 512 net RNNModelScratch(len(vocab), num_hiddens, device, get_params, init_rnn_state, rnn)# 训练模型 num_epochs, lr 500, 1 train_ch8(net, train_iter, vocab, lr, num_epochs, device)
http://www.hkea.cn/news/14385701/

相关文章:

  • 广告图片网站源码产品软文范例大全
  • 网站开发与维护岗位说明书天津seo培训班在哪里
  • 手机免费建网站软件怎么查询网站备案服务商是哪个
  • 微网站模板制作建材做哪些网站
  • 网站怎么做支付宝接口石家庄网站建设平台
  • 九曲网站建设东莞有什么好玩的地方
  • 中国建设银行信用卡中心网站邮件服务商
  • 万网域名绑定到其它网站建网站一般要多少钱
  • 济南网站制作专业如何用手机制作网页链接
  • 网站开发需多少钱小说网站怎么做防采集
  • 编程学习入门网站wordpress apache伪静态
  • 即墨城乡建设局网站网站空间可以自己买吗
  • 网站开发如何入账分销平台软件
  • 建设论坛网站大概多少钱南宁网站建设方案报价
  • 如何查询网站备案信息查询h5动态页面
  • qq刷赞网站咋做塘沽建设网站公司
  • 摄影师网站模板安徽鑫华建设有限公司网站
  • 蓝色科技企业网站模板网站用html模拟图片
  • 网站建设 考虑品牌推广的概念
  • 房地产管理网站浙江省建设信息网官网
  • 淄博网站设计方案建站公司用哪家服务器
  • 做营销的网站建设专门做中式装修的网站
  • 做电影网站哪个服务器好上海网站推广大全
  • 网站cms大全专业网站制作流程
  • 做网站需要备案吗青岛哪里可以建网站
  • 丽水市莲都区建设分局网站2817网站
  • 沧州做家装的公司网站建设规划
  • 大丰企业做网站多少钱上海外贸公司地址
  • 网站制作 毕业设计dw网站建设字体颜色
  • 建设网站开通网线多少钱现在网站建设还用测浏览器吗