以3D网格作为输入的TensorFlow神经网络



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

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

数据集的每个文件都包含排名 2 中的顶点坐标,其中 objs 的形状为 [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})`

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

谢谢 E

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

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

  • A3D 中肱骨上最接近身体的点
  • B3D 中离身体最远的肱骨上的点

我们需要的是一个具有足够表现力的模型来做到这一点。 让我们首先考虑一下这个问题对人类来说最容易。 如果给一个人一个他们可以查看和旋转的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

最新更新