【Python】学习笔记
- 【Python】
- 1. in和not in操作
- 2.glob
- 3.Pandas.apply()
- 4.df.dropna()
- 5.fine-tune
- 迁移学习——Fine-tune
- 蒸馏
- 参考文献
【Python】
1. in和not in操作
利用in和not in操作符,可以确定一个值是否在列表中。像其他操作符一样,in和not in用在表达式中,连接两个值:一个要在列表中查找的值,以及待查找的列表。这些表达式将求值为布尔值。
成员操作符 in
str = "string test string test"
find1 = "str"
find2 = "test"
print(find1 in str) # True
print(find1 not in str) # False
in不只是在字符串中可以使用哦!
使用字符串对象的 find() 、 rfind() 、 index() 、 rindex()
str = "string test string test"
find1 = "str"
find2 = "test"
# find
print(str.find(find1)) # 0
print(str.find(find2)) # 7# rfind
print(str.rfind(find1)) # 12
print(str.rfind(find2)) # 19# index
print(str.index(find1)) # 0
print(str.index(find2)) # 7# rindex
print(str.rindex(find1)) # 12
print(str.rindex(find2)) # 19# count
print(str.count(find1)) # 2
print(str.count(find2)) # 2
find()和index()的区别
方法 | 区别 |
---|---|
find() | 获取值时,如果要查找的值不存在,会返回-1 |
index() | 获取值的索引时,如果不存在值,会报值 |
方法 区别
find() 从字符串左边开始查询子字符串匹配到的第一个索引(从0开始)
rfind() 从字符串右边开始查询字符串匹配到的第一个索引(从0开始)
index()和rindex()的区别
方法 区别
index() 从字符串左边开始查询子字符串匹配到的第一个索引(从0开始)
rindex() 从字符串右边开始查询字符串匹配到的第一个索引(从0开始)
2.glob
glob.glob():返回所有匹配的文件路径列表、glob.iglob():获取一个可遍历生成器,使用它可以迭代获取匹配的文件路径名
glob模块是最简单的模块之一,内容非常少。用它可以查找符合特定规则的文件路径名。跟使用windows下的文件搜索差不多。
查找文件只用到三个匹配符:
“*”:匹配0个或多个字符;
“?”:匹配单个字符;
“[]”:匹配指定范围内的字符,如:[0-9]匹配数字;
- glob.glob
返回所有匹配的文件路径列表。它只有一个参数pathname,定义了文件路径匹配规则,这里可以是绝对路径,也可以是相对路径。下面是使用glob.glob的例子:
import glob#获取指定目录下的所有图片
print (glob.glob(r"/home/qiaoyunhao/*/*.png"),"\n")#加上r让字符串不转义#获取上级目录的所有.py文件
print (glob.glob(r'../*.py')) #相对路径
import os
import globcp_files = sorted(glob.glob(os.path.join(args.model_path, 'model_step_*.pt')))
print(cp_files)
————————————————
- glob.iglob
获取一个可迭代的生成器,使用它可以逐个获取匹配的文件路径名。
与glob.glob()的区别是:glob.glob同时获取所有的匹配路径,而glob.iglob一次只获取一个匹配路径。这有点类似于.NET中操作数据库用到的DataSet与DataReader。下面是一个简单的例子:
import glob
#父目录中的.py文件
f = glob.iglob(r'../*.py')
print (f) #<generator object iglob at 0x00B9FF80>
for py in f:print (py)
————————————————
版权声明:本文为CSDN博主「u013250861」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013250861/article/details/120576548
3.Pandas.apply()
apply() 函数的自由度较高,可以直接对 Series 或者 DataFrame 中元素进行逐元素遍历操作,方便且高效,具有类似于 Numpy 的特性。
apply() 使用时,通常放入一个 lambda 函数表达式、或一个函数作为操作运算,官方上给出的 apply() 用法:
DataFrame.apply(self, func, axis=0, raw=False, result_type=None, args=(), **kwds
func 代表的是传入的函数或 lambda 表达式;
axis 参数可提供的有两个,该参数默认为0/列
0 或者 index ,表示函数处理的是每一列;
1 或 columns ,表示处理的是每一行;
raw ;bool 类型,默认为 False;
False ,表示把每一行或列作为 Series 传入函数中;
True,表示接受的是 ndarray 数据类型;
apply() 最后的是经过函数处理,数据以 Series 或 DataFrame 格式返回。
Series 使用apply()
Series 使用 apply() 函数与 DataFrame 相似,用法上最大区别就是加了一个列名 DataFram.类名
1,列 A 中所有元素加 1
不用 apply() 的方法
df.A =df.A +1
利用 apply() 函数进行操作,这里我传入一个 lambda 函数:
df.A = df.A.apply(lambda x:x+1)
df
A B C
0 5 9 13
1 5 9 13
2 5 9 13
2,判断列 A 中元素是否能够被2整除,用 Yes 或 No在旁边标注
df.A = df.A.apply(lambda x:str(x)+“\tYes” if x%2==0 else str(x)+“\tNo”)
df
A B
0 5\tNo 9
1 5\tNo 9
2 5\tNo 9
4.df.dropna()
df.dropna()函数用于删除dataframe数据中的缺失数据,即 删除NaN数据.
Parameters | 说明 |
---|---|
axis | 0为行 1为列,default 0,数据删除维度 |
how | {‘any’, ‘all’}, default ‘any’,any:删除带有nan的行;all:删除全为nan的行 |
thresh | int,保留至少 int 个非nan行 |
subset | list,在特定列缺失值处理 |
inplace | bool,是否修改源文件 |
5.fine-tune
就是用别人训练好的模型,加上我们自己的数据,来训练新的模型。finetune相当于使用别人的模型的前几层,来提取浅层特征,然后在最后再落入我们自己的分类中。
finetune的好处在于不用完全重新训练模型,从而提高效率,因为一般新训练模型准确率都会从很低的值开始慢慢上升,但是fine tune能够让我们在比较少的迭代次数之后得到一个比较好的效果。
在数据量不是很大的情况下,finetune会是一个比较好的选择。但是如果你希望定义自己的网络结构的话,就需要从头开始了。
迁移学习——Fine-tune
迁移学习背景:
在传统的机器学习的框架下,学习的任务就是在给定充分训练数据的基础上来学习一个分类模型;然后利用这个学习到的模型来对测试文档进行分类与预测。然而,我们看到机器学习算法在当前的Web挖掘研究中存在着一个关键的问题:一些新出现的领域中的大量训练数据非常难得到。我们看到Web应用领域的发展非常快速。大量新的领域不断涌现,从传统的新闻,到网页,到图片,再到博客、播客等等。传统的机器学习需要对每个领域都标定大量训练数据,这将会耗费大量的人力与物力。而没有大量的标注数据,会使得很多与学习相关研究与应用无法开展。其次,传统的机器学习假设训练数据与测试数据服从相同的数据分布。然而,在许多情况下,这种同分布假设并不满足。通常可能发生的情况如训练数据过期。这往往需要我们去重新标注大量的训练数据以满足我们训练的需要,但标注新数据是非常昂贵的,需要大量的人力与物力。从另外一个角度上看,如果我们有了大量的、在不同分布下的训练数据,完全丢弃这些数据也是非常浪费的。如何合理的利用这些数据就是迁移学习主要解决的问题。迁移学习可以从现有的数据中迁移知识,用来帮助将来的学习。迁移学习(Transfer Learning)的目标是将从一个环境中学到的知识用来帮助新环境中的学习任务。因此,迁移学习不会像传统机器学习那样作同分布假设。
什么是迁移学习?
迁移学习(Transfer learning) 顾名思义就是把已训练好的模型参数迁移到新的模型来帮助新模型训练。考虑到大部分数据或任务都是存在相关性的,所以通过迁移学习我们可以将已经学到的模型参数(也可理解为模型学到的知识)通过某种方式来分享给新模型从而加快并优化模型的学习效率不用像大多数网络那样从零学习。
模型的训练与预测:
深度学习的模型可以划分为 训练 和 预测 两个阶段。
训练 分为两种策略:一种是白手起家从头搭建模型进行训练,一种是通过预训练模型进行训练。
预测 相对简单,直接用已经训练好的模型对数据集进行预测即可。
1.为什么要迁移学习?
1)站在巨人的肩膀上:前人花很大精力训练出来的模型在大概率上会比你自己从零开始搭的模型要强悍,没有必要重复造轮子。
2)训练成本可以很低:如果采用导出特征向量的方法进行迁移学习,后期的训练成本非常低,用CPU都完全无压力,没有深度学习机器也可以做。
3)适用于小数据集:对于数据集本身很小(几千张图片)的情况,从头开始训练具有几千万参数的大型神经网络是不现实的,因为越大的模型对数据量的要求越大,过拟合无法避免。这时候如果还想用上大型神经网络的超强特征提取能力,只能靠迁移学习。
2.迁移学习有几种方式
1)Transfer Learning:冻结预训练模型的全部卷积层,只训练自己定制的全连接层。
2)Extract Feature Vector:先计算出预训练模型的卷积层对所有训练和测试数据的特征向量,然后抛开预训练模型,只训练自己定制的简配版全连接网络。
3)Fine-tune:冻结预训练模型的部分卷积层(通常是靠近输入的多数卷积层),训练剩下的卷积层(通常是靠近输出的部分卷积层)和全连接层。
注:Transfer Learning关心的问题是:什么是“知识”以及如何更好地运用之前得到的“知识”,这可以有很多方法和手段,eg:SVM,贝叶斯,CNN等。而fine-tune只是其中的一种手段,更常用于形容迁移学习的后期微调中。
3.三种迁移学习方式的对比
1)第一种和第二种训练得到的模型本质上并没有什么区别,但是第二种的计算复杂度要远远优于第一种。
2)第三种是对前两种方法的补充,以进一步提升模型性能。要注意的是,这种方法并不一定能真的对模型有所提升。
本质上来讲:这三种迁移学习的方式都是为了让预训练模型能够胜任新数据集的识别工作,能够让预训练模型原本的特征提取能力得到充分的释放和利用。但是,在此基础上如果想让模型能够达到更低的Loss,那么光靠迁移学习是不够的,靠的更多的还是模型的结构以及新数据集的丰富程度。
实验:尝试对模型进行微调,以进一步提升模型性能
1.Fine-tune所扮演的角色
拿到新数据集,想要用预训练模型处理的时候,通常都会先用上面方法一或者方法二来看看预训练模型在新数据上的表现怎么样,摸个底。如果表现不错,还想看看能不能进一步提升,就可以试试Fine-tune,进一步解锁卷积层以继续训练模型。
但是不要期待会有什么质的飞跃。
另外,如果由于新数据集与原数据集(例如ImageNet数据集)的差别太大导致表现很糟,那么一方面可以考虑自己从头训练模型,另一方面也可以考虑解锁比较多层的训练,亦或干脆只用预训练模型的参数作为初始值,对模型进行完整训练。
2.Fine-tune 也可以有三种操作方式
注:其实基本思路都是一样的,就是解锁少数卷积层继续对模型进行训练。
场景1:已经采用方法一的方式,带着冻僵的卷积层训练好分类器了。
如何做:接着用方法一里的模型,再解锁一小部分卷积层接着训练就好了。
场景2:已经采用方法二里的方式,把分类器训练好了,现在想要进一步提升模型。
如何做:重新搭一个预训练模型接新分类器,然后把方法二里训练好的分类器参数载入到新分类器里,解锁一小部分卷积层接着训练。
场景3:刚上手,想要 Transfer Learning + Fine-tune一气呵成。
如何做:和方法一里的操作一样,唯一不同的就是只冻僵一部分卷积层训练。需要注意的是,这么做需要搭配很低的学习率,因此收敛可能会很慢。
摘录:https://zhuanlan.zhihu.com/p/30121601
迁移学习: 把预训练模型参数迁移到新的模型上,帮助模型训练。
应用场景
数据集中只有少量的label data,直接训练效果很差,容易过拟合。
蒸馏
分支
模型蒸馏/压缩 Distillation
就是用户停留时长、(广告)曝光比列之类的 后验特征统计的特征,这种信号强, 只能离线获取的特征【线上无法获得】加入 模型中 去蒸馏
离线环境下,会同时训练两个模型:一个学生模型和一个教师模型。其中教师模型额外利用了优势特征,则准确率更高。将教师模型蒸馏出来的知识传递给学生模型,辅助其训练,提升学生的准确率。
线上服务时,只用学生模型进行部署,由于输入中不依赖优势特征,则保证了线上线下特征的一致性。
作用
压缩模型体积
手段
fine tune/ fine tuning:微调,一种调参手段
y=wx,若w实际为5。
如果w初始化为0,需不断反向传播更新后得到5。
但直接初始化为4.7【相当于给一个pre-trained model】,之后fine tune【后面更新w的过程】,能很快得到5
优点
不做微调:从头训练,需大量数据,需时间和计算资源;模型不收敛,准确率低,模型容易过拟合,泛化能力低。
使用微调:无次问题。
使用场景
数据集和预训练模型的数据集相似, 数据集中只有少量的label data,模型正确率低
具体操作
学习率设置
使用较小的学习率来训练,因为预训练的权重相对随机初始化的权重已经很好了,过快扭曲它们。通常学习率比从头开始训练的初始学习率小10倍。
使用哪些层权重
如果数据量过少,只训练预训练网络的最后一层softmax层;截断预训练网络的最后一层(softmax层),用训练集中相关的softmax替换它。如:ImageNet上预训练的网络有1000个类别的softmax图层,训练集中只有10个类别的分类,则网络的新的softmax层由10个类别组成。
如果数据量中等,可冻结预训练网络的前k层权重,再次训练剩余的(n-k)层。因为前几层捕捉的是通用特征,如边、曲线,希望保持不变。
multi-task learning
fine tune是先学习预训练数据集,再学习数据集。
mult-task learning是同时学习。
参考文献
1.https://blog.csdn.net/qdPython/article/details/117419793?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167888171316800184141246%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=167888171316800184141246&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-1-117419793-null-null.142v73wechat,201v4add_ask,239v2insert_chatgpt&utm_term=python%E4%B8%AD%E5%88%A4%E6%96%AD%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%8C%85%E5%90%AB%E6%9F%90%E4%B8%AA%E5%AD%97%E7%AC%A6&spm=1018.2226.3001.4187
2 http://t.csdn.cn/EqAdy
3.原文链接:https://blog.csdn.net/puspos/article/details/120023434## 迁移学习 fine tune(微调) 模型蒸馏