优化用于布料模拟的卷积神经网络(CNN)的技术咨询
基于机器学习的布料模拟项目
项目实现流程
作为大学课程项目,我正在尝试用机器学习实现布料模拟,刚接触Git和GitHub,项目代码存放于ML_fabric_simulation仓库(不含大尺寸数据集),可视化代码存放于OpenGL仓库。
- 基础欧拉布料模拟:实现任意尺寸的正方形质点网格,质点间通过水平/垂直结构弹簧、对角线剪切弹簧及弯曲弹簧连接。实时运行模拟并记录每一时间步的位置、速度和力,保存为训练数据集。
- CNN模型训练与推理:使用PyTorch训练卷积神经网络(CNN),以位置和速度作为输入通道,输出为力通道。力的积分逻辑如下:
def step(self): with torch.no_grad(): self.total_forces = my_models.run( self.model, torch.cat((self.pos, self.vel), axis=0), self.device ) self.total_forces *= self.force_scale self.acc = self.total_forces/self.mass self.vel[self.all_but_fastened] += self.acc[self.all_but_fastened]*self.dt self.pos[self.all_but_fastened] += self.vel[self.all_but_fastened]*self.dt
CNN的前向传播实现:
class CNN(nn.Module): def __init__(self, input_channels, output_channels, hidden_channels=[], kernel_size=3): super().__init__() # Channels: channels = [input_channels] + hidden_channels + [output_channels] # Convolutional layers: self.conv = nn.ModuleList() for i in range(len(channels)-1): self.conv.append(nn.Conv2d(channels[i], channels[i+1], kernel_size=kernel_size, padding=int((kernel_size-1)/2))) def forward(self, x): for i, layer in enumerate(self.conv): x = layer(x) if i != (len(self.conv)-1): x = activation(x) return x
- 可视化:通过另一程序提取位置数据转换为numpy数组,使用OpenGL进行渲染。
当前核心问题
小尺寸布料(如3x3网格,顶部3个质点固定)模拟稳定,可正常悬挂及拖拽;但大尺寸布料(最大测试50x50)会立即崩溃,问题从边缘区域开始——边缘质点的连接结构与布料主体差异明显。
已尝试的优化措施
- 生成数据集时,给欧拉积分计算的位置添加噪声,大幅平滑了学习曲线,但对模拟稳定性无明显改善;
- 尝试对数据集进行归一化处理,暂未明确其效果。
疑问与求助方向
疑问点
- 了解到这类物理模拟问题的最优方案是图神经网络(GNN),但因仅模拟正方形布料,起初认为无需使用GNN,现在怀疑边缘问题是否需要改用GNN?
- 使用
torch.compile(self.model)后性能反而下降:未编译时每秒约800-900物理步,编译后约700步且波动较大(显卡为GTX 5070); - 最初尝试直接输入位置让CNN预测下一位置,速度虽快但模拟极度不稳定;
- 当前最有效的CNN结构为单隐藏卷积层,通道数4-64,不确定如何进一步优化网络结构。
求助需求
寻求提升ML驱动布料模拟的稳定性、性能的具体建议,以及CNN网络结构优化的指导。
内容的提问来源于stack exchange,提问作者hugon5
相关产品推荐
相关产品推荐

