两个串联的网络如何用联合优化(pytorch)?
2024-02-28 00:12:41
如自编码器如何将encoder和decoder写成两个串联的网络联合优化,optimizer该如何构建?
要先搞清楚网络串联的目的是什么?
其次,要明确两个网络的类型和结构是否相同?
以最简单的图像分类和同种网络串联为例:
既然串联两个网络,那么肯定是为了实现一个深度网络无法达到的功能。换句话说,两个网络的结果输出之间的关系应该是递进的且不可合并的。
通常这两个网络可以被认为是相互独立的,在pytorch框架中以常规方式训练即可。而串联的关键应该是在训练数据上,要对两类网络的数据进行重新构建。如果功能是递进的,数据应该也是递进的。
也可以思考类似知识蒸馏和联邦学习的方式,具体问题需要具体分析。
data→encoder→decoder→result?label
"?":loss计算。
encoder和decoder封装成两个类,继承nn.Module;
接下来可以有两种方案:
1. 构建两个optimizer分别对应encoder.parameters()和decoder.parameters()。训练中,loss.backward()之后,调用两个optimizer进行优化。
2. 将encoder.parameters()和decoder.parameters()进行合并,构建一个optimizer用于优化参数。训练中,loss.backward()之后,调用optimizer进行优化。
两个优化器可以分别对encoder和decoder进行单独调节,学习率也可以分别设置。整个过程需要确保可导。
也需要根据具体情况具体分析,看loss的位置,也可以通过梯度截断灵活调整。