我在尝试运行我的Python程序,看起来它应该可以顺利运行,然而我遇到了一个之前从未见过的错误,它显示:
free(): invalid pointerAborted (core dumped)
然而,我不确定如何尝试修复这个错误,因为它没有给我提供太多关于问题本身的信息。
起初我以为这应该是网络中张量大小的问题,但它们完全正常。我在谷歌上搜索了这个问题,发现这是一个在不该分配内存的地方分配内存的问题,但我不知道如何修复这个问题。
我的代码分为两个不同的文件,我使用了两个库来使用Sinkhorn损失函数并随机采样网格。
import argparseimport point_cloud_utils as pcuimport timeimport numpy as npimport torchimport torch.nn as nnfrom fml.nn import SinkhornLossimport commondef main(): # x是形状为[n, 3]的张量,包含顶点的坐标 x = torch._C.from_numpy(common.loadpointcloud("sphere.txt")) # t是形状为[n, 3]的张量,包含在单位立方体中均匀分布的样本集 v, f = common.unit_cube() t = torch._C.sample_mesh_lloyd(pcu.lloyd(v,f,x.shape[0]).astype(np.float32)) # 随机采样点云(目前是立方体?) # 模型是一个简单的全连接网络,将3D参数点映射到3D phi = common.MLP(in_dim=3, out_dim=3) # Eps是1/lambda,max_iters是Sinkhorn迭代的最大次数 emd_loss_fun = SinkhornLoss(eps=1e-3, max_iters=20, stop_thresh=1e-3, return_transport_matrix=True) mse_loss_fun = torch.nn.MSELoss() # 首先使用Adam优化器 optimizer = torch.optim.Adam(phi.parameters(), lr= 10e-3) fit_start_time = time.time() for epoch in range(100): optimizer.zero_grad() # 执行神经网络的前向传播,在参数点处评估函数 y = phi(t) # 计算重建(使用francis库)与目标之间的Sinkhorn散度 # 注意:Sinkhorn函数期望一批b个点集(即形状为[b, n, 3]的张量) # 因为我们只有一个,所以我们使用unsqueeze使x和y的维度为[1, n, 3] with torch.no_grad(): _, P = emd_loss_fun(phi(t).unsqueeze(0), x.unsqueeze(0)) # 将传输矩阵投影到置换矩阵空间,并计算置换点之间的L-2损失 # 之间置换点之间的L-2损失 loss = mse_loss_fun(y[P.squeeze().max(0)[1], :], x) # loss = mse_loss_fun(P.squeeze() @ y, x) # 直接使用传输矩阵 # 执行优化器步骤 loss.backward() optimizer.step() print("Epoch %d, loss = %f" % (epoch, loss.item())) fit_end_time = time.time() print("总时间 = %f" % (fit_end_time - fit_start_time)) # 绘制真实值、重建点和表示拟合函数phi的网格 common.visualitation(x,t,phi)if __name__ == "__main__": main()
错误信息是:free(): invalid pointerAborted (core dumped)
这再次对我帮助不大。如果有人知道发生了什么,或者你对这个错误了解更多,我将非常感激。
回答:
编辑:实际上已知原因。推荐的解决方案是从源代码构建这两个包。
导入open3d和PyTorch时有一个已知问题。原因未知。 https://github.com/pytorch/pytorch/issues/19739
存在一些可能的解决方法:
(1) 一些人发现更改导入这两个包的顺序可以解决问题,尽管在我个人的测试中两种方式都会崩溃。
(2) 其他人发现从源代码编译这两个包有帮助。
(3) 还有其他人发现将open3d和PyTorch移到不同的脚本中调用可以解决问题。