np.random.seed(使随机数~可预测)
随机种子seed括号里的数,顾名思义, 好像就是一个固定的序列集合的种子代号,例如代号0(如:0,1,2,3,4…),中包含一大串随机数,但都是固定的,所以,无论后面怎么random.random,生成的随机数都是seed(0)集合中的随机数。
import numpy as np
from icecream import ic
if __name__ == '__main__':
np.random.seed(0) # 随机种子代号自己设定
x1 = np.random.random(3)
ic(x1)
第一次:
ic| x1: array([0.5488135 , 0.71518937, 0.60276338])
第二次:
ic| x1: array([0.5488135 , 0.71518937, 0.60276338])
np.loadtxt()读取文件
np.loadtxt(filepath,delimiter,usecols,unpack)
参数:
filepath:加载文件路径
delimiter:加载文件分隔符
usecols:加载数据文件中列索引
unpack:当加载多列数据时是否需要将数据列进行解耦赋值给不同的变量
np.random.shuffle()
对给定数组进行重新排序
#一维
import numpy as np
arr = np.arange(10)
print(arr)
np.random.shuffle(arr)
print(arr)
[0 1 2 3 4 5 6 7 8 9]
[3 7 4 0 9 5 6 1 8 2]
#多维
import numpy as np
arr = np.arange(12).reshape(3,4)
print(arr)
np.random.shuffle(arr)
print(arr)
print('==========')
np.random.shuffle(arr)
print(arr)
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
=======
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
==========
[[ 0 1 2 3]
[ 8 9 10 11]
[ 4 5 6 7]]
Dataloader()
-
参数
-
dataset:提前定义的dataset的实例
batch_size:传入数据的batch的大小,常用128,256等等
shuffle:bool类型,表示是否在每次获取数据的时候提前打乱数据
num_workers:加载数据的线程数
drop_last=True表示当数据无法取整时,舍去最后一个批次。
-
class Dataset(object):
"""An abstract class representing a Dataset.
All other datasets should subclass it. All subclasses should override
``__len__``, that provides the size of the dataset, and ``__getitem__``,
supporting integer indexing in range from 0 to len(self) exclusive.
"""
def __getitem__(self, index):
raise NotImplementedError
def __len__(self):
raise NotImplementedError
def __add__(self, other):
return ConcatDataset([self, other])
__len__方法
:实现通过全局的len()方法获取元素个数__getitem__方法
:能够通过传入索引的方式获取数据,例如:dataset[i]
获取其中的第i条数据。__add__ 方法
:实现将两个数据集合并到一起。
zip()
函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。
torch.manual_seed()
torch.manual_seed(seed) 功能描述
设置 CPU 生成随机数的 种子 ,方便下次复现实验结果。
为 CPU 设置 种子 用于生成随机数,以使得结果是确定的。
当你设置一个随机种子时,接下来的随机算法生成数根据当前的随机种子按照一定规律生成。
随机种子作用域是在设置时到下一次设置时。要想重复实验结果,设置同样随机种子即可。
Python argparse.ArgumentParser()用法解析
argparse是一个Python模块:命令行选项、参数和子命令解析器。作用和C语言中的命令行参数作用相同。
argparse 模块可以让人轻松编写用户友好的命令行接口。程序定义它需要的参数,然后 argparse 将弄清如何从 sys.argv 解析出那些参数。 argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
使用流程:
引入模块–>创建解析器–>添加参数–>解析参数
'''
ArgumentParser对象
prog - 程序的名称(默认: sys.argv[0],prog猜测是programma的缩写)
usage - 描述程序用途的字符串(默认值:从添加到解析器的参数生成)
description - 在参数帮助文档之后显示的文本 (默认值:无)
add_argument()方法:
name or flags - 一个命名或者一个选项字符串的列表
action - 表示该选项要执行的操作
default - 当参数未在命令行中出现时使用的值
dest - 用来指定参数的位置
type - 为参数类型,例如int
choices - 用来选择输入参数的范围。例如choice = [1, 5, 10], 表示输入参数只能为1,5 或10
help - 用来描述这个选项的作用,给一个 ArgumentParser 添加程序参数信息是通过调用 add_argument() 方法完成的。
'''
'''
把parser中设置的所有"add_argument"给返回到args子类实例当中, 那么parser中增加的属性内容都会在args实例中,使用即可。
'''
add_scalar和add_scalars函数
这两个函数是用来保存程序中的数据,然后利用tensorboard工具来进行可视化的。
查看日志
model.eval
()
model.eval
()是保证BN层能够用全部训练数据的均值和方差,即测试过程中要保证BN层的均值和方差不变。对于Dropout,model.eval()是利用到了所有网络连接,即不进行随机舍弃神经元。
torch.load()
用来加载模型。
torch.load(f, map_location=None, pickle_module=<module 'pickle' from '...'>)
参数:
f 类文件对象(返回文件描述符)或一个保存文件名的字符串
map_location 一个函数或字典规定如何映射存储设备
pickle_module 用于 unpickling元数据和对象的模块(必须匹配序列化文件时的pickle_module)
#model.load_state_dict(torch.load(PATH))
表示将训练好的模型参数重新加载至网络模型中
torch.argmax(input, dim, keepdim=False) → LongTensor
函数返回其他所有维在这个维度上面张量最大值的索引。
torch.argmax()函数中dim表示该维度会消失,可以理解为最终结果该维度大小是1,表示将该维度压缩成维度大小为1。
举例理解:对于-个维度为(d0,d1)的矩阵来说,dim=1表示求每一 行中最大数的在该行中的列号,最后得到的就是一个维度为(d0,1) 的- C维矩阵,最终列这一维度大小为1就要消失了, 最终结果变成一维张量 (d0);
dim=0表示求每一列中 最大数的在该列中的行号,最后我们得到的就是一个维度为(1, d1) 的二维矩阵,结果行这维度大小为1就要消失了, 最终结果变成一维张量(d1)。
因此,我们想要求每一行最大的列标号,我们就要指定dim=1,表示我们不要列了,保留行的size就可以了。
假如我们想求每一列的最大行标, 就可以指定dim=0,表示我们不要行了,求出每一列的最大值的下标,最后得到(1,d1) 的一维矩阵。
输入二维张量torch.Size([3, 4]),dim=0表示将dim=0这个维度大小由3压缩成1,然后找到dim=0这三个值中最大值的索引,这个索引表示dim=0行索引标号,结果张量维度变为torch.Size([4])。
import torch
x = torch.randn(3,4)
y = torch.argmax(x,dim=0)#dim=0表示将dim=0这个维度大小由3压缩成1,然后找到dim=0这三个值中最大值的索引,这个索引表示dim=0行索引标号
x,x.shape,y,y.shape
输出结果如下:
(tensor([[ 2.6347, 0.6456, -1.0461, -1.5154],
[-1.3955, -1.2618, -0.5886, -0.5947],
[-1.5272, -2.0960, 0.9428, -0.9532]]),
torch.Size([3, 4]),
tensor([0, 0, 2, 1]),
torch.Size([4]))
torch.argmax函数说明
argmax函数:torch.argmax(input, dim=None, keepdim=False)返回指定维度最大值的序号,dim给定的定义是:the demention to reduce.也就是把dim这个维度的,变成这个维度的最大值的index。
1)dim的不同值表示不同维度。特别的在dim=0表示二维中的列,dim=1在二维矩阵中表示行。广泛的来说,我们不管一个矩阵是几维的,比如一个矩阵维度如下(d0,..,.dn-1),那么dim=0就表示对应到d0也就是第一个维度,dim=1表示对应到
也就是第二个维度,一次类推。
2)知道dim的值是什么意思还不行,还要知道函数中这个dim给出来会发生什么。
# inference
import torch
from torch.utils.data import DataLoader
from dataset_banknote import BanknoteDataset
from model import BanknoteClassificationModel
from config import HP
# new model instance
model = BanknoteClassificationModel()
#torch.load() 加载模型 选择最优的模型
checkpoint = torch.load('./model_save/model_40_600.pth')
#model.load_state_dict(torch.load(PATH))表示将训练好的模型参数重新加载至网络模型中
model.load_state_dict(checkpoint['model_state_dict'])
# test set
# dev datalader(evaluation)
testset = BanknoteDataset(HP.testset_path)
test_loader = DataLoader(testset, batch_size=HP.batch_size, shuffle=True, drop_last=False)
model.eval()
total_cnt = 0 #记录模型有多少条数据
correct_cnt = 0 #记录有多少个正确的
with torch.no_grad():
for batch in test_loader:
x, y = batch
pred = model(x)
# print(pred)
total_cnt += pred.size(0)
#torch.argmax(input, dim) 函数返回其他所有维在这个 维度上面张量最大值的索引
# 参数:dim=0,返回行号,dim=1 返回列号
#判断pred有多少个与真实值y相同的
correct_cnt += (torch.argmax(pred, 1) == y).sum()
#Acc准确率
print('Acc: %.3f' % (correct_cnt/total_cnt))
标签:__,dim,模型,torch,选择,np,维度,最优,model
From: https://www.cnblogs.com/aohongchang/p/16743898.html