在使用meshcnn训练时,自建数据集mesh网格模型的面片数量无法保持一致,导致数组序列长度不一致不发进行传播的问题。报错信息如下:
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (45562,) + inhomogeneous part.
直接使用截断或填充的方法后,模型训练效果不佳,是否有更优秀的方法呢?
meshcnn训练数组序列长度不一致
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek
如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞
- 关键点分析:
- 问题核心在于MeshCNN训练时,自建数据集中mesh网格模型的面片数量不同,造成数组序列长度不一致,这违反了深度学习模型输入数据格式的要求,导致无法正常进行传播。报错信息ValueError: setting an array elem提示可能是在数据处理或模型输入环节,对数组元素的设置出现了问题,比如试图设置一个形状不匹配的数组元素。 - 解决方案:
- 补齐长度:- 统计数据集中面片数量的最大值。
- 对每个mesh网格模型,在面片数量不足最大值时,进行补齐操作。例如,如果使用的是numpy数组,可以使用以下代码:
import numpy as np max_length = max([mesh_array.shape[0] for mesh_array in dataset]) # 假设dataset是包含所有mesh网格模型数组的列表 new_dataset = [] for mesh_array in dataset: if mesh_array.shape[0] < max_length: padding_length = max_length - mesh_array.shape[0] padding = np.zeros((padding_length, mesh_array.shape[1])) # 假设mesh_array是二维数组,这里padding维度与原数组一致,只补齐第一维 new_mesh_array = np.vstack((mesh_array, padding)) new_dataset.append(new_mesh_array) else: new_dataset.append(mesh_array)- 截断长度:
- 统计数据集中面片数量的最小值。
- 对每个mesh网格模型,在面片数量超过最小值时,进行截断操作。例如:
min_length = min([mesh_array.shape[0] for mesh_array in dataset]) new_dataset = [] for mesh_array in dataset: if mesh_array.shape[0] > min_length: new_mesh_array = mesh_array[:min_length] new_dataset.append(new_mesh_array) else: new_dataset.append(mesh_array)- 方案优缺点:
- 补齐长度:- 优点:能保留所有原始数据,不会丢失任何信息,对于数据量不大且希望充分利用数据的情况较为合适。
- 缺点:增加了数据量,可能会延长训练时间,并且补齐的数据可能引入一些噪声或不真实的信息,尤其是对于使用随机值进行补齐的情况。
- 截断长度:
- 优点:简单直接,不会增加额外的数据,训练速度可能相对较快。
- 缺点:丢失了部分数据,可能会损失一些有价值的信息,尤其是在数据量有限的情况下。
- 总结:
- 当遇到MeshCNN训练中数组序列长度不一致的问题时,可以通过补齐长度或截断长度的方法来解决。补齐长度能保留所有数据但可能增加训练负担,截断长度简单快速但会丢失部分数据。具体选择哪种方法需要根据数据集的特点、数据量大小以及对信息完整性的要求等来综合考虑。
希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。
解决 无用评论 打赏 举报- 关键点分析: