这里写目录标题
python类
pytorch类
取模型训练过程的参数
temp=[]
for para in model.parameters():
temp.append(para)
para_epoch.append(temp)
结果发现每轮迭代放在数组para_epoch中每轮迭代的参数值没有变,都是一样的。因为存储在para_epoch中的每轮迭代的参数是随着model而变的,也就是没有断了和模型的联系。解决办法:把存进去的参数类型先改成numpy,这样就和原来的模型断了联系。
需要注意的是,这样做的前提是你的训练是在GPU上进行的因为这个语句会把参数从GPU上复制到CPU上。如果你本身就是在CPU上进行训练,这样的话就还是断不开参数和模型的联系。
temp=[]
for para in model.parameters():
para=para.cpu().detach().numpy()
temp.append(para)
para_epoch.append(temp)
transforms.ToTensor()
这个函数的作用是把0-255的numpy转换成0-1的Tensor。但是要求原来的numpy数据里面的数据类型是np.uint8,如果不是这个类型,就不能转换为0-1的tensor。可以看一下transfors.ToTensor()的源码吗,前面写的很清楚,我复制过来
"""Convert a ``PIL Image`` or ``numpy.ndarray`` to tensor.
Converts a PIL Image or numpy.ndarray (H x W x C) in the range
[0, 255] to a torch.FloatTensor of shape (C x H x W) in the range [0.0, 1.0]
if the PIL Image belongs to one of the modes (L, LA, P, I, F, RGB, YCbCr, RGBA, CMYK, 1)
or if the numpy.ndarray has dtype = np.uint8
In the other cases, tensors are returned without scaling.
"""
而且还需要注意,他自动有一个纬度变换的过程,所以如果我们要使用这个函数,原来的numpy类型数据的通道纬度应该在最后一维,这样,transforms.ToTensor()就可以自动完成纬度变换,把通道纬度放在第二维。
numpy中float和tensorfloat是有区别的
C语言中文件路径问题
…\代表的是上级文件目录,如果一个路径前面有一个…\就代表是在和工程目录统一等级的另一个问价夹里。因为有一个…\就代表是工程文件的上一级,然后再进入对应文件夹。如果前面有两个…\…\就代表这个文件与工程文件的上一级文件上是同级的。就要在工程文件的上一级问价夹中找。
numpy中一维数组的转置问题
对于numpy中数组的转置有三个函数,csdn上有很多介绍,这就不说了。我想说的是一维数组是不能用这三个函数进行转置的。一维数组默认是按列存储,比如你有333个数,变成一位数组,那么它的shape就是(333,)。这个时候用那三个转置函数不会报错,但是结果也不会转置。方法是这样写:import numpy as np a = np.array([1,2,3,4]) print(a.shape) print(a.T.shape) a.shape=(1,4) print(a.shape)
输出结果是:
pytorch训练时循环的写法问题
我们在pytorch训练神经网络,编写迭代循环的时候要注意,可以有两种写法:
也可以这么写:
但是不能这么写:
原因就是这样x就会变成成为第一个图片里batch_i的作用,而使输入变成无效的。