- [ ] argparse
- [ ] append() 和 entend()
- [ ] model.train() 和 model.eval()
- [ ] pickle.dump() 和 pickle.load()
一、argparse
1、定义:argparse是python标准库里面用来处理命令行参数的库
2、代码:
import argparse # 首先导入模块
parser = argparse.ArgumentParser() # 创建一个 ArgumentParser 对象,ArgumentParser 对象包含将命令行解析成 Python 数据类型所需的全部信息
parser.add_argument() # 给ArgumentParser对象添加新的命令行参数,参数的类型和相应的处理方法由不同的参数决定。
args = parser.parse_args() # 进行解析参数
3、详细介绍 — ArgumentParser 对象
parser = argparse.ArgumentParser(prog=None, # 程序的名称(默认:sys.argv[0])
usage=None, # 程序使用说明
description=None, # 在help 之前显示的文本
epilog=None, # 在help 之后显示的文本
parents=[], # 一个 ArgumentParser 对象的列表
formatter_class=argparse.HelpFormatter, # 自定义帮助信息的格式
prefix_chars='-', # 可选参数的前缀字符集合,默认是‘-’
fromfile_prefix_chars=None, # 当需要从文件中读取其他参数时,用于标识文件名的前缀字符集合
argument_default=None, # 参数的全局默认值
conflict_handler='error', # 定义两个add_argument中添加的选项名字发生冲突时怎么处理,默认处理是抛出异常
add_help=True, # 是否增加-h/--help选项,默认是True)
allow_abbrev=True # 如果缩写是无歧义的,则允许缩写长选项
)
4、详细介绍 — add_argument() 方法
parser.add_argument(name or flags # 必选参数名或者可选参数标识符
action # 表示值赋予键的方式
nargs # 指定这个参数后面的value有多少个,默认为1
const # 被一些 action 和 nargs 选择所需求的常数。
default # 必选参数和可选的参数的默认值
type # 指定命令行参数数据类型
choices # 说明命令行参数的取值范围,它的值一般是一个列表
required # 说明参数是否必须进行输入,只支持可选参数
help # 说明信息
metavar # 在使用方法消息中使用的参数值示例。
dest # 相当于把位置参数或者选项参数关联到一个特定的名字
)
二、append() 和 entend()
1、append()函数:得到的是数组中嵌套数组的形式
append(object) :将一个对象作为一个整体添加到列表中,添加后的列表比原列表多一个元素,该函数的参数可以是任何类型的对象,该函数没有返回值。
2、entend()函数:将两个数组的原素进行拼接
extend(iterable) :将一个可迭代对象中的每个元素逐个地添加到列表中,可迭代对象中有几个元素,添加后的列表就比原列表多几个元素,该函数的参数必须是可迭代的对象,该函数没有返回值。
- 示例代码:
a = [1,2,3]
b = [4,5,6]
c = [7,8,9]
a.append(b)
c.extend(b)
print(a)
print(c)
- 输出结果:
[1, 2, 3, [4, 5, 6]]
[7, 8, 9, 4, 5, 6]
Process finished with exit code 0
注意:字符串没有这两个函数
- 示例代码:
a = 'do'
b = 're'
a.extend(b)
print(a)
- 输出结果:
AttributeError: 'str' object has no attribute 'extend'
Process finished with exit code 1
三、model.train() 和 model.eval()
1、model.train()
启用 BatchNormalization 和 Dropout。
2、model.eval()
不启用 BatchNormalization 和 Dropout。训练完train样本后,生成的模型model要用来测试样本。在model(test)之前,需要加上model.eval(),否则的话,有输入数据,即使不训练,它也会改变权值。这是model中含有batch normalization层所带来的的性质。
train_loss = []
total_predictions = []
total_labels = []
for idx, data in enumerate(trainGenerator): # enumerate 是为了施加索引
data_, label = Variable(data[0]), Variable(data[1]) # 图片 -- 图片的信息(标签)
prob = model(data_) # 对图片进行处理,生成预测值
prob_ = np.argmax(prob.detach().cpu(), -1) # 取出概率最大值所对应的索引
loss = criterion(prob, label) # 计算误差(预测值,标签)
train_loss.append(loss.item()*len(label.cpu())) # 误差记录
loss.backward() # 开始反向传播,计算所有梯度值
optimizer.step() # 将参数更新值施加到 net 的 parameters 上,优化梯度
total_predictions.extend(prob_)
total_labels.extend(label.cpu())
print('Iter: [{}/{}]\t Epoch: [{}/{}]\t Loss: {}\t Acc: {}'.format(idx+1, len(trainGenerator), epoch+1, opt.epochs,
loss.item(),
metrics.accuracy_score(label.cpu(), prob_)))
# 当整个一轮结束后,将loss值 以及 accuracy值 计算后放入文件中
loss_epoch = sum(train_loss)/len(traindata)
totalTrain_loss.append(loss_epoch)
with open(path_t, 'a') as f:
f.write('Epoch: {}\t Loss: {}\t Accuracy: {}\n'.format(epoch+1, loss_epoch,
metrics.accuracy_score(total_labels,total_predictions)))
# 不启用 BatchNormalization 和 Dropout
model.eval()
四、pickle.dump() 和 pickle.load()
1、pickle.dump()
pickle.dump(obj, file, [,protocol])
1)将对象obj保存到文件file中去;
2)protocol为序列化使用的协议版本,0:ASCII协议,所序列化的对象使用可打印的ASCII码表示;
2、pickle.load()
pickle.load(file)
从file中读取一个字符串,并将它重构为原来的python对象。file:类文件对象,有read()和readline()接口。