model.eval()
作用:
主要是针对model 在训练时和评价时不同的 Batch Normalization 和 Dropout 方法模式。
Batch Normalization
其作用对网络中间的每层进行归一化处理,并且使用变换重构(Batch Normalization Transform)保证每层提取的特征分布不会被破坏.
Dropout
其作用克服Overfitting,在每个训练批次中,通过忽略一半的特征检测器,可以明显的减少过拟合现象。
model.eval()
不启用 BatchNormalization 和 Dropout,保证BN和dropout不发生变化,pytorch框架会自动把BN和Dropout固定住,不会取平均,而是用训练好的值,不然的话,一旦test的batch_size过小,很容易就会被BN层影响结果。
model.train()
在使用 pytorch 构建神经网络的时候,训练过程中会在程序上方添加一句model.train(),作用是 启用 batch normalization 和 dropout 。
如果模型中有BN层(Batch Normalization)和 Dropout ,需要在 训练时 添加 model.train()。
model.train() 是保证 BN 层能够用到 每一批数据 的均值和方差。对于 Dropout,model.train() 是 随机取一部分 网络连接来训练更新参数。
model.parameters():
model.parameters(): 保存的是weights 和 bias,例如nn.linear(), 保存的是weights和bias。
利用梯度优化权重
Batch Normalization:
批标准化,将分散的数据统一的一种做法,优化神经网络的一种做法。
enumerate():
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
unsqueeze()
unsqueeze()函数起升维的作用,参数表示在哪个地方加一个维度.
squeeze()
将维度值为1的维度去掉,例如x.shape(1,2,3), 第一个值为1,使用squeeze()会使这个维度去掉,变成(2,3)。
# 0(-2)-行扩展
# 1(-1)-列扩展
# 正向:我们在0,1位置上扩展
# 逆向:我们在-2,-1位置上扩展
# 维度扩展:1维->2维,2维->3维,...,n维->n+1维
# 维度降低:n维->n-1维,n-1维->n-2维,...,2维->1维
# 以 1维->2维 为例,
# 从【正向】的角度思考:
# torch.Size([4])
# 最初的 tensor([1., 2., 3., 4.]) 是 1维,我们想让它扩展成 2维,那么,可以有两种扩展方式:
# 一种是:扩展成 1行4列 ,即 tensor([[1., 2., 3., 4.]])
# 针对第一种,扩展成 [1, 4]的形式,那么,在 dim=0 的位置上添加 1
# 另一种是:扩展成 4行1列,即
# tensor([[1.],
# [2.],
# [3.],
# [4.]])
# 针对第二种,扩展成 [4, 1]的形式,那么,在dim=1的位置上添加 1
# 从【逆向】的角度思考:
# 原则:一般情况下, "-1" 是代表的是【最后一个元素】
# 在上述的原则下,
# 扩展成[1, 4]的形式,就变成了,在 dim=-2 的的位置上添加 1
# 扩展成[4, 1]的形式,就变成了,在 dim=-1 的的位置上添加 1
BatchNorm
step1: initialize the running_mean and runnint_var to zeros.
step2: 对输入x计算 mean, var , axis = 0
step3: iteration running_mean and running_var:
tensor.detach()
切断一些分支的反向传播,返回一个新的tensor,从当前计算图中分离下来的,但是仍指向原变量的存放位置,不同之处只是requires_grad为false,得到的这个tensor永远不需要计算其梯度,不具有grad。
即使之后重新将它的requires_grad置为true,它也不会具有梯度grad
这样我们就会继续使用这个新的tensor进行计算,后面当我们进行反向传播时,到该调用detach()的tensor就会停止,不能再继续向前进行传播。
torch.no_grad()
一个上下文管理器,disable梯度计算。disable梯度计算对于推理是有用的,当你确认不会调用Tensor.backward()的时候。这可以减少计算所用内存消耗。这个模式下,每个计算结果的requires_grad=False,尽管输入的requires_grad=True。
torch.argmax(x, dim=0)
按列返回数组x的最大值的index
import torch
x = torch.randn(2, 4)
print(x)
'''
tensor([[ 1.2864, -0.5955, 1.5042, 0.5398],
[-1.2048, 0.5106, -2.0288, 1.4782]])
'''
y0表示矩阵dim=0维度上(每一列)张量最大值的索引
y0 = torch.argmax(x, dim=0)
print(y0)
'''
tensor([0, 1, 0, 1])
'''
@property
1、装饰器, 保护类的封装特性,2、让开发者可以使用"对象.属性"的方式操作类属性的功能。
继承:
class (object):
继承object对象,拥有了类中的高级特性,在python3中已经默认加载了object。
矩阵写入txt
matrix = np.random.random((1000, vec_dim))
np.savetxt("matrix", matrix, fmt = '%f', delimiter = ',')
nn.functional.normalize: 标准化, x的每个值除以范数,dim = -1意思为对行(最后一个维度)进行标准化
torch.nn.functional.normalize(x, dim=-1)
import numpy as np import torch.nn as nn import torch x = torch.FloatTensor(np.array([1,2,3])) y = torch.FloatTensor(np.array([3,2,1])) x = torch.nn.functional.normalize(x,dim=-1) print(x) a = np.array([1,2,3]) fanshu = sum(a**2) print(fanshu) fanshu = np.sqrt(fanshu) print(a/fanshu)
.gt
x = torch.FloatTensor(np.array([1,2,3]))
print(x.gt(1))
tensor([False, True, True])
optimizer.zero_grad() # 将模型的参数梯度初始化为0
outputs=model(inputs) # 前向传播计算预测值
loss = cost(outputs, y_train) # 计算当前损失
loss.backward() # 反向传播计算梯度
optimizer.step() # 更新所有参数
f.truncate(0)
删除文件内容, 括号里面的0必须要有
torch.mul
对两个张量进行逐个元素相乘
gensim
gensim 是一个通过衡量词组(或更高级结构,如整句或文档)模式来挖掘文档语义结构的工具,三大核心概念:文集(语料)–>向量–>模型。
keepdims主要用于保持矩阵的二维特性
import numpy as np
a = np.array([[1,2],[3,4]])
按行相加,并且保持其二维特性
print(np.sum(a, axis=1, keepdims=True))
按行相加,不保持其二维特性
print(np.sum(a, axis=1))
NER:name entity generic
json.dump()和json.dumps()的区别
- json.dumps() 是把python对象转换成json对象的一个过程,生成的是字符串。
- json.dump() 是把python对象转换成json对象生成一个fp的文件流,和文件相关。
json.load() 和json.loads() 的区别
json.loads函数的使用,将字符串转化为字典
json.load()函数的使用,将读取json信息
示例:
json_info = '{"age": "12"}'
dict1 = json.loads(json_info)
file = open('1.json','r',encoding='utf-8')
info = json.load(file)
assert: 断言 用于判断一个表达式,在表达式条件为False的时候触发异常。
关于dim取值范围
A.关于dim 取值范围:假设有一个n维的tensor,那么它的dim可以取值的范围是[-n,n-1]。举个例子:a=torch.randn(2,3,4),很明显,a是一个3维张量,那么它的dim可以取的值有-3,-2,-1,0,1,2。
B.关于不同dim取值代表的含义:还是上面的例子,对于a来说,dim=0意思就是对a的第1个维度进行操作(也就是2所在的那个维度);dim=1意思就是对a的第2个维度进行操作(也就是3所在的那个维度);dim=2意思就是对a的第3个维度进行操作(也就是4所在的那个维度)。
那么对于dim为负数时,代表的意思又是什么呢?对于dim=-1,代表的是张量最里面的那个维度,对于上面例子的a来说,就是代表了第3个维度(也就是4所在的那个维度);对于dim=-2,代表的是a的第2个维度(也就是3所在的那个维度);对于dim=-3,代表的是a的第1个维度(也就是2所在的那个维度)。
masked_fill, masked_fill_
加下划线就直接在原tensor上进行修改, 没有加下划线的是新创建一个变量,原变量保持不变
masked_fill(mask, 2)
import torch a = torch.rand(3,3,4) print(a) mask = (a>0.5) print(mask) b = a.masked_fill(mask, 2) print(b)