格式化
- On Windows Shift + Alt + F
- On Mac Shift + Option + F
- On Ubuntu Ctrl + Shift + I
argparse
是python自带的命令行参数解析包,可以用来方便地读取命令行参数。
Tqdm
是一个快速,可扩展的Python进度条,可以在 Python 长循环中添加一个进度提示信息,用户只需要封装任意的迭代器 tqdm(iterator)。
查看cpu:top
查看GPU:nvidia-smi
python 安装第三方库,超时报错--Read timed out.
https://www.cnblogs.com/xiaoduc-org/p/5958973.html
pip --default-timeout=100 install -U Pillow
pip3 install -U --timeout 1000 matplotlib
安装vscode:https://blog.youkuaiyun.com/m0_37192554/article/details/83714975
退出:exit()即可退出dos到最初
打开settings.json齿轮,设置,搜json,在json中设置,
打开cmd :win+r
进入目录:cd\+目录 二级cd+目录
关于python中conda环境的激活问题:输入命令 conda env list
base后面即为安装的路径,首先输入 activate+你的路径 出现base说明已经进入环境,在输入conda activate base
https://blog.youkuaiyun.com/oy_1024/article/details/100413699
Anaconda下的TypeError:LoadLibrary() argument1 must be str, not None问题。
输入conda.bat activate再进行其他操作即可 会成为(base)c:。。
https://blog.youkuaiyun.com/AI414010/article/details/100011008
unused import statement解决方法 :
file下有invalidate caches/restart选项,点击即可。
python数组加法:
aaa = array([20, 30, 40, 50])+(1,)
aaa=[21, 31, 41, 51]
arange
nd1 = np.arange(5)#array([0, 1, 2, 3, 4])
nd2 = np.arange(1,5)#array([1, 2, 3, 4])
nd3 = np.arange(1,5,2)#nd3 = np.arange(1,5,2)
data.ravel():扁平化
将多维数组转换为一维数组
random_split:
def randomSplit(weights: Array[Double], seed: Long = Utils.random.nextLong): Array[RDD[T]] 该函数根据weights权重,将一个RDD切分成多个RDD
DataLoader:
dataset(Dataset): 传入的数据集 batch_size(int, optional): 每个batch有多少个样本 shuffle(bool, optional): 在每个epoch开始的时候,对数据进行重新排序 sampler(Sampler, optional): 自定义从数据集中取样本的策略,如果指定这个参数,那么shuffle必须为False batch_sampler(Sampler, optional): 与sampler类似,但是一次只返回一个batch的indices(索引),需要注意的是,一旦指定了这个参数,那么batch_size,shuffle,sampler,drop_last就不能再制定了(互斥——Mutually exclusive) num_workers (int, optional): 这个参数决定了有几个进程来处理data loading。0意味着所有的数据都会被load进主进程。(默认为0) collate_fn (callable, optional): 将一个list的sample组成一个mini-batch的函数 pin_memory (bool, optional): 如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内存(CUDA pinned memory)中. drop_last (bool, optional): 如果设置为True:这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了… 如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。 timeout(numeric, optional): 如果是正数,表明等待从worker进程中收集一个batch等待的时间,若超出设定的时间还没有收集到,那就不收集这个内容了。这个numeric应总是大于等于0。默认为0
for in:
循环结构(for-in) 说明:
也是循环结构的一种,经常用于遍历字符串、列表,元组,字典等 格式:
for x in y: 循环体 执行流程:x依次表示y中的一个元素,遍历完所有元素循环结束
python类:
https://blog.youkuaiyun.com/qq_35732147/article/details/83084774
__init__()是构造方法,开头和末尾各有两个下划线,这是一种约定,用于避免默认方法与普通方法发生名称冲突。 Python调用这个__init__()方法来创建Dog实例时,将自动传入实参self。每个与类相关联的方法调用都自动传递实参self,它是一个指向实例本身的引用,让实例能够访问类中的属性和方法。
继承:
定义子类时,必须在括号内指定父类的名称。 子类的方法__init__()接受创建Car实例所需的信息。 super()是一个特殊函数,帮助Python将父类和子类关联起来,让Python调用ElectricCar的父类的方法__init__(),让ElectricCar实例包含父类的所有属性。 另外,上面还为子类添加了新属性battery_size。
这里重写了父类的get_descriptive_name()方法,所以子类调用该方法时,Python将忽略Car类中的get_descriptive_name()方法。
导入单个类
from car import Car # 从car.py文件中导入Car类
从一个模块中导入多个类
from car import Car, ElectricCar # 从car.py文件中导入Car类和ElectricCar类
导入模块中的所有类
from car import * # 导入car.py文件中的所有类
默认参数函数:
def pow(x, n = 2):
return r
print(pow(5)) # output: 25 第二个参数默认了。
pow(5, n==3) #不默认
SDG:
要使用torch.optim,您必须构造一个optimizer对象。这个对象能保存当前的参数状态并且基于计算梯度更新参数。
要构造一个Optimizer,你必须给它一个包含参数(必须都是Variable对象)进行优化。然后,您可以指定optimizer的参数选项,比如学习率,权重衰减等。
SGD是最基础的优化方法,普通的训练方法, 需要重复不断的把整套数据放入神经网络NN中训练, 这样消耗的计算资源会很大.当我们使用SGD会把数据拆分后再分批不断放入 NN 中计算. 每次使用批数据, 虽然不能反映整体数据的情况, 不过却很大程度上加速了 NN 的训练过程, 而且也不会丢失太多准确率.
首先sgd的参数有三个,1)opfunc;2)x;3)config;4)state 1)opfunc&x:第一个参数opfunc是一个求cost function以及cost function针对于权重的导数的函数,而这个函数的参数就是sgd的第二个参数x了。
2)config:第三个参数是一些配置变量,用来优化梯度下降用的,为了防止求得的最优解是局部最优解而不是全局最优解。
3)state:第四个变量state,个人认为最有用的就是state.evalCounter,因为它与学习速率有关,下文会有说明。
https://blog.youkuaiyun.com/qq_34690929/article/details/79932416
to.(device):
mytensor = my_tensor.to(device) 这行代码的意思是将所有最开始读取数据时的tensor变量copy一份到device所指定的GPU上去,之后的运算都在GPU上进行。
Tensor总结
(1)Tensor 和 Numpy都是矩阵,区别是前者可以在GPU上运行,后者只能在CPU上;
(2)Tensor和Numpy互相转化很方便,类型也比较兼容
(3)Tensor可以直接通过print显示数据类型,而Numpy不可以
https://blog.youkuaiyun.com/byron123456sfsfsfa/article/details/90609758
numpy.argmin:
表示最小值在数组中所在的位置
若添加axis这个参数-----求在行或者列方向上的最小值索引
axis=0 表示列方向上的最小值索引,axis=1表示行方向的最小值索引
numpy.mod(x1, x2):
相当于Python模运算符``x1%x2``,并且与除数x2具有相同的符号。
backward():
https://blog.youkuaiyun.com/douhaoexia/article/details/78821428
optimizer:
其主要起到的作用就是进行权重的更新,如下:
https://blog.youkuaiyun.com/yangdashi888/article/details/84314695
#BatchNorm2d
最常用于卷积网络中(防止梯度消失或爆炸),设置的参数就是卷积的输出通道数
https://blog.youkuaiyun.com/jiugedexiaodi/article/details/90812412
逆卷积的详细解释ConvTranspose2d(fractionally-strided convolutions)
1.首先先定义进行卷积的参数: 输入特征图为高宽一样的Hin*Hin大小的x 卷积核大小kernel_size
步长stride padding填充数(填充0)
输出特征图为Hout*Hout大小的y
计算式子为: Hout = floor( Hin + 2*padding - kernel_size / stride) + 1
m = nn.ReLU(inplace=True):
#inplace为True,将会改变输入的数据 ,否则不会改变原输入,只会产生新的输出
argparse模块
argparse是python用于解析命令行参数和选项的标准模块
https://blog.youkuaiyun.com/chengxuyuanyonghu/article/details/59716405
PyYaml
读取数据
os.path.join()
函数用于路径拼接文件路径。
SummaryWriter
用自动生成的文件名创建writer3 object
Augmentations
通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data Augmentation
BrokenPipeError: [Errno 32] Broken pipe
错误是由于:写了多线程读取,
trainloader = t.utils.data.DataLoader(
trainset,
batch_size=4,
shuffle=False,
num_workers=2)
是这样的,你刚刚应该是直接按f5运行的
但是vscode虽然强大,也不太支持多线程情况下的调试,而num_workers的意义是数据读取是使用多线程
2就是双线程
如果你直接运行而不调试(比如shift+F5,或者命令行运行这个python文件等等),多线程是完全没问题的
Normalize
transforms.Normalize()
给定均值:(R,G,B)
方差:(R,G,B)
,将会把Tensor
正则化。即:Normalized_image=(image-mean)/std
。
transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
t.utils.data.DataLoader
trainloader = t.utils.data.DataLoader(
trainset,
batch_size=4,
shuffle=False,
num_workers=0)
dataset:包含所有数据的数据集 batch_size :每一小组所包含数据的数量 Shuffle : 是否打乱数据位置,当为Ture时打乱数据,全部抛出数据后再次dataloader时重新打乱。 sampler : 自定义从数据集中采样的策略,如果制定了采样策略,shuffle则必须为False. Batch_sampler:和sampler一样,但是每次返回一组的索引,和batch_size, shuffle, sampler, drop_last 互斥。 num_workers : 使用线程的数量,当为0时数据直接加载到主程序,默认为0。 collate_fn:不太了解 pin_memory:s 是一个布尔类型,为T时将会把数据在返回前先复制到CUDA的固定内存中 drop_last:布尔类型,为T时将会把最后不足batch_size的数据丢掉,为F将会把剩余的数据作为最后一小组。 timeout:默认为0。当为正数的时候,这个数值为时间上限,每次取一个batch超过这个值的时候会报错。此参数必须为正数。 worker_init_fn:和进程有关系,暂时用不到
next(iterator[, default]) iterator -- 可迭代对象 default -- 可选,
dataiter = iter(trainloader)
images, labels = dataiter.next()
make_grid
的作用是将若干幅图像拼成一幅图像。其中padding的作用就是子图像与子图像之间的pad有多宽
show = ToPILImage()
img1=show(tv.utils.make_grid((images+1)/2)).resize((400,100))
img1.show()
super() 函数是用于调用父类(超类)的一个方法。
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
super(Student,self).__init__() 这是对继承自父类的属性进行初始化。而且是用父类的初始化方法来初始化继承的属性。 也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。 当然,如果初始化的逻辑与父类的不同,不使用父类的方法,自己重新初始化也是可以的。
torch.nn.Linear(in_features,out_features,bias = True )[来源]
对传入数据应用线性变换:y = A x+ b
参数: in_features - 每个输入样本的大小
out_features - 每个输出样本的大小
bias - 如果设置为False,则图层不会学习附加偏差。
默认值:True
nn.Conv2d(self, in_channels, out_channels, kernel_size, stride=1, padding=0, dilation=1, groups=1, bias=True))
参数:
in_channel: 输入数据的通道数,例RGB图片通道数为3;
out_channel: 输出数据的通道数,这个根据模型调整;
kennel_size: 卷积核大小,可以是int,或tuple;kennel_size=2,意味着卷积大小2, kennel_size=(2,3),意味着卷积在第一维度大小为2,在第二维度大小为3;
stride:步长,默认为1,与kennel_size类似,stride=2,意味在所有维度步长为2, stride=(2,3),意味着在第一维度步长为2,意味着在第二维度步长为3;
padding: 零填充
pytorch中nn.ReLU和F.ReLU的区别
实际计算结果一致。不同的是nn.ReLU作为一个层结构,必须添加到nn.Module容器中才能使用,而F.ReLU则作为一个函数调用。
F.ReLU激活函数
https://www.cnblogs.com/guoyaohua/p/8727509.html?foxhandler=RssReadRenderProcessHandler
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2)) 卷积-》激活-》池化