在深度学习的时候,项目需要用到拮抗网络的知识, 就按照文字上的要求进行建模,结果发生了Inplace operation
研究了半天也不知道Inplace 到底在哪里, 后来终于发现了原因,所以赶紧记下来。
训练的时候, 我们需要先训练特征提取,再训练分类器,但是由于项目用到了GAN,也就是advesarial learning, 即加入“噪音”之后,需要再次训练encoder 让他可以在Domain变化的情况下分不清图片来自于哪个domain以实现Domain invariance。
所以我们一开始的想法就是先去训练classifier 等他训练好了,冻住它的所有参数,再去训练encoder ,结果就发生了inplace operation的报错,
后来发现这其实是反向传播的问题:
如果先训练B 再训练A 的话, 就会发生Inplace operation 的错误,因为先训练B,反向传播进行计算,他会计算这一条链直到一开始o的梯度,并且进行保存。之后A 进行反向传播的时候那肯定会更新梯度,但是一更新,由于pythone 用的是Inplace operartion 那B的参数也会受到影响。 即使冻住了B 也没有用。冻住只是不再计算,但是这个问题是之前存储需要输出的值变化了, 所以就会报错,
但是如果先A 再B , 就没有问题,因为A 先反向传播参数进行计算更新,B再计算,就直接用这些再计算A 时,已经存好的值,这样B的更新也不会影响到A 的参数变化
先train A 再 train B,