《动手学深度学习》Pytorch版学习笔记(二):Task05
课程背景
在疫情的影响下,不少学校已经做出了延迟开学的决定,:伯禹教育、Datawhale、和鲸科技牵头与多家AI企业合作,让在家的同学也能免费学习优质的付费课程,同时为学习者创建好的学习环境,提供就业绿色通道。
主修课程
《动手学深度学习》 代码讲解Pytorch版:该书是2019年国内最受欢迎的人工智能学习教材之一,是一本面向中文读者的能运行、可讨论的深度学习教科书,书籍作者之一亚马逊首席科学家李沐,毕业于上海交大。伯禹教育携手上海交通大学团队,基于此书籍,将其中的代码框架由MXNET迁移至PyTorch,并对这些代码制作了讲解视频。帮助大家边动手写代码边巩固理论知识,从原理到实践,上手深度学习。
1 任务
【第二次打卡】内容(2月15日-17日)
1.Task03:过拟合、欠拟合及其解决方案;梯度消失、梯度爆炸;循环神经网络进阶(1天)
2.Task04:机器翻译及相关技术;注意力机制与Seq2seq模型;Transformer(1天)
3.Task05:卷积神经网络基础;leNet;卷积神经网络进阶(1天)
打卡时间:【2020-02-15 08:00 -- 2020-02-17 22:00】
打卡链接:学习开始放出
2 循环神经网络基础
本节介绍循环神经网络,我们的目的是基于当前的输入与过去的输入序列,预测序列的下一个字符。循环神经网络引入一个隐藏变量 H ,用 Ht 表示 H 在时间步 t 的值。 Ht 的计算基于 Xt 和 Ht−1 ,可以认为 Ht 记录了到当前字符为止的序列信息,利用 Ht 对序列的下一个字符进行预测。
2.1 从零开始实现循环神经网络
import torch
import torch.nn as nn
import time
import math
import sys
sys.path.append("/home/kesci/input")
import d2l_jay9460 as d2l
(corpus_indices, char_to_idx, idx_to_char, vocab_size) = d2l.load_data_jay_lyrics()
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
#one-hot向量
def one_hot(x, n_class, dtype=torch.float32):
result = torch.zeros(x.shape[0], n_class, dtype=dtype, device=x.device) # shape: (n, n_class)
result.scatter_(1, x.long().view(-1, 1), 1) # result[i, x[i, 0]] = 1
return result
x = torch.tensor([0, 2])
x_one_hot = one_hot(x, vocab_size)
print(x_one_hot)
print(x_one_hot.shape)
print(x_one_hot.sum(axis=1))
def to_onehot(X, n_class):
return [one_hot(X[:, i], n_class) for i in range(X.shape[1])]
X = torch.arange(10).view(2, 5)
inputs = to_onehot(X, vocab_size)
print(len(inputs), inputs[0].shape)
#初始化模型参数
num_inputs, num_hiddens, num_outputs = vocab_size, 256, vocab_size
# num_inputs: d
# num_hiddens: h, 隐藏单元的个数是超参数
# num_outputs: q
def get_params():
def _one(shape):
param = torch.zeros(shape, device=device, dtype=torch.float32)
nn.init.normal_(param, 0, 0.01)
return torch.nn.Parameter(param)
# 隐藏层参数
W_xh = _one((num_inputs, num_hiddens))
W_hh = _one((num_hiddens, num_hiddens))
b_h