最近踩的坑:
-
在ddpg算法类的actor网络中输入1个state来获取action,要扩展成batch_size为1的tensor。否则出来的维度不同,导致后面计算熵出错。出错还好,就是怕不报错,就需要慢慢排查。
-
对于target类网络,不需要使用梯度更新的,可以关掉梯度来节省内存提高速度。
-
iterator.chain()返回的迭代器只能使用一次,for循环后将失效。需要重新创建迭代器。(因为这个原因导致critic的网络没有被更新)
l1 = [1,2,3] l2 = [4,5,6] l1_l2 = itertools.chain(l1,l2) for i in l1_l2: print(i) # l1_l2使用后失效。 for i in l1_l2: # 无法进入 print(i*0.1)
-
numpy: a.squeeze()并不改变a本身的值,而是返回一个结果。一般带下划线的方法可以改变本身的值,如a.add_()
-
np.where(c, x, y) 如果满足条件c,则返回x,否则返回y
np.where( c ) 返回满足条件c的坐标。
例如,
a = np.random.uniform(size = 10) # 随机生成均一分布的10个0~1之间的数组 np.where(a<0.8) #返回所有小于0.8的坐标。长度不一定,根据多少定。
-
numpy:
# 假设a是一个(1,50,10)的数组。 a[0, [1,2,3]] # 返回的是dim0里面坐标为1,2,3的元素。即返回的是一个(3,10)的数组。
-
算法相关:
不一定需要正则化,也可以训练出来好的结果。根据实际情况定。一旦对输入的数据进行了正则化,那么在测试新的数据时,就需要使用原来正则化所使用的均值和方差,否则结果会有问题。
-
如果想要保证网络每次初始化的参数都相同,在pytorch中网络的__init__可以使用torch.manual_seed(seed)设置随机种子,这样在每次创建的网络初始权重都一样。