如何在Pytorch中将神经网络划分为子网络?

我想使用Pytorch将一个神经网络划分为两个子网络。为了具体说明,考虑以下图像:

enter image description here

在图1中,我有一个3x4x1的神经网络。我想要的是,例如在第1个epoch中,我只想更新子网络1中的权重,即子网络2中的权重必须被冻结。同样,在第2个epoch中,我希望训练子网络2中的权重,而其余部分应该被冻结。

我该如何做到这一点?


回答:

如果你子网络是层的一个子集,这很容易做到。也就是说,你不需要冻结任何部分层。这是全有或全无的原则。

在你的例子中,这意味着将隐藏层分成两个不同的2节点层。每个层都完全属于其中一个子网络,这让我们回到了全有或全无的原则。

完成后,你可以使用requires_grad来切换单个层。将参数设置为False将禁用训练并冻结权重。为了对整个模型、子模型或Module执行此操作,你需要遍历model.parameters()

对于你的例子,具有3个输入、1个输出和现在分成2×2的隐藏层,可能会看起来像这样:

然后你可以像这样训练一半或另一半:

model = HalfFrozenModel()model.set_freeze(hid1=True)# 进行一些训练。model.set_freeze(hid2=True)# 进行更多训练。# ...

如果你碰巧使用fastai,那么有一个层组的概念也被用于此。fastai文档详细介绍了这是如何工作的。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注