以 3d 网格作为输入的 tensorflow 神经网络

man*_*anu 7 3d vertices coordinates neural-network tensorflow

我正在尝试构建一个神经网络,该网络将 3d 网格的顶点位置作为输入,并输出内部两点的坐标。

出于测试目的,我有一个包含 20 个点的几何数据集,每个点在内部有两个点。

数据集的每个文件都包含等级 2 中顶点的坐标,对象的形状为 [3,20] 数组,结果点的形状为 [3,3]。

我已经建立了一个线性模型,但结果总是非常低 (0,16) ,如果我用 1000、100.000 或 500.000 训练它并不重要

import tensorflow as tf
import numpy as np

objList    = np.load('../testFullTensors/objsArray_00.npy')
guideList  = np.load('..testFullTensors/drvsArray_00.npy')


x  = tf.placeholder(tf.float32, shape=[None, 60])
y_ = tf.placeholder(tf.float32, shape=[None, 6])

W = tf.Variable(tf.zeros([60,6],tf.float32))
b = tf.Variable(tf.zeros([6],tf.float32))

y = tf.matmul(x,W) + b

cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    train_step.run(feed_dict={x: objList, y_: guideList})
    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    sess.run(tf.global_variables_initializer())
    print accuracy.eval(session=sess , feed_dict={x: objs, y_: guides})`
Run Code Online (Sandbox Code Playgroud)

我应该建立一个不同类型的网络吗?

谢谢 E

Pan*_*hin 2

首先,感谢评论中对问题的澄清,这确实有助于理解问题。

据我了解,问题是(至少类似于):给定手臂外侧的一组 3D 点边界集,识别

  • A 3D 中肱骨上最接近身体的点
  • B 3D 中距身体最远的肱骨上的点

我们需要的是一个具有足够表达能力的模型来做到这一点。让我们首先考虑一下这个问题对于人类来说是如何最简单的。如果给人类一个可以观看和旋转的 3D 模型,那么这将是一个视觉问题,他们可能会立即得到它。

如果这是一个包含 60 个数字的列表,并且他们没有被告知这些数字的含义,并且他们必须给出 6 个数字作为答案,那么这可能是不可能的。

我们知道TensorFlow擅长图像识别,所以让我们把问题转化为图像识别问题。

让我们从 MNIST 网络开始,讨论如何将其改变为我们的问题!

将您的输入转换为体素,以便每个训练示例都是一张大小为 [m,m,m] 的 3D 图像,其中 m 是您需要的分辨率(初始测试时从 30 左右开始,可能高达 128)。用 0 初始化 3D 矩阵。然后,对于 20 个数据点中的每一个,将相应的体素更改为 1(或概率)。

这就是你的输入,由于你有很多训练示例,你将有一个 [batch,m,m,m] 张量。

对您的预期输出执行相同的操作。

将其发送到卷积层(从 2 或 3 层开始进行测试),以便输出大小为 [batch,m,m,m]。

使用反向传播来训练输出层以预测预期输出。

最后,您将拥有一个不返回肱骨 3D 坐标,而是返回其在 3D 空间中位置的概率图的网络。您可以扫描输出以获得最高概率并读取坐标。

这与 AlphaGo 击败围棋的方式非常相似。

建议的改进- 训练 1 个网络来预测A,并训练一个单独的网络来预测B