第一节:线性回归部分(从0实现和用torch实现):
1.torch中:
index_selcet(a,0,j)其中,a表示被选择的目标,0表示按行索引,j为索引,j为torch.tensor([])形式
2.yield和return的区别
3. w.grad.data.zero_()
b.grad.data.zero_()
每一次更新结束后,都要将其的梯度记录清0,不然会叠加,影响后面的训练
Torch可以从基础开始实现,也可以直接用torch直接调用简洁实现
1.torch如何构建多层的神经网络
首先构建结构
from torch import nn
# ways to init a multilayer network三种方法
# method one
net = nn.Sequential(
nn.Linear(num_inputs, 1)
#other layers can be added here
)
# method two
net = nn.Sequential()
net.add_module('linear',nn.Linear(num_inputs, 1))
# net.add_module ......
# method three
from collections import OrderedDict
net = nn.Sequential(OrderedDict([
('linear', nn.Linear(num_inputs, 1))
# ......
]))
然后初始化模型参数 init,定义损失函数,定义优化函数,训练
第二节:softmax
将输出值变换成为值为正且和为1的概率分布(解决了原来输出范围不决定,误差难以衡量的问题)
交叉熵损失函数
使用fasionminist数据集
第三节 多层感知机
激活函数
第四节 文本预处理
要对文本进行处理要先进行预处理
[if !supportLists]l [endif]读入,分词,建立字典(将每个词映射到唯一的索引),将文本从词的序列转化为索引的序列,方便输入模型
读入
with open('/home/kesci/input/timemachine7163/timemachine.txt', 'r') asf:
lines= [re.sub('[^a-z]+', ' ', line.strip().lower()) for line inf]
line.strip()去掉头尾的空白字符(空格制表换行符)
import re 正则表达式包
re.sub('[^a-z]+', ' ', line.strip().lower()) #正则表达式的替换函数,把由非英文字符开头的子串替换为空格
分词
有不同的分词级别,比如word和char
iftoken== 'word':
return[sentence.split(' ') forsentenceinsentences]
建立字典
输入一个二维的列表,里面放的词,下面的函数把它展开,再用counter函数记录里面每个词出现的次数,得到字典(<词,词频>)
def count_corpus(sentences):
tokens=[tk for stinsentencesfortkinst]
returncollections.Counter(tokens)
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
>>> list(enumerate(seasons, start=1)) # 下标从 1 开始 [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]
Python 字典(Dictionary) items() 函数以列表返回可遍历的(键, 值) 元组数组。
for key,values in dict.items(): print key,values
字典值 : [('Google', 'www.google.com'), ('taobao', 'www.taobao.com'), ('Runoob', 'www.runoob.com')]
现有工具进行分词:
我们前面介绍的分词方式非常简单,它至少有以下几个缺点:
[if !supportLists]1. [endif]标点符号通常可以提供语义信息,但是我们的方法直接将其丢弃了
[if !supportLists]2. [endif]类似“shouldn't", "doesn't"这样的词会被错误地处理
[if !supportLists]3. [endif]类似"Mr.", "Dr."这样的词会被错误地处理
因为自己写的分词逻辑很简单
有一些现有的工具可以很好地进行分词,我们在这里简单介绍其中的两个:spaCy和NLTK。
第五节 语言模型
一段自然语言文本可以看作是一个离散时间序列,给定一个长度为的词的序列,语言模型的目标就是评估该序列是否合理,即计算该序列的概率。概率越大,说明越合理
本节我们介绍基于统计的语言模型,主要是元语法。在后续内容中,我们将会介绍基于神经网络的语言模型。
N元语法,基于n-1马尔可夫链。(某个词的概率只与前面n-1个词相关)
[if !supportLists]l [endif]存在很多问题
[if !supportLists]1. [endif]参数空间过大
[if !supportLists]2. [endif]数据稀疏
[if !supportLists]l [endif]随机采样的基本过程
下面的代码每次从数据里随机采样一个小批量。其中批量大小batch_size是每个小批量的样本数,num_steps是每个样本所包含的时间步数。 在随机采样中,每个样本是原始序列上任意截取的一段序列,相邻的两个随机小批量在原始序列上的位置不一定相毗邻。
[if !supportLists]l [endif]相邻采样的基本过程
如图假设批量大小为3,第一个批量里面的三个样本为红色。。。。
第六节 循环神经网络
网络构建
剪裁梯度
rnn中出现梯度爆炸和梯度衰减
针对梯度爆炸,有梯度裁剪去解决
第七节 过拟合、欠拟合
第八节 梯度消失梯度爆炸