PyTorch 15.深度学习中常见的python操作
Pickle模块
说明:Python中的pickle模块实现了基本的数据序列与反序列化,序列化对象可以在磁盘上保存对象,并在需要的时候读取出来。任何对象都可以执行序列化操作。
dump()方法
pickle.dump(obj, file, [,protocol])
参数定义:
obj:序列化对象,将对象obj保存到文件file中去
file:file表示保存到的类文件对象,file必须有write()接口,file可以是一个以‘w’打开的文件,或者是一个StringIO对象,也可以是任何可以实现write()接口的对象
protocol:序列化模式,默认是0(ASCII协议,表示以文本的形式进行序列化),protocol的值还可以是1和2(1表示以老式的二进制协议,2表示新二进制协议)
import pickle
fw = open("pickleFileName.txt", 'wb')
pickle.dump("try", fw)
load()方法
pickle.load(file)
注释:反序列化对象,将文件中的数据解析为一个python对象。file中有read()接口和readline()接口
import pickle
fr = open("pickleFileName.txt", "rb")
result = pickle.load(fr)
print(result)
Python调试器pdb
pdb的两种用法
- 非侵入式方法:
无需修改源码,在命令行中可以直接进行调试
python3 -m pdb filename.py
- 侵入式方法:
需要在被调试的代码中添加一行代码
import pdb
pdb.set_trace()
单步执行模式
- 查看源代码
命令:
l
说明:
查看当前位置前后11行源代码(多次会翻页)
当前位置在代码中会用–>符号标出
命令:
ll
说明:
查看当前函数或框架的所有源代码
- 添加断点
命令:
b
b linenum
b filename:linenum
b functionname
linenum:表示断点添加到哪一行
filename:文件名,断点添加到哪个文件
functionname:函数名,在该函数执行的第一行设置断点
b:不带参数表示查看断点位置
- 添加临时断点
命令:
tbreak
tbreak linenum
tbreak filename:linenum
tbreak functionname
说明:
执行一次后自动删除
- 清除断点
命令:
cl
cl filename:linenum
cl bpnumber
参数:
bpnumber 断点序号(多个以空格分隔)
说明:
不带参数用于清除所有断点(包括临时断点)
带参数则清除指定文件行或当前文件指定序号的断点
- 打印变量值
命令:
p expression
参数:
expression Python表达式
- 逐行调试命令
命令1
s #执行下一行(能够进入函数体)
命令2
n # 执行下一行(不会进入函数体)
命令3:
r # 执行当前运行函数到结束
- 非逐行调试命令
命令1
c # 持续执行下去,制导遇到一个断点
命令2
unt linenum # 持续执行直到运行到指定行
命令3
j linenum # 直接跳转到指定行(注意,被跳过的代码不执行)
- 查看函数参数
命令:
a # 在函数中打印函数的参数和参数的值
- 打印变量类型
命令:
whatis expression
说明:
打印表达式的类型,常用来打印变量值
- 启动交互式解释器
interact # 启动一个python的交互式解释器,使用当前代码的全局命名空间
- 打印堆栈信息
w #打印堆栈信息,最新的帧在最底部,箭头表示当前帧
单刀直入
如果不想从程序开头执行pdb,那么可以在程序中import pdb之后,直接在代码里需要调试的地方放一个pdb.set_trace(),就可以设置一个断点,程序会在pdb.set_trace()暂停并进入pdb调试环境,可以用pdb变量名查看变量,或者c继续运行
argparse
定义: argparse是python标准库里面用来处理命令行参数的库
import argparse #首先导入模块
parser = argparse.ArgumentParser() 创建一个解析对象
parser.add_argument() 向该对象中添加你要关注的命令行参数和选项
args = parser.parse_args() #进行解析
type
假设我们写一个文件,在命令行将其编译时,同时输入一个数字,返回一个平方:
因为parse.add_argument()对于接受的值默认其为str,如果将之视为int类型,额外加一句“type=int”
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", help="To sqaure the number given", type = int)
args = parser.parse_args()
print(args.square**2)
可选参数
在add_argument前,给属性名之前加上‘–’,就能将之变为可选参数:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--bool", help="Whether to print sth.")
# 这里的bool是一个可选参数
args = parser.parse_args()
if args.bool:
print('bool = 1')
对于可选参数,如果不指定的话,对应的变量就会被设置为None
对于简单程序,可能只需要两种值True或False
我们在原有程序的基础上,在add_argument中多加一个参数:action = “store_true”
这个时候,只要在命令行中加个bool, args.bool就是True,无需再加上之后的赋值内容
参数简写
parser.add_argument("-b", "--bool", action="store_true")
这样,在程序内部我们依旧使用args.bool,但是命令行张宝红只需要多写一个“-b”就行
混合定位参数和可选参数
当我们使用多个parser.add_argument(…)的时候,若将之视为可选参数,无则为None
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-b","--bool",help="to show the ans in a sentencen form",action = "store_true")
parser.add_argument("square",type=int)
args = parser.parse_args()
ans = args.square**2
if args.bool:
print("the square of {} = {}".format(args.square,ans))
else:
print(ans)
# 得到的效果为:一旦输入“-b”然后再输入相关的参数,就可以得到我们需要的结果了,不输入“-b”我们还是可以得到结果,只不过是另外一种方式而已。
进一步,我们可以进行以下操作:
- 限制输入的值:
如parser.add_argument("-b","--bool",choices=['0','1'],help="you can only input 0 or 1."
其中,choice可以限定我们能够输入的数 - 参数值和顺序
一般我们要把可选参数最后add,不可选参数放前面add.而在命令行里面输入代码时,程序会先赋值“先add的参数选项”
比如我先parser.add_argument(“a”, …) 再b - count操作计数赋值:
parser.add_argument("-b","--bool",action="count",type=int)
这时,在命令行中-b
表示bool=1
; -bb
表示bool=2
默认值default
parser.add_argument("-b","--bool",action="count",type=int,default=0)
可以设定参数的默认值