(注:这个笔记是我曾经在学习过程中为了方便后续的学习,减少再次百度检索的时间而摘抄得到的,非原创,部分当时忘记了附上原文链接,若不允许使用麻烦请联系我;待更新)
目录
Python内置的filter()函数和Pandas中的DataFrame.filter()参数及用法_pandas filter函数-优快云博客
67. python中 r'', b'', u'', f'' 的含义
84. tf.nn.bidirectional_dynamic_rnn()
85. torch.utils.data.DataLoader()
86. optim.compute_gradients()计算梯度
87. optim.apply_gradients()更新参数
Std:标准差 var:方差
多行换行 ‘’’ ‘’’
多行注释 """ """ 或ctrl + /
单在行末加 \ 表示换行,但是打印时还是连续的,为了美观
B = A.clone() # 通过分配新内存,将A的⼀个副本分配给B 深拷贝
两个张量对应元素相乘,在PyTorch中可以通过torch.mul函数(或*运算符)实现;
两个张量矩阵相乘,在PyTorch中可以通过torch.matmul函数实现;
r"([^ ]+(?<=\.[a-z]{3}))"
[^ ] 表示不是空格的任意字符;
+ 表示前面的字符可以重复一次或多次;
(?<=\.[a-z]{3}) 是一个正向肯定断言,用于匹配一个句点 . 后面跟着三个小写字母的位置。
"<url>" 是替换匹配的 URL 的字符串。
使用镜像网站安装包:
pip install xxx(名称) -i http://pypi.doubanio.com/simple/ --trusted-host pypi.doubanio.com
nvidia-smi 查看是否使用GPU
访问字典类型变量
for key, value in events.items():
print("第一个元素是:", key, "-", value)
Break
访问Set类型变量
for element in result_set:
print("第一个元素是:", element)
break
- python文件读写操作
‘r’:只读。该文件必须已存在。
‘r+’:可读可写。该文件必须已存在,写为追加在文件内容末尾。
‘rb’:表示以二进制方式读取文件。该文件必须已存在。
‘w’:只写。打开即默认创建一个新文件,如果文件已存在,则覆盖写(即文件内原始数据会被新写入的数据清空覆盖)。
‘w+’:写读。打开创建新文件并写入数据,如果文件已存在,则覆盖写。
‘wb’:表示以二进制写方式打开,只能写文件, 如果文件不存在,创建该文件;如果文件已存在,则覆盖写。
‘a’:追加写。若打开的是已有文件则直接对已有文件操作,若打开文件不存在则创建新文件,只能执行写(追加在后面),不能读。
‘a+’:追加读写。打开文件方式与写入方式和'a'一样,但是可以读。需注意的是你若刚用‘a+’打开一个文件,一般不能直接读取,因为此时光标已经是文件末尾,除非你把光标移动到初始位置或任意非末尾的位置。(可使用seek() 方法解决这个问题,详细请见下文Model 8 示例)
print(f.readline()) # 打印一行
print(f.readline(5)) # 打印前5个字符
print(f.tell()) # 打印当前指针位置
print(f.read()) # 读完文件后,指针在最尾处
f.seek(0) # 如要重头到尾再读,文件指针须先回到文件头(0-文件头,默认值; 1-当前位置; 2-文件尾)
print(f.read()) # 重读文件
print(f.encoding) # 打印当前使用的字符编码
print(f.name) # 打印文件名
print(f.flush()) # 刷新
f.truncate() # 清空文件
f.truncate(12) # 从头开始,第12个字符后截断并清除
f.close() # 关闭文件
python 写入文件 wb_一篇搞懂python文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)-优快云博客
返回字符串长度
返回对象数据类型
else :
not and or(从高到低)
变量名 = [] 添加:变量名.append(xxx) 删除:变量名.remove(xxx)
max(列表名) min(列表名) sort(列表名)
变量名 = { 键 : 值}
插入:变量名[ 键名 ] = 值 删除:del 变量名[ 键名 ]
dict.keys () #所有键
dict.values () #所有值
dict. items () #所有键值对
For 变量名 in 可迭代对象
a、b分别为遍历的左右区间阈值(左闭右开,即从a开始到b-1结束),c为遍历的步长。
例:range(1,101) #从1到100
条件1 :
行动 1
- format方法 常用格式‘ ’.format()
链接:python中format用法(最全汇总)_format在python中的用法_西部点心王的博客-优快云博客
message content = """n律回春渐,新元肇启。
新岁甫至,福气东来。
金{0}贺岁,欢乐祥瑞。
金{0}敲门,五福临门。
给{1}及家人拜年啦!
新春快乐,{0}年大吉!
"""format( vear, name )
- f-字符串
name ="老林"
year ="虎"
message content =f"""律回春渐,新元肇启。
新岁甫至,福气东来。
金{year}贺岁,欢乐祥瑞。
金{year}敲门,五福临门。
给{name}及家人拜年啦!
新春快乐,{year}年大吉!"""
def 函数名(参数列表):
#return
方法一:import方式
import statistics
print(statistics.median([19,-5,36]))#中位数
print(statistics.mean([19,-5,36]))#平均数
方法二:from...import...语句
from statistics import median, mean
print (median([19,-5,36]))
print(mean( [19,-5,36]))
# 定义ATM类
class ATM:
def _init_( self,编号,银行,支行)∶
self.编号=编号
self.银行=银行
self.支行=支行
#创建两个ATM对象
atm1 = ATM("001",“招商银行","南园支行")
atm2 = ATM( "002",“中国银行","北园支行")
方法一:
f = open( " ./ data.txt")
print(f.read())#对文件的操作
f.close()#关闭文件,释放资源
方法二:
with open( " ./ data.txt" ) as f:
print(f.read())#对文件的操作 #自动关闭
try: #有可能产生错误的代码
user_weight = float(input("请输入您的体重(单位:kg)
user_height = float(input("请输入您的身高(单位:m): "))
user_BMI = user_weight / user_height **2
except ValueError:
print("输入不为合理数字,请重新运行程序,并输入正确的数字。")产生值错误时会运行
except ZeroDivisionError : #产生除零错误时会运行
print("身高不能为零,请重新运行程序,并输入正确的数字。")
except:#产生其它错误时会运行
print( "发生了未知错误,请重新运行程序。")
else:#没有错误时会运行
print("您的BMI值为:" + str(user_BMI))
finally:#不管发生错误与否都会运行
print("程序结束运行。")
- shape函数是Numpy中的函数,它的功能是读取矩阵的长度
‘delimiter’.join(seq)
delimiter:分隔符。可以为空
delimiter:要连接的元素序列、字符串、元组、字典
例“,”.join((‘a’,‘b’,‘c’))
‘a,b,c’
- 关键词:在某一个类别的文章中,某一个词语的出现次数很多,但是在其他类别的文章中出现次数很少。
TF-IDF:衡量重要程度
词频(term frequency, tf) 指的是某一个给定的词语在该文件中出现的频率
逆向文档频率(inverse document frequency, idf) 是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
方法一:归一化 MinMaxScaler()
缺点:鲁棒性较差,只适用于传统精确的小数据场景(归一结果受最大值、最小值影响)
方法二:标准化 (x-mean)/标准差 均值为0,标准差为1
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
降低随机变量(特征)个数(列数),得到一组“不相关”(相互独立?)主变量的过程。
特征选择
方法一:Filter过滤式
方差选择法:低方差特征过滤
相关系数–特征与特征之间的相关程度
皮尔森相关系数
方法二:Embeded嵌入式
决策树
正则化
正则又称为“惩罚项”,用来防止模型过拟合的过程,正则化系数C是用来控制正则化程度的超参数
对sklearn逻辑回归正则化penalty和C参数的理解 - 知乎 (zhihu.com)
【ML】L1 和 L2 正则化解释、何时使用它们以及实际示例_l1l正则 只能用在线性回归吗-优快云博客
深度学习
Pandas中提供的一种数据筛选的方法
例:data=data.query("x > 2 & x < 2.5 & 1 > y & y < 1.5")
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代对象,如果要转换为列表,可以使用 list() 来转换
例如:
def is_odd(n):
return n % 2 == 1
tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
def f(data):
return len(data['text'])>40
self.dataset=dataset.filter(f)
在这种方法中函数f不需要显式传入参数,而是作为一个判断条件在filter方法中使用
Python内置的filter()函数和Pandas中的DataFrame.filter()参数及用法_pandas filter函数-优快云博客
添加代码
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = [u'SimHei']#用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False#用来正常显示负号
d2l.plt.legend(loc=” ”)
Loc=”lower left”//loc=3
`legend(None)`,则不会显示图例
figure,axes = plt.subplots (nrows=1,ncols=2,**fig_kw)#行数,列数
axes [0].方法名()
axes [1]
折线图plot
散点图scatter:关系/规律
柱状图bar:统计/对比
直方图histogram:分布状况
饼图pie:占比
1.直方图展示数据的分布,柱状图比较数据的大小。
2.直方图X轴为定量数据,柱状图X轴为分类数据。
3.直方图柱子无间隔,柱状图柱子有间隔
4.直方图柱子宽度可不一,柱状图柱子宽度须—致
bins组数= int(max( time) - min(time)) /组距)
1.date_range
data=pd.date_range(start="20200101",periods=5,freq="B")#periods表示天数 freq="B"表示工作日频率
2.to_datetime
例:time_value=pd.to_datetime(data["time"],unit="s")
loc:通过行、列的名称或标签来索引
iloc:通过行、列的索引位置来寻找数据
axis = 0
按行计算,得到列的性质。
axis = 1 -->
按列计算,得到行的性质。
# tensor t3 with shape [2, 3]
# tensor t4 with shape [2, 3]
tf.shape(tf.concat([t3, t4], 0)) ==> [4, 3]
tf.shape(tf.concat([t3, t4], 1)) ==> [2, 6]
axis=0:在第一维操作
axis=1:在第二维操作
axis=-1:在最后一维操作
plt.grid(True,linestyle='--',alpha=0.5)
r_ticks=["股票{0}".format(i) for i in range(10)]
pd.DataFrame(stock_change,index=r_ticks)#index表示行索引列表
或在读取数据时添加:
data=pd.read_csv("文件路径",names=[“”])
处理Nan类的缺失值:
先判断是否含有缺失值
#方法一
np.any(pd.isnull(data))
#方法二
pd.isnull(data).any()
#方法三
pd.notnull(data).all()
采用替换的方式处理缺失值
data["包含缺失值的索引名"].fillna(data["包含缺失值的索引名"].mean(),inplace=True)
处理有默认标记的缺失值(例如?):
首先将?标记转换为Nan类,然后按Nan类处理
data_new=data.replace(to_replace='?',value=np.nan)
方法一:
将import tensorflow as tf替换成
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
方法二:
将with tf.Session() as sess:替换成
sess = tf.compat.v1.Session()
tensorflow.compat.v1是用于 TensorFlow 2.x 中向后兼容的模块
通过tensorflow.compat.v1模块,您可以调用一些 TensorFlow 1.x 版本中的函数和类,以便在 TensorFlow 2.x 中继续使用旧代码。
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
#设置日志等级,过滤不重要的红色提示
维度诅咒
conda create -n pytorch python=3.7
conda install pytorch torchvision torchaudio pytorch-cuda=11.7 -c pytorch -c nvidia
conda install pytorch==2.0.1 torchvision==0.15.2 torchaudio==2.0.2 pytorch-cuda=11.7 -c pytorch -c nvidia
凸函数可以用分治法,否则不能(局部/全局最优值)
关键解决鞍点(可以采用随机梯度下降--随机一个--->时间复杂度高)
MSE:平均最小二乘法
如果没有激活函数,那么多层神经层可以归并成一层,那么就没有设计多层神经层。加入激活函数之后就不能归并。
conda install pytorch torchvision cudatoolkit=1
conda install pytorch torchvision torchaudio pytorch-cuda=11.7
conda install pytorch==2.0.0 torchvision==0.15.0 torchaudio==2.0.0 pytorch-cuda=11 -c Index of /anaconda/cloud/pytorch/win-64/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror
pip install D:\Pytorch_file\torch-1.13.0+cu117-cp37-cp37m-win_amd64.whl
pip install D:\Pytorch_file\torchvision-0.14.1+cu117-cp37-cp37m-win_amd64.whl
nvcc -V
conda activate pytorch
pip install D:\Pytorch_file\torch-1.13.1+cu117-cp37-cp37m-win_amd64.whl
pip install D:\Pytorch_file\torchvision-0.14.1+cu117-cp37-cp37m-win_amd64.whl
pip install D:\Pytorch_file\torchaudio-0.13.1+cu117-cp37-cp37m-win_amd64.whl
.data返回的是一个tensor
而.item()返回的是一个具体的数值。
dim = 0 纵向 dim = 1 横向
torch.cat((x,y),dim = 1) 实现张量合并
x+=y 实现执⾏原地操作 即运算后x的地址不变
而x=x+y 运算后x的地址改变
地址使用id[x]查看
os.makedirs(os.path.join('..', 'data'), exist_ok=True) 创建多层目录(单层请用os.mkdir)
data_file = os.path.join('..', 'data', 'house_tiny.csv') 创建⼀个人工数据集,并存储在CSV⽂件 ../data/house_tiny.csv中。
点积:torch.dot(x, y)
向量积:torch.mv(x,y)
矩阵乘法:torch.mm(A, B) 返回一个矩阵C=AB
范数:torch.norm(u) 该⼤⼩(size)概念不涉及维度,⽽是分量的⼤⼩。浮点类型数据
pd.get_dummies(a, drop_first=True)
drop_first默认为对所有值编码。当drop_first为True时,指不对第一个值进行编码
dummy_na默认为否,不对nan类型进行编码
dummy_na设为True时,对nan类型也进行编码
逐个比较:print(A.eq(B))
整体比较:print(A.equal(B))
注:在默认情况下,PyTorch会累积梯度,我们需要清除之前的值:x.grad.zero_()
标量的反向传播:y.backward()
非标量的反向传播:y.sum().backward()或y.backward(torch.ones(len(x)))
#现实中的概率值
fair_probs=torch.ones([6])/6
multinomial.Multinomial(10,fair_probs).sample((3,))
(抽样数量,各情况的概率分布).sample((行数,列数))
#probs属性查看对应的概率分布
multinomial.Multinomial(10,fair_probs).probs
#logits属性查看对应的对数概率分布
multinomial.Multinomial(10,fair_probs).logits
缺点:1.维度太高
字母级 -- 128维
词 级 --几万维 -->维度的诅咒:当维度增加时,空间的体积增加得非常之快(以指数增加),以致于可用的数据变得稀疏
- 太稀疏
- 硬编码 -->根据词来对应,而不是学习来的
嵌入层embedding -->高维映射到低维度 -->降维打击
用户输入数据时,很有可能会无意中输入多余的空格,或者在一些场景中,字符串前后不允许出现空格和特殊字符,此时就需要去除字符串中的空格和特殊字符。
这里的特殊字符,指的是制表符(\t)、回车符(\r)、换行符(\n)等。
python 中,字符串变量提供了 3 种方法来删除字符串中多余的空格和特殊字符,它们分别是:
1.str.strip():删除字符串前后(左右两侧)的空格或特殊字符。
2.str.lstrip():删除字符串前面(左边)的空格或特殊字符。
3.str.rstrip():删除字符串后面(右边)的空格或特殊字符。
lower()函数--所有大写字母转换为小写字母
Upper()函数- 小 --> 大
判断一个对象是否是一个已知的类型,类似 type()。
例:a = 2 isinstance (a,int) True
enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
例:example = 'abcd'
for i,j in enumerate(example):
print(i,j)打印结果为:
0 a
1 b
2 c
3 d
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
例:
>>>a = [1,2,3]
>>> b = [4,5,6]
>>> c = [4,5,6,7,8]
>>> zipped = zip(a,b) # 返回一个对象
>>> zipped
<zip object at 0x103abc288>
>>> list(zipped) # list() 转换为列表
[(1, 4), (2, 5), (3, 6)]
>>> list(zip(a,c)) # 元素个数与最短的列表一致
[(1, 4), (2, 5), (3, 6)]
>>> a1, a2 = zip(*zip(a,b)) # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式
>>> list(a1)
[1, 2, 3]
>>> list(a2)
[4, 5, 6]
detach() 方法用于返回一个新的 Tensor,这个 Tensor 和原来的 Tensor 共享相同的内存空间,但是不会被计算图所追踪,也就是说它不会参与反向传播。-->不会计算梯度
这个函数主要是为了生成对角线全1,其余部分全0的二维数组
在PyTorch中,nn.Sequential是一个顺序容器(Sequential Container),可以按照给定的顺序依次添加一系列的网络层和操作,从而构建一个神经网络模型。
例:import torch
import torch.nn as nn
model = nn.Sequential(
nn.Linear(10, 20),
nn.ReLU(),
nn.Linear(20, 30)
)
我们创建了一个具有两个线性层和一个ReLU激活函数的神经网络模型。这些层会按照添加的顺序依次连接起来,构成一个序列模型。
net.parameters()是一个用于获取神经网络模型中所有需要更新的可训练参数的函数。在深度学习中,神经网络的参数通常是指网络中可被优化的权重和偏置等参数。
net.collect_params()是一个用于获取神经网络模型中所有可训练参数的函数。在深度学习中,神经网络的参数通常是指网络中可被优化的权重和偏置等参数。
使用d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, trainer,)生成train loss图像
torch.optim.SGD(params,
lr=<required parameter>,
momentum=0,
dampening=0,
weight_decay=0,
nesterov=False)
Params:模型里需要被更新的可学习参数
Lr:学习率
Momentum:动量值 动量是物理中的概念,它使v具有惯性,这样可以缓和v的抖动,有时候还可以帮助跳出局部盆地。
nn.CrossEntropyLoss(reduction='none')是PyTorch中的一个损失函数,用于计算多类别分类任务中的交叉熵损失。
参数reduction用于指定损失的降维方式。当reduction='none'时,表示不对损失进行降维或聚合,而是返回一个与输入的批次数据形状相同的张量。但在实际使用中,通常会选择使用reduction='mean'或reduction='sum'将损失张量进行降维,得到一个标量作为最终的损失结果。
利用Python的生成器,逐个生成数据的batch并进行训练。
fit_generator(self, generator, steps_per_epoch,
epochs=1,verbose=1,callbacks=None,validation_data=None,
validation_steps=None,class_weight=None,max_q_size=10,
workers=1,pickle_safe=False,initial_epoch=0)
其中:参数generator:生成器函数
steps_per_epoch:整数 每轮的步数
epochs:整数,数据迭代的轮数
verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录
model.fit_generator()函数参数_model.fit_generator参数-优快云博客
torch.nn.Conv2d( in_channels, #输入数据的通道数(如彩色图片,一般为3)
out_channels, #输出数据的通道数(就是我想让输出多少通道,就设置为多少)
kernel_size, #卷积核的尺寸(如(3,2),3与(3,3)等同)
stride = 1, #卷积步长,就是卷积操作时每次移动的格子数
padding = 0, #原图周围需要填充的格子行(列)数,无填充的话卷积到边缘会直接忽略该边缘
dilation = 1, #空洞卷积的空洞指数,一般默认为1即可
groups = 1, #分组卷积的组数,一般默认设置为1,不用管
bias = True, #卷积偏置,一般设置为False,True的话可以增加模型的泛化能力
padding_mode = 'zeros' #设置边缘填充值为0,或别的数,一般都默认设置为0
)
特性:
- lambda 函数是匿名的:
所谓匿名函数,通俗地说就是没有名字的函数。lambda函数没有名字。
- lambda 函数有输入和输出:
输入是传入到参数列表argument_list的值,输出是根据表达式expression计算得到的值。
- lambda 函数拥有自己的命名空间:
不能访问自己参数列表之外或全局命名空间里的参数,只能完成非常简单的功能。
语法:lambda [arg1 [,arg2,.....argn]]:expression
其中[arg…] 是参数列表;expression 是一个参数表达式
Python 之 lambda 函数完整详解 & 巧妙运用_lambda函数python-优快云博客
在这里的代码中,np.expand_dims(x, 2) 的作用是在张量 x 的第二个轴上增加一个维度。
如果张量 x 的形状为 (batch_size, seq_length),那么经过 K.expand_dims(x, 2) 操作后,x 的形状将变为 (batch_size, seq_length, 1)。
如果张量 x 的形状为 (batch_size, seq_length),那么经过 K.expand_dims(x, 1) 操作后,x 的形状将变为 (batch_size, 1, seq_length)
PyTorch 中,型可以处于两种模式下,即训练模式train()和评估模式eval()。在训练模式下,模型通常会执行一些特定的操作(如 dropout),而在评估模式下,模型会关闭一些特定的操作,并输出更稳定的结果。
将我们需要的层放入到一个集合中,然后将这个集合作为参数传入nn.ModuleList中
例:model_list = nn.ModuleList([nn.Conv2d(1, 5, 2),
nn.Linear(10, 2),
nn.Sigmoid()
])
metric.add() 函数的作用是将每次迭代计算得到的损失值和样本数量添加到度量器 metric 中。
例:
#Accumulator 是一个用于累加指标的辅助类,用于计算和存储指标的平均值。
#metric[0].item()和metric[1].item()分别获取训练集和验证集指标的平均值
metric=d2l.Accumulator(2)
l=loss(output,labels).sum()
l.backward()
trainer.step()
metric.add(l,labels.shape[0])
r" " 的作用是去除转义字符.
f" "开头表示在字符串内支持大括号内的python 表达式
b" "前缀表示:后面字符串是bytes 类型
r" "后面字符串以 Unicode 格式 进行编码,一般用在中文字符串前面,防止因为源码储存格式问题,导致再次使用时出现乱码
argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块,argparse 模块可以让人轻松编写用户友好的命令行接口。通过在程序中定义好我们需要的参数,然后 argparse 将会从 sys.argv 解析出这些参数。argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
三个步骤:
- 创建一个解析器——创建 ArgumentParser() 对象
例如:parser = argparse.ArgumentParser(description='test')
- 添加参数——调用 add_argument() 方法添加参数
通常,这些调用指定 ArgumentParser 如何获取命令行字符串并将其转换为对象。这些信息在 parse_args() 调用时被存储和使用
例如:parser.add_argument('--seed', type=int, default=72, help='Random seed.')
部分参数含义:
name or flags - 选项字符串的名字或者列表,例如 foo 或者 -f, --foo。
action - 命令行遇到参数时的动作,默认值是 store。
store_const,表示赋值为cons
default - 不指定参数时的默认值。
type - 命令行参数应该被转换成的类型。
choices - 参数可允许的值的一个容器
help - 参数的帮助信息,当指定为 argparse.SUPPRESS 时表示不显示该参数的帮助信息.
- 解析参数——使用 parse_args() 解析添加的参数
例如:args = parser.parse_args()
注:
args分为可选参数(用--指定)和必选参数(不加--指定)。
如果你定义参数xxx时,没有用--指定,那么该参数为需要在命令行内手动指定。此时即使通过default设置默认参数,也还是会报错。
--max_episode_len,然后也有人写是--max-episode-len《==》’-’对应’_’,代码里写的不一样或者都改成一样的都可以
python之parser.add_argument()用法——命令行选项、参数和子命令解析器-优快云博客
读取checkpoint文件中的变量信息,进而了解哪些变量(全部)保存在checkpoint文件中。
#创建一个CheckpointReader对象来读取checkpoint文件
reader=tf.compat.v1.train.NewCheckpointReader(ckpt_file)
#用于获取所有变量名到形状的映射,返回一个字典
var_to_shape_map = reader.get_variable_to_shape_map()
# Print tensor name and values
for key in var_to_shape_map:
print("tensor_name: ", key)
列出指定checkpoint文件中保存的所有变量名和形状信息。
#返回值:一个列表,包含变量名和形状信息的元组(variable_name, shape)
tf.train.list_variables(checkpoint_path):
# 打印变量名和形状信息
for var in var_list:
print(var)
append()是向列表尾部追加一个新元素,列表只占一个索引位,在原有列表上增加。
extend()向列表尾部追加一个列表,将列表中的每个元素都追加进来,在原有列表上增加
用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
TensorFlow 模型中定义占位符的函数 add_placeholders
例如:self.word_ids = tf.placeholder(tf.int32, shape=[None, None], name="word_ids")
word_ids: 用于存储输入的单词或词汇的占位符,数据类型为tf.int32,形状为 [None, None],表示可以传入任意大小的二维整数张量,命名为 “word_ids”。
占位符在 TensorFlow 模型中通常用于定义输入数据的格式以及在训练和推理过程中动态传入不同的值。在训练时,您可以通过 feed_dict 参数向这些占位符喂入具体的数值。
作用:用于生成一个初始值为initial-value的变量。必须指定初始化值。
例如:
tf.Variable(initial_value=None, trainable=True, collections=None, validate_shape=True, caching_device=None, name=None, variable_def=None, dtype=None, expected_shape=None, import_scope=None)
其中trainable表示模型训练的时候是否会更新这个参数
作用:用于获取已存在的变量(要求不仅名字,而且初始化方法等各个参数都一样),如果不存在,就新建一个。可以用各种初始化方法,不用明确指定值。
例如:tf.get_variable(name, shape=None, dtype=None, initializer=None, regularizer=None,trainable=True, collections=None, caching_device=None, partitioner=None, validate_shape=True, custom_getter=None)
其中参数name:新变量或现有变量的名称,这个参数是必须的,函数会根据变量名称去创建或者获取变量。
两者区别:
- 使用tf.Variable时,能真正的定义变量,如果检测到命名冲突,系统会自己处理。使用tf.get_variable()时,是获取变量,系统不会处理冲突,而会报错
- 基于这两个函数的特性,当我们需要共享变量的时候,需要使用tf.get_variable()。在其他情况下,这两个的用法是一样的。为了方便变量管理,tensorflow 还有一个变量管理器,叫做tf.variable_scope,也就是说定义了variable_scope,这样才可以有相同的名字
TensorFlow学习笔记(一): tf.Variable() 和tf.get_variable()详解-优快云博客
TensorFlow提供了Variable Scope 这种独特的机制来共享变量。通过tf.variable_scope()指定作用域进行区分。
tensorflow变量作用域tf.variable_scope介绍_with tf.variable_scope-优快云博客
例如:
Tf.nn.dropout(x, keep_prob, noise_shape=None, seed=None, name=None)
参数 keep_prob: 表示的是保留的比例,假设为0.8 则 20% 的数据变为0,然后其他的数据乘以 1/keep_prob;keep_prob 越大,保留的越多;
注意:
dropout必须设置概率keep_prob,keep_prob应初始化为占位符placeholder
另:
tf.layers.dropout(inputs,rate=0.5,noise_shape=None,seed=None,training=False,name=None)
两者区别:
1、tf.nn.dropout 中参数 keep_prob :每一个元素被保存下的概率。
2、tf.layer.dropout 中参数 rate :每一个元素丢弃的概率。keep_prob = 1 - rate
从params (可以理解是embedding 字典) 中根据对应 ids 获取对应的 Tensor (向量 embedding) 。从嵌入矩阵中查找对应的词向量
例如:
tf.nn.embedding_lookup(
params, ids, max_norm=None, name=None
)
使用tensorflow创建张量
例如:a=tf.constant([[1,2,3],[2,2,2]]) #表示全部元素
<tf.Tensor: shape=(2, 3), dtype=int32, numpy=
array([[1, 2, 3],
[2, 2, 2]])>
Tensorflow:张量(Tensor)的创建及其基础操作_tensorflow创建张量-优快云博客
主要用于数据填充时候使用
sequence_mask(
lengths,
maxlen=None,
dtype=tf.bool,
name=None
)
参数maxlen:当默认None,默认从lengths中获取最大的那个数字,决定返回mask张量的长度;当为N时,返回的是N长度
函数返回的一个mask张量,默认其中内部元素类型是tf.bool(布尔变量)
经过tf.Session()打印可以得到一个array数据。
例如:lenght=[2,3,4]
mask_data = tf.sequence_mask(lengths=lenght)
<tf.Tensor: shape=(3, 4), dtype=bool, numpy=
array([[ True, True, False, False],
[ True, True, True, False],
[ True, True, True, True]])>
mask_data = tf.sequence_mask(lengths=lenght,maxlen=5)
<tf.Tensor: shape=(3, 5), dtype=bool, numpy=
array([[ True, True, False, False, False],
[ True, True, True, False, False],
[ True, True, True, True, False]])>
TensorFlow笔记之:填充使用tf.sequence_mask()函数详细说明和应用场景-优快云博客
作用:通过布尔值过滤元素
def boolean_mask(tensor, mask, name="boolean_mask", axis=None):
tensor:被过滤的元素列表或数组
mask:一堆 bool 值,它的维度不一定等于 tensor
return: mask为true对应的 tensor 的元素
用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。
reduce_mean(input_tensor,
axis=None,
keep_dims=False,
name=None,
reduction_indices=None
)
input_tensor: 输入的待降维的tensor;
axis: 指定的轴,如果不指定,则计算所有元素的均值;
keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
tensorflow中 tf.reduce_mean函数-优快云博客
- tf.argmax(input,axis)
根据axis取值的不同返回每行或者每列最大值的索引.
axis=0时比较每一列的元素
axis=1时比较每一行的元素
返回的是最大元素所在的索引数组
summary是TensorFlow可视化的工具
在训练过程中,主要用到了tf.summary()的各类方法,能够保存训练过程以及参数分布图并在tensorboard显示
- tf.summary.scalar(tags, values, collections=None, name=None)用来显示标量信息
- tf.summary.merge(inputs, collections=None, name=None)
一般选择要保存的信息还需要用到tf.get_collection()函数(筛选图中summary信息)
例如:
tf.summary.scalar('accuracy',acc) #生成准确率标量图
merge_summary = tf.summary.merge([tf.get_collection(tf.GraphKeys.SUMMARIES,'accuracy'),...(其他要显示的信息)])
- tf.summary.histogram(tags, values, collections=None, name=None)
用来显示直方图信息
例如:tf.summary.histogram('histogram', var)
- tf.summary.distribution()
分布图,一般用于显示weights分布
- tf.summary.merge_all()
merge_all 可以将所有summary全部保存到磁盘,以便tensorboard显示。如果没有特殊要求,一般用这一句就可一显示训练时的各种信息了。
- tf.summary.FileWritter(path,sess.graph)
tf.summary.FileWriter:指定一个文件用来保存图
调用其add_summary()方法将训练过程数据保存在filewriter指定的文件中
- tf.summary.create_file_writer(logdir,max_queue=10,flush_millis=None, filename_suffix=None, name=None)
创建并返回一个 SummaryWriter 对象,生成的日志将储存到logdir指定的路径中。
打开tensorboard查看可视化:在命令行输入:tensorboard --logdir = 日志文件夹路径,例如:
tensorboard --logdir
"D:/try-zh-NER-TF-master/data_path_save/1713585069",然后打开网页http://localhost:6006
TensorFlow 之 Summary 的用法 - Mydream6 - 博客园 (cnblogs.com)
tf.summary 与 tensorboard - 知乎 (zhihu.com)
TensorFlow的Summary - 知乎 (zhihu.com)
创建双向递归神经网络的动态版本
bidirectional_dynamic_rnn(
cell_fw, # 前向RNN
cell_bw, # 后向RNN
inputs, # 输入
sequence_length=None,#输入序列的实际长度(可选,默认为输入序列的最大长度)
initial_state_fw=None, #前向的初始化状态(可选)
initial_state_bw=None, #后向的初始化状态(可选)
dtype=None, #初始化和输出的数据类型(可选)
parallel_iterations=None,
swap_memory=False,
time_major=False,
scope=None
)
返回一个(outputs,output_states)元组
outputs 是一个一个(output_fw,output_bw)元组,里面包括前向和后向的结果,每一个结果都包含所有的时刻的输出结果 shape为[batch_size,num_step,num_hidden]
num_step 是指时间步数,表示输入序列的长度,如果指定了 sequence_length 参数,则 num_step 等于 sequence_length;如果没有指定 sequence_length 参数,则 num_step 是输入序列的最大长度。
output_states 一个(output_state_fw,output_state_bw)的元组,每一个结果里面的都包含两个状态,只包含最后一个时刻(前后、后项的最后一个)的两个输出
例如:(output_fw_seq,output_bw_seq),_=tf.nn.bidirectional_dynamic_rnn(...)
TensorFlow函数:tf.nn.bidirectional_dynamic_rnn_w3cschool
数据迭代器
参数说明:
dataset(必需):用于加载数据的数据集,通常是torch.utils.data.Dataset的子类实例。
batch_size(可选): 每个批次的数据样本数。默认值为1。
shuffle(可选): 是否在每个周期开始时打乱数据。默认为False。
sampler(可选): 定义从数据集中抽取样本的策略。如果指定,则忽略shuffle参数。
batch_sampler(可选):与sampler类似,但一次返回一个批次的索引。不能与batch_size、shuffle和sampler同时使用。
num_workers(可选): 用于数据加载的子进程数量。默认为0,意味着数据将在主进程中加载。
collate_fn(可选): 如何将多个数据样本整合成一个批次。通常不需要指定。
drop_last(可选): 如果数据集大小不能被批次大小整除,是否丢弃最后一个不完整的批次。默认为False。
PyTorch入门必学:DataLoader(数据迭代器)参数解析与用法合集_dataloader参数-优快云博客
计算损失函数相对于模型参数的梯度
计算loss中可训练的var_list中的梯度
返回(gradient, variable)对的列表(梯度-变量对的列表)
深度学习学习笔记——optimizer里的computer_gradients和apply_gradients和tape的函数gradient-优快云博客
使用计算得到的梯度来更新对应的variable.
无返回值,把计算出来的梯度更新到变量上去
apply_gradients(
grads_and_vars,#(梯度-变量对的列表)
global_step=None,
name=None
)
参数:
global_step:梯度每下降一次加1,用于记录迭代优化的次数,用于参数输出和保存
global_step的意义:
1.学习率衰减:在优化器中配置学习率衰减时,会根据全局步数的值来动态调整学习率。通过不断增加 global_step 的值,可以实现随着训练的进行逐渐降低学习率,有助于模型更精细地调整参数,提高模型性能。
2.保存模型:在训练过程中,可以将全局步数作为一个标识,用于保存训练过程中不同时间点的模型参数。这样可以方便地选择特定训练轮次的模型进行加载和继续训练,或者用于模型评估和推理。
3.可视化:全局步数也常用于训练过程中的可视化和监控。通过损失函数随全局步数的变化曲线,可以直观地了解模型的训练情况,为调优提供参考
深度学习学习笔记——optimizer里的computer_gradients和apply_gradients和tape的函数gradient-优快云博客
以终为始:compute_gradients 和 apply_gradients - 知乎 (zhihu.com)
作用于从一个均匀分布的区域中随机采样。
np.random.uniform(low, high ,size)
其形成的均匀分布区域为[low, high)
1.low:采样区域的下界,float类型或者int类型或者数组类型或者迭代类型,默认值为0
2.high:采样区域的上界,float类型或者int类型或者数组类型或者迭代类型,默认值为1
3.size:输出样本的数目(int类型或者tuple类型或者迭代类型)
4.返回对象:ndarray类型,形状和size中的数值一样
np.random.uniform()函数用法总结-优快云博客
from transformers import BertTokenizer,BertModel
#加载预训练模型
bert=BertModel.from_pretrained('bert-base-chinese')
参数:
input_ids ((torch.LongTensor) (batch_size, sequence_length))
词汇表中输入序列标记的索引
attention_mask((torch.FloatTensor)(batch_size,sequence_length), optional)
对输入数据进行mask,解决pad问题.在 [0, 1] 中选择的掩码值:1 表示未屏蔽的标记,0 表示已屏蔽的标记
token_type_ids((torch.LongTensor)(batch_size,sequence_length), optional)
分段标记索引以指示输入的第一和第二部分。在 [0, 1] 中选择索引:0对应一个句子A的token,1对应一个句子B的token。
#不训练,不需要计算梯度
for param in bert.parameters():
param.requires_grad_(False)
【Transformers】BertModel模块的输入与输出-优快云博客
Tqdm 是 Python 进度条库,可以在 Python 长循环中添加一个进度提示信息。用户只需要封装任意的迭代器,是一个快速、扩展性强的进度条工具库。
在tensorflow2.x版本中使用tensorflow1.x版本的内容:
1.import tensorflow as tf
---> import tensorflow.compat.v1 as tf
2.from tensorflow.contrib.rnn import LSTMCell
---> tf.disable_eager_execution()
LSTMCell=tf.nn.rnn_cell.BasicRNNCell
3.from tensorflow.contrib.crf import viterbi_decode
contrib在tensorflow2.x版本中已弃用
---> from tensorflow_addons.text.crf import viterbi_decode
4.from keras.utils import to_categorical
--->from tensorflow.python.keras.utils.np_utils import to_categorical
5.cannot import name 'InputSpec' from 'keras.engine'
---> from tensorflow.keras.layers import InputSpec
6.cannot import name 'Layer' from 'keras.engine'
---> from keras.layers import Layer
7.module 'keras.utils' has no attribute 'Sequence'
这个错误通常是因为你在使用 Keras 的时候,导入的是旧版本的 Keras 库,而不是新版本的。在新版本的 Keras 中, Sequence 被移到了 tensorflow.keras.utils 中
--->tensorflow.keras.utils.Sequence
8.'list' object has no attribute 'shape'
先转换为array格式 numpy.array同时支持len, size, shape,
--->print("word_ids.shape:",np.array(word_ids).shape)
9.RuntimeError: The Session graph is empty. Add operations to the graph before calling run()
原因:Eager Execution 模式(动态图模式)在 TensorFlow 2.x 默认是开启的。在 Eager Execution 模式下,计算操作会立即执行并返回结果,而不需要构建静态计算图。
解决方法:(添加代码)
# 创建一个 TensorFlow 1.x 风格的计算图
tf.compat.v1.disable_eager_execution()
# 关闭 Eager Execution 模式
HuggingHub接触中遇到的问题和学习--1(入门informer实现序列模型) - 知乎 (zhihu.com)
xml的结构性关系包括节点关系及属性内容
xml的基本单位是元素,开始标记,属性,结束标记组成
例如:
〈?xml version="1.0" encoding="gb2312" ?〉
〈参考资料〉
〈书籍〉
〈名称〉xml入门精解〈/名称〉
〈作者〉张三〈/作者〉
〈价格 货币单位="人民币"〉20.00〈/价格〉
〈/书籍〉
〈书籍〉
〈名称〉xml语法〈/名称〉
〈!--此书即将出版--〉
〈作者〉李四〈/作者〉
〈价格 货币单位="人民币"〉18.00〈/价格〉
〈/书籍〉
〈/参考资料〉