1.深度学习中,偏置(bias)在什么情况下可以要,可以不要?
卷积之后,如果接BN操作,就不要设置偏置,因为不起作用还要占显卡内存。



所以,卷积之后,如果接BN操作,就不要设置偏置,因为不起作用还要占显卡内存。

2.模型加载报错,测试时候出现
raise RuntimeError(‘Error(s) in loading state_dict for {}:\n\t{}’.format(
RuntimeError: Error(s) in loading state_dict for YOLOX:
Missing key(s) in state_dict: “backbone.cbam_1.channelattention.fc1.weight”, “backbone.cbam_1.channelattention.fc2.weight”, “backbone.cbam_1.spatialattention.conv1.weight”, “backbone.cbam_2.channelattention.fc1.weight”, “backb
one.cbam_2.channelattention.fc2.weight”, “backbone.cbam_2.spatialattention.conv1.weight”, “backbone.cbam_3.channelattention.fc1.weight”, “backbone.cbam_3.channelattention.fc2.weight”, “backbone.cbam_3.spatialattention.conv1.weight”.


小记:这里修改了Yolox的网络结构,在neck前,backbone后加了注意力机制,但是测试时候加载的参数没有和架构对应,故之后加上了strict=Flase 之后即可成功运行
3.os.mkdir()和os.makedirs()函数创建路径
if not os.path.exists(trainDir):#如果不存在这个路径,即创建路径文件夹
os.makedirs(str(trainDir))
os.mkdir() 函数
语法格式:
os.mkdir(path, mode=0o777, *, dir_fd=None)
使用数字模式mode创建名为path的目录。如果目录已经存在,则抛出异常FileExistsError。
在一些系统中,可以忽略mode,在一些平台可以通过调用chmod()来指定它们。mode就是所创建目录对应的文件及文件夹的读写权限,可以参考Linux命令下的chmod命令来理解。
*,dir_fd=None为命名关键字参数,具体作用不详。
os.makedirs()函数
语法格式:
os.makedirs(name, mode=0o777, exist_ok=False)
递归目录创建函数,和mkdir()很像,但是所有中间级目录都要包含叶目录。
递归创建目录,题中应有之意即路径中哪一层不存在,则自动创建。
区别于os.mkdir(path, mode=0o777, *, dir_fd=None),只创建最后一层的目录。
name:所要创建的目录
参数mode传递给mkdir();
如果exist_ok是False(默认),当目标目录(即要创建的目录)已经存在,会抛出一个OSError。
4.num_worker的设置
一般设置为机器cpu个数或者两倍物理cpu个数,这是网上的各路说法,真实情况还要实际根据自己的硬件进行测试,看cpu个数和核数
查看物理cpu(linux)个数情况:cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
查看物理cpu 的ID(linux)情况:grep 'physical id' /proc/cpuinfo | sort -u
输入:watch -n 1 nvidia-smi

1.当batch_size=128 ——>256(加倍)之后,相当于每次搬运的图片数量多了,训练速度减慢了显存占用多了,将近一倍多(不到两倍),gpu使用率基本保持到0-100%。
总结:batch-size加大,显存占用加大
2.当num_worker=2->20时候,训练速度飞快,速度提升很大,显存和gpu使用率不变,num_worker的数量和物理cpu的核数有关,有多少核就最多开多少个线程,多线程速度会加快

命令:ps -eH 看开了几个线程



这里说的是一般为cpu的个数(我的物理cpu是2),如果机械性能很强的话,可以加到几百多,我都试了一下,大概15-18(一般我设置16/18)左右是比较合适的,越高反而会降低

测试速度代码如下:
import time
import torch.utils.data as d
import torchvision
import torchvision.transforms as transforms
if __name__ == '__main__':
BATCH_SIZE = 100
transform = transforms.Compose([transforms.ToTensor(),
transforms.Normalize((0.5,), (0.5,))])
train_set = torchvision.datasets.MNIST('\mnist', download=False, train=True, transform=transform)
# data loaders
train_loader = d.DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True)
label = []
for num_workers in range(50):
train_loader = d.DataLoader(train_set, batch_size=BATCH_SIZE, shuffle=True, num_workers=num_workers)
# training ...
start = time.time()
for epoch in range(1):
for step, (batch_x, batch_y) in enumerate(train_loader):
pass
end = time.time()
take_time = end - start
print('num_workers is {} and it took {} seconds'.format(num_workers, take_time))
label.append(take_time)
min_numbers=[]
min_number = min(label)
print("需要最少的秒数seconds:",min_number)
i=0
for number in label:
#当遍历到最小值时
if number==min_number:
min_numbers.append(i)
# #当遍历到最大值时
# elif number==max_number:
# max_numbers.append(i)
i+=1
print("最快的num_worker数是:",min_numbers)
num_worker太高会卡在第一个epoch不动,我当时设置一千就会开始加载就卡住
669

被折叠的 条评论
为什么被折叠?



