简介: 本文涉及python、matlab基础、深度学习主流框架(pytorch、tensorflow、Keras)
全文概览
- Part1: Python基础
-
-
-
- try ... except / final / else
- with open () as
- json.dump()
- global
- lower
- loc、iloc
- assert
- python中*的用法
- if else 的多种写法
- isinstance
- hdf5文件加载
- 解决anaconda中pytorch环境打开Jupyter连接不上Kernel(内核)的问题
- enumerate
- 关于list
- 深浅拷贝
- python中的self
- pycharm调整字体
- 读取字典中的所有key
- 切片操作
- split
- 正则表达式取字符串
- os.path.basename() —— 返回path最后的文件名
-
-
- Part2:Pytorch基础(顺序:上面的是最新的)
-
-
-
- torch.max
- dataloader中的batch_sampler
- 图像通道变换
- with torch.no_grad() 和 requires_grad
- AverageMeter()
- optim.Adam使用
- 划分数据集train_test_split用法(联系k折验证)
- pytorch自带模型加载
- unsqueeze_和unsqueeze
- 预训练模型 —— save、load、state_dict、load_state_dict
- nn.Module、nn.Sequential和torch.nn.parameter
- 可视化loss
-
-
- Part3:Tensorflow 基础
-
-
-
- keras 和 tensorflow 关系
- keras中的GlobalAveragePooling2D和AveragePooling2D
- self.sess.run
-
-
- Part4: Keras基础
-
-
-
- Model
-
-
- Part5: Matlab基础
-
-
-
- 卷积、相关操作
- cat
- 对数(以任意数为底)
- 滤波
-
-
- Part6:相关库
-
-
-
- matplotlib
- numpy
- Pandas
-
-
Part1: Python基础
- try … except / final / else
try:
可能出现异常的代码段
excpet 异常情况1:#有异常,且是异常情况1,执行~
~
excpet 异常情况2:#有异常,且是异常情况2,执行~~
~~
except:#有异常,但不是异常情况1和2中任何一个,执行~~~
~~~
else:#无异常,执行~!
~!
finall:#无论是否有异常,都执行!!!
!!!
参考文章:python try语句相关(try/except/else/finally)
- with open () as
好处:不用单独释放内存
参考文章:python 使用 with open() as 读写文件
- json.dump()
with open(文件名,'读写操作w / r')as 变量i:# i就是文件名了
json.dump(待操作的数据,待操作的文件名i)
参考文章:Python json.dump()用法及代码示例
- global
参考文章:python global 用法简介
- lower
- loc、iloc
loc:works on labels in the index.
iloc:works on the positions in the index (so it only takes integers).
也就是说loc是根据标签名来索引,iloc根据位置索引,所以只能是整数
示例:(jupyter里实现)
import numpy as np
import pandas as pd
import matplotlib.pyplot as pltnp.random.seed(123)
mm = pd.DataFrame(np.random.random([10,6]),columns=list('ABCDEF'))
mm_ll = mm.loc[1:6,:]
print(mm)
print(mm_ll)
文章图片
mm_ll = mm.loc[1:6,:]
print(mm)
print(mm_ll)
文章图片
mm_ll = mm.loc[:,mm.columns!="F"]
print(mm_ll)
文章图片
参考文章
- assert
assert 1==1# 条件为 true 正常执行
assert 1==2# 条件为 false 触发异常
Traceback (most recent call last):
File "", line 1, in
AssertionError
参考文章
- python中*的用法
**形参 ——代表这个位置接收任意多个非关键字参数,转成字典方式。
*实参 ——代表的是将输入迭代器拆成一个个元素。
参考文章:【python】*号用法 如nn.Sequential(*layers)
- if else 的多种写法
文章图片
第二种使代码更简洁。(其余写法用的不多,详见参考文章)
参考文章:python 中if-else的多种简洁的写法
- isinstance 参考文章:isinstance
- hdf5文件加载
以SRCNN文件中的.h5为例:
文章图片
import h5py
from h5py import Dataset, Group, Filewith h5py.File('my_modelSRCNN.h5',"r") as f:
for key in f.keys():
# print(f[key], key, f[key].name, f[key].value) # 因为这里有group对象它是没有value属性的,故会异常。另外字符串读出来是字节流,需要解码成字符串。
print(f[key], '|||',key,'|||', f[key].name)
for key in model_group.keys()
print(model_group[key])
文章图片
文章图片
.h5文件写入和读取(HDF5)
- 解决anaconda中pytorch环境打开Jupyter连接不上Kernel(内核)的问题 参考文章
- enumerate
- 关于list 如何查看list的维度
- 深浅拷贝 【Python|Python / Pytorch / Tensorflow / Keras / Matlab / 相关库 积累——持更】参考文章:Python-copy()与deepcopy()区别
- python中的self (1)和普通数相比,在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量self,并且调用时,不用传递该参数。除此之外,类的方法(函数)和普通函数没啥区别,你既可以用默认参数、可变参数或者关键字参数(*args是可变参数,args接收的是一个tuple,**kw是关键字参数,kw接收的是一个dict)。
t = Test() t.ppr()# t.ppr()等同于Test.ppr(t)
(2)实例在调用方法时,如果发现自身实例中没有定义该方法,沿着继承树往上找父类中有无定义要调用的方法,如果父类中定义了,则可调用成功。
参考文章:Python中self用法详解
- pycharm调整字体 Pycharm 字体大小调整
- 读取字典中的所有key 新建一个空列表 配合 .keys()和循环取出.keys()的每个元素 并 append到列表中
python中取得字典全部key的方法
- 切片操作
a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(a[-10])# 0类型:
print(a[0::-1])# 从0往回数 step为1 结果为 [0]类型:
print(a[4::-1])# [4, 3, 2, 1, 0]
print(a[9::-3])# [9, 6, 3, 0]
print(a[:3:-2])# [9, 7, 5]-2代表从后往前; :3表示从9到3停止(算9不算3);step=2
参考:[Python]切片完全指南(语法篇)
- split python3 split(分离器)处理字符串的函数用法
- 正则表达式取字符串
- os.path.basename() —— 返回path最后的文件名 os.path.basename()作用
import os
path='D:/CSDN/s/pp.jpg'
print(os.path.basename(path))# pp.jpg
Part2:Pytorch基础(顺序:上面的是最新的)
- torch.max 示例:
pred, pred_idx = torch.max(outputs.data, dim=1)
# dim = 1按第二个维度(预测类别值的维度)索引最大值;返回两个值 分别为最大值pred 和最大值索引pred_idx
# 说明:dim=1不用去记是按列还是行 就是第二个维度 不知道第二个维度是什么就 运行一下 print (对象.shape),就知道了!
参考文章:torch.max()使用讲解
- dataloader中的batch_sampler [Pytorch] Sampler, DataLoader和数据batch的形成
pytorch之dataloader深入剖析 - 图像通道变换 要求输入网络的是【batch_siaze, channel, height, weight】
# swap color axis because
# numpy image: H x W x C
# torch image: C X H X W
image = image.transpose((2, 0, 1))
Pytorch入门学习(六)— 加载数据以及预处理(初步)— 只为了更好理解流程 ~~ 图像变换的基本写法的部分
- with torch.no_grad() 和 requires_grad 每个tensor都有参数 requires_grad,设置为True,则反向传播时,该tensor就会自动求导,默认是False。且一个叶子节点(端点)设为True,则依赖他的所有节点都为True。但是如果设置了true后,接的是上下文管理器with torch.no_grad()则在该模块下,所有计算得出的tensor的requires_grad都自动设置为False。
参考文章:【pytorch系列】 with torch.no_grad():用法详解 - AverageMeter() 训练和测试的时候 用于 管理变量更新 包括 变量更新(.update)以及重置(.reset) 读取变量时通过 对象.属性 的方式读取
参考文章:AverageMeter()的作用与用法
上面内篇文章是截取了这篇文章的内容 ,TSN算法的PyTorch代码解读(训练部分)【指南:大概在这里“接下来就是main函数的第三部分:训练模型”】
class AverageMeter(object):
def __init__(self):
self.reset()
def reset(self):
self.val = 0
self.avg = 0
self.sum = 0
self.count = 0
def update(self, val, n=1):# 此方法就是求loss和后续可以用.avg方法求平均
self.val = val
self.sum += val * n
self.count += n
self.avg = self.sum / self.count
- optim.Adam使用 参考文章:torch.optim优化算法理解之optim.Adam()
- 划分数据集train_test_split用法(联系k折验证) X_train,X_test, y_train, y_test =cross_validation.train_test_split(X,y,test_size, random_state)
参考文章:Sklearn的train_test_split用法 - pytorch自带模型加载 参考文章
- unsqueeze_和unsqueeze 二者实现同样的功能, 区别在于unsqueeze_是in_place操作,即unsqueeze不会对使用unsqueeze的tensor进行改 变,想要获取unsqueeze后的值必须赋予个新值,unsqueeze_则会对自己改变
引用文章 - 预训练模型 —— save、load、state_dict、load_state_dict 保存加载模型(包括了自己的、经典网络的、只加载网络中的一部分模型以及对这一部模型的截取、只加载参数不要模型的以及过滤出自己网络需要的参数、加载模型时权重参数的加载方式)
(1)经典网络预训练模型:pytorch里torchvision包,包括3个子包: torchvison.datasets ,torchvision.models ,torchvision.transforms ,分别是预定义好的数据集(比如MNIST、CIFAR10等)、预定义好的经典网络结构(比如AlexNet、VGG、ResNet等)和预定义好的数据增强方法(比如Resize、ToTensor等)。models这个包中含有alexnet、densenet、inception、resnet、squeezenet、vgg等常用的网络结构,并且提供了预训练模型。
(2)state_dict 是Python dictionary对象,它将每个层(具有可学习参数的层(卷积层、线性层等),以及注册的缓存(batchnorm的运行平均值))映射到它的参数张量。优化器对象也有一个state_dict,其中包含关于优化器状态以及所使用的超参数的信息。
(3)预训练模型的权重问题
如果没有初始化权重参数,两种方法如下:(一)在线下载VGG模型(二)所以直接本地下载好之后再load即可
(一):
def __init__(self, weights=False):
super(VGG, self).__init__()
if weights is False:
model = models.vgg19_bn(pretrained=True)
(二):
model = models.vgg19_bn(pretrained=False)
pre = torch.load(weights)# weight是由调用函数时传进来的参数,是个PATH(包括文件名后缀)
model.load_state_dict(pre)
(一)保存和加载整个模型
# 保存模型
torch.save(model, 'model.pth\pkl\pt')#一般形式torch.save(net, PATH)
# 加载模型
model = torch.load('model.pth\pkl\pt')#一般形式为model_dict=torch.load(PATH)(二)仅保存和加载模型参数(推荐使用,需要提前手动构建模型!!!
# !说明:这里很重要,不同于(一)保存的是整个模型,加载时可直接加载。
# 这里保存的是模型参数,在加载模型参数前需手动构建模型以及优化器)# 保存模型参数
torch.save(model.state_dict(), 'model.pth\pkl\pt')#一般形式为torch.save(net.state_dict(),PATH)
# 加载模型参数
model.load_state_dict(torch.load('model.pth\pkl\pt') #一般形式为model_dict=model.load_state_dict(torch.load(PATH)),这里的model是手动构建的,将加载的模型的参数给构建的模型。(三)不仅限于模型参数,实验中往往要保存更多信息,两种保存方法如下:
# 法一:要保存多个组件,则将它们放到一个字典{'':~,'':~,'':~}中,再用torch.save()序列化这个字典。
torch.save({ 'epoch': epochID + 1,# 停止训练时epoch数
'state_dict': model.state_dict(),# 模型参数
'best_loss': lossMIN,# 最新的模型损失
'optimizer': optimizer.state_dict(),# 优化器的缓存和参数
'alpha': loss.alpha,
'gamma': loss.gamma},
checkpoint_path + '/m-' + launchTimestamp + '-' + str("%.4f" % lossMIN) + '.pth.tar')
# 上述最后一行是PATH
# 法二:用checkpoint去接,也是字典的形式
if (epoch+1) % checkpoint_interval == 0:#几个断点一保存
checkpoint = {"model_state_dict": net.state_dict(),
"optimizer_state_dict": optimizer.state_dict(),
"epoch": epoch}
path_checkpoint = "./checkpoint_{}_epoch.pkl".format(epoch)
torch.save(checkpoint, path_checkpoint)(四)加载(接着(三)的保存来说)
# !说明:加载各组件(上述保存的模型参数、优化器参数、loss等信息)之前先初始化模型和优化器!然后使用torch.load()加载保存的字典。model = TheModelClass(*args, **kwargs)
optimizer = TheOptimizerClass(*args, **kwargs)checkpoint = torch.load(PATH)
model.load_state_dict(checkpoint['model_state_dict'])# 要与保存时创建的字典的key一致
optimizer.load_state_dict(checkpoint['optimizer_state_dict'])
epoch = checkpoint['epoch']
loss = checkpoint['loss']
(五)加载经典网络模型(六)加载部分模型
class VGG(nn.Module):
def __init__(self, weights=False):
super(VGG, self).__init__()
if weights is False:
model = models.vgg19_bn(pretrained=True)
model = models.vgg19_bn(pretrained=False)
pre = torch.load(weights)
model.load_state_dict(pre)
self.vgg19 = model.featuresfor param in self.vgg19.parameters():
param.requires_grad = False
参考文章! 有加载经典网络的预训练模型 也有加载自己网络的
参考文章:pytorch模型的保存和加载、checkpoint ~ 这篇写的很全
(六)的参考
参考简书:学号叁拾的《PyTorch之保存加载模型》(参考了定义)
参考文章:源码详解Pytorch的state_dict和load_state_dict
知乎答主科技猛兽——PyTorch 13.模型保存与加载,checkpoint (大概看了一下,transforms.Compose那里写得全)
- nn.Module、nn.Sequential和torch.nn.parameter
nn.Sequential —— 合并层操作
torch.nn.Parameter —— 作为nn.Module中的可训练参数使用。
【torch.nn.Parameter与torch.Tensor的区别就是前者会自动被认为是module的可训练参数,即加入到parameter()这个迭代器中去;而后者是不在parameter中的。nn.Parameter的对象的requires_grad属性的默认值是True,即是可被训练的,而后者的属性默认值与之相反。】
参考文章:pytorch教程之nn.Module类详解——使用Module类来自定义模型
参考文章:nn.Module、nn.Sequential和torch.nn.parameter学习笔记
- 可视化loss pytorch中保存网络损失loss简单代码
- keras 和 tensorflow 关系 keras是一个模型级的库,提供了快速构建深度学习网络的模块。Keras并不处理如张量乘法、卷积等底层操作。这些操作依赖于某种特定的、优化良好的张量操作库。Keras依赖于处理张量的库就称为“后端引擎”。 Keras原来独立存在,后来被tensorflow吸收,tf即成为了他的后端。 Keras提供了两种后端引擎Theano/Tensorflow,可修改依赖的后端。
关于keras的后端 - keras中的GlobalAveragePooling2D和AveragePooling2D tensorflow中keras的GlobalAveragePooling2D和AveragePooling2D的区别
- self.sess.run
# 代码来自李重仪UColor的model_train中的def train(self, config)
_, err1,err2,err3= self.sess.run([self.g_optim, self.MSE, self.loss_vgg_raw, self.loss], feed_dict={self.images: batch_input, self.labels_image:batch_image_input,self._depth:batch_depth_input})[0]
(1) [self.g_optim, self.MSE, self.loss_vgg_raw, self.loss]为网络输出,可以看到等号左边用四个变量去接_, err1,err2,err3
(2) feed_dict作用是将数据喂入网络。拓展说明:创建了各种形式的常量和变量后,但TensorFlow 同样还支持占位符。占位符并没有初始值,它只会分配必要的内存。在会话中,占位符可以使用 feed_dict 馈送数据。[0]表第一批次。
(3) self.images、self.labels_image、 self._depth在之前的build_model中用占位符定义的
(4) batch_input、batch_image_input、batch_depth_input是批量读入的batch_size个数据
参考文章: self.sess.run(self.out,feed_dict)
参考文章:Tensorflow 学习笔记——占位符和feed_dict(二)
Part4: Keras基础
- Model Model 模型是带有函数API的,不是线性的,它是一个可以多输入、多输出的模型。有很多实现方法,包括Compile(编译)、fit(训练)、evaluate(评估)。
model = Model(inputs=a, outputs=b)
model = Model(inputs=[a1, a2], outputs=[b1, b2, b3])
# 通过inputs 和 outputs 构造多输入(a1,a2)和多输出(b1,b2,b3)的Model
Keras学习(一)—— Keras 模型(keras.model): Sequential 顺序模型 和 Model 模型 ~~~~~【这篇文章很全】
Part5: Matlab基础
- 卷积、相关操作 conv2函数、imfilter与filter2三者的区别
- cat C = cat(dim, A1, A2, A3, …) 表示按dim联结所有输入的数组
dim=1 —— 沿竖着堆叠
dim=2 —— 沿横着堆叠
dim=3 —— 沿第三维度堆叠
例如:
A = [1 2; 3 4];
B = [5 6; 7 8];
C = [1,2; 3,3];
cat(1, A, B) % 沿着竖着的方向堆叠,列数要一致
ans =
1 2
3 4
5 6
7 8
cat(2, A, B) % 沿着横着的方向堆叠,行数要一致
ans =
1 2 5 6
3 4 7 8
cat(3, A, B,C) % 沿第三个维度(对图像来说就是channel)
ans(:,:,1) =
1 2
3 4
ans(:,:,2) =
5 6
7 8
ans(:,:,3) =
1 2
3 3
文章图片
参考:MATLAB: cat函数使用
- 对数(以任意数为底)
常见底:
lg(x) —— log10(x)
ln(x) —— log(x)
e —— exp(1)
e^5 —— exp(5)
- 滤波
- ordfilt2
Y=ordfilt2(X,5,ones(3,3)),相当于3×3的中值滤波
Y=ordfilt2(X,1,ones(3,3)),相当于3×3的最小值滤波
Y=ordfilt2(X,9,ones(3,3)),相当于3×3的最大值滤波
Y=ordfilt2(X,1,[0 1 0; 1 0 1; 0 1 0]),输出的是每个像素的东、西、南、北四个方向相邻像素灰度的最小值。 - imfilter
g = imfilter(f, w, filtering_mode, boundary_options, size_options)
其中, f 为输入图像, w 为滤波掩模, g 为滤波后图像。 filtering_mode 用于指定在滤波过程中是使用“相关”还是“卷积”。 boundary_options 用于处理边界充零问题,边界的大小由滤波器的大小确定。size_options为最终输出图像的size问题。
文章图片
参考:论坛 —— ordfilt2函数功能说明
- ordfilt2
- matplotlib (1)ion()、ioff()、legend():用它可实现交互模式,即 可同时打开两个窗口
参考:matplotlib中ion()和ioff()的使用
# 交互式画图
plt.ion()
ax = plt.subplot(1,1,1)p1, = ax.plot([1,2,3], label="line 1")
p2, = ax.plot([3,2,1], label="line 2")
p3, = ax.plot([2,3,1], label="line 3")handles, labels = ax.get_legend_handles_labels()# reverse the order( 颠倒图例中元素顺序并显示图例 )
ax.legend(handles[::-1], labels[::-1])
plt.ioff()
plt.show()
- numpy (1)stack()、vstack()、hstack():前者是堆叠,后两者是串联,其中
stack():按照指定的轴(就是维度)对数组序列进行联结。
vstack():沿第1个维度串联(以0维度开始算)
hstack():沿第0个维度串联(以0维度开始算)
参考:Numpy中stack(),hstack(),vstack()函数的使用方法
(2)random模块生成数组
# random.uniform 生成均匀分布的随机数
a = np.random.uniform(1,2,size=5)
print(a)# 输出
[1.41399959 1.69592935 1.27264573 1.71349141 1.35462486]
(3) newaxis —— 插入新维度
三种方法:
(1)指定shape
(2)[:,np.newaxis] 或 [np.newaxis, :]
(3)b = a[None]
关于np.newaxis的一点理解
numpy.newaxis
- Pandas (一).csv文件创建、写入、读取、可视化
# #创建train_acc.csv和var_acc.csv文件,记录loss和accuracy
# 创建自定义列名的.csv文件 df后面用不到 只是用于创建
df = pd.DataFrame(columns=['time','step','train Loss','training accuracy']) # 列名
df.to_csv("D:/Hynn_useful/code/Ucolor_final_model_corrected/loss/loss_acc1.csv",index=False)
# 将想要输入表格的数据 以二维列表的形式转化为DataFrame columns表明对应的列 但在将list写入.csv文件时,不再写入列名
list = pd.DataFrame([[100,20,30,40]],columns=['time','step','train Loss','training accuracy'])
# header=False很重要 即不会创建默认新的列索引
list.to_csv("D:/Hynn_useful/code/Ucolor_final_model_corrected/loss/loss_acc1.csv", mode='a',index=False,header=False)
将训练和测试的loss、accuracy等数据保存到文件
演示实例(对李重仪Ucolor 的 model_train.py下操作):
目的:每次训练后能记录epoch 和 loss,并且在下次训练时,接着上一次的epoch训练。
首先定义保存和加载loss、epoch的函数
保存到.csv文件
加载.csv文件的epoch列后将最后一个数据取出 追加到result列表里
加载.csv文件的final_loss列后将最后一个数据取出 追加到result列表里
得到的result为[epoch final_loss],因此result[0]为epoch,result[1]为loss
文章图片
在def train()里
第一次均赋值为0 之后的根据最后一次的数据给出相应的轮数与loss
文章图片
文章图片
调用save_loss将当前的loss保存
文章图片
推荐阅读
- 算法|【机器学习基础】数学推导+纯Python实现机器学习算法26(随机森林)
- 人工智能|创新实践”项目介绍9(《Taekwondo Automatic Scoring System》)
- Python|【python】通过数据库进行fastapi swaggerUI的下拉选项配置
- 编程语言|2020 年编程语言盘点展望(Java 老兵不死,Kotlin 蓄势待发)
- MicroPython|Micropython——九轴传感器(MPU6050)的使用及算法(一)
- Python 函数进阶-迭代器
- python|python 测试_python 几种常用测试框架
- 学科竞赛|2021电赛F题数字识别和巡线部分
- pytorch|学习使用pytorch构建线性回归模型