一、导入库
二、构建神经网络
三、求导函数
四、计算膜能量和弯曲能量
五、生成数据
六、训练网络
七、预测位移
八、可视化
九、总结
第一阶段训练
目标:最小化与目标函数的均方误差。
-
在第一阶段,您通过
Net_w
预测输出W
,并计算损失loss
,该损失是基于目标函数(一个余弦波形)与网络输出之间的均方误差。具体而言,您希望神经网络能够逐步拟合特定的初始屈曲模式,以使其输出接近目标函数。 -
这个过程可以帮助网络初步学习并接近问题的解决方案,形成一个合理的初始状态。通常,在复杂的优化问题中,使用简单的目标函数进行预训练可以为后续的更复杂目标提供良好的初始参数。
第二阶段训练
目标:最小化薄膜应变能和弯曲能的总和。
-
在第二阶段,您通过
Energy_density
函数计算薄膜应变能U_m
和弯曲能U_b
,并将其和作为新的损失。这个阶段的目标是优化网络以找到最优的屈曲解,使得薄膜的总能量最小。 -
这种分阶段训练的策略允许网络在面对复杂的物理问题时,先通过简单的目标函数进行训练,学习基本的模式,然后再通过更复杂的能量最小化目标进行精细调整。这种方法有助于稳定训练过程,并避免直接从复杂目标函数出发可能导致的训练不收敛或收敛到局部最优解的问题。
总结
为何分两次训练:
- 逐步拟合:第一阶段的训练允许模型逐步拟合初始的屈曲模式,这对于复杂问题非常重要。
- 稳定性:通过简单目标函数的训练可以增加模型的稳定性,帮助模型找到更好的初始参数,减少在复杂目标函数上的训练难度。
- 精细调整:第二阶段的训练是对模型进行精细调整,以最小化薄膜的能量,这样可以获得更符合物理模型的解。
这种逐步训练的策略在很多深度学习和优化问题中都是常用的,可以帮助提高模型的性能和收敛速度。
训练过程中损失值有升高的现象,这是常见的现象,通常有以下几个可能的原因和解释:
1. 学习率的影响
- 学习率过大:如果学习率设置得太高,模型在更新权重时可能会"跳过"最优解,从而导致损失值的波动。在某些训练轮次中,损失可能会突然升高。
- 动态学习率:如果您在训练过程中使用了动态学习率(例如,通过学习率衰减),可能在某些阶段会暂时增加损失值,但整体趋势仍然向下。
2. 训练数据的复杂性
- 数据分布变化:如果训练数据的分布较复杂,模型在某些轮次上可能无法很好地拟合数据,导致损失暂时上升。这种情况通常在训练的早期阶段比较明显。
- 样本选择:交叉验证或随机批量选择样本时,某些批次可能会相对较难,从而导致损失增加。
3. 模型的容量与拟合
- 过拟合:随着训练的进行,模型可能开始过拟合训练数据,这会导致训练损失继续下降而验证损失上升,甚至可能出现不稳定现象。
- 欠拟合:如果模型的复杂度不足,可能会在某些轮次内无法很好地捕捉到数据的特征,导致损失波动。
4. 梯度更新的不稳定性
- 随机性:使用小批量随机梯度下降(SGD)等优化算法时,由于每次使用的样本不同,损失值会有一定的波动。这种随机性可能导致在某些epoch中损失值上升。
5. 损失函数的特性
- 非线性损失:某些损失函数本身可能导致在优化过程中出现不平滑的行为,因此在某些epoch中损失会突然增加。
解决方案
- 监控学习率:可以尝试降低学习率,或使用学习率调度器(如ReduceLROnPlateau)来根据验证损失自动调整学习率。
- 增加训练轮数:适当增加训练的总轮数,让模型有更多机会去优化。
- 采用早期停止:实施早期停止策略,监控验证损失,以避免过拟合。
- 使用更复杂的模型:根据任务的复杂性,考虑增加模型的复杂性,例如增加层数或神经元数量。