以 3d 网格作为输入的张量流神经网络
tensorflow neural network with 3d mesh as input
我正在尝试构建一个将 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})`
我应该建立一个不同类型的网络吗?
谢谢
E
首先感谢评论中对问题的澄清,确实有助于理解问题。
我理解的问题是(至少类似于):给定手臂外侧的一组 3D 点,识别
- A 肱骨上最接近 body
的 3D 点
- B 肱骨上距离 body
最远的 3D 点
我们需要的是一个具有足够表现力的模型来做到这一点。让我们首先考虑这个问题对人类来说是最简单的。如果给一个人一个他们可以查看和旋转的 3D 模型,那么这将是一个视觉问题,他们可能会 立即理解。
如果它是一个包含 60 个数字的列表,并且他们没有被告知这些数字的含义并且他们必须得出 6 个数字作为答案,那么这可能是不可能的。
We know that TensorFlow is good at image recognition,那我们就把问题转化为图像识别问题吧
让我们从 MNIST 网络开始 并讨论如何将其更改为我们的问题!
将您的输入转换为 voxels,这样每个训练示例将是一个大小为 [m,m,m] 的 3D 图像,其中 m 是您需要的分辨率(从 30 左右开始进行初始测试,然后可能高达 128)。用 0 初始化 3D 矩阵。然后对于20个数据点中的每一个,将相应的体素更改为1(或概率)。
那是你的输入,因为你有很多训练样本,你将有一个 [batch,m,m,m] 的张量。
对您的预期输出执行相同的操作。
通过 layers of convolution 发送(从 2 或 3 开始进行测试),这样您的输出大小为 [batch,m,m,m]。
使用反向传播来训练您的输出层以预测您的预期输出。
最后,您将拥有一个网络,它没有 return 肱骨的 3D 坐标,而是 return 它在 3D 中位置的概率图 space。您可以扫描最高概率的输出并读取坐标。
这与 AlphaGo 击败围棋的方式非常相似。
建议的改进 - 训练 1 个网络来预测 A 和一个单独的网络来预测 B
我正在尝试构建一个将 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})`
我应该建立一个不同类型的网络吗?
谢谢 E
首先感谢评论中对问题的澄清,确实有助于理解问题。
我理解的问题是(至少类似于):给定手臂外侧的一组 3D 点,识别
- A 肱骨上最接近 body 的 3D 点
- B 肱骨上距离 body 最远的 3D 点
我们需要的是一个具有足够表现力的模型来做到这一点。让我们首先考虑这个问题对人类来说是最简单的。如果给一个人一个他们可以查看和旋转的 3D 模型,那么这将是一个视觉问题,他们可能会 立即理解。
如果它是一个包含 60 个数字的列表,并且他们没有被告知这些数字的含义并且他们必须得出 6 个数字作为答案,那么这可能是不可能的。
We know that TensorFlow is good at image recognition,那我们就把问题转化为图像识别问题吧
让我们从 MNIST 网络开始 并讨论如何将其更改为我们的问题!
将您的输入转换为 voxels,这样每个训练示例将是一个大小为 [m,m,m] 的 3D 图像,其中 m 是您需要的分辨率(从 30 左右开始进行初始测试,然后可能高达 128)。用 0 初始化 3D 矩阵。然后对于20个数据点中的每一个,将相应的体素更改为1(或概率)。
那是你的输入,因为你有很多训练样本,你将有一个 [batch,m,m,m] 的张量。
对您的预期输出执行相同的操作。
通过 layers of convolution 发送(从 2 或 3 开始进行测试),这样您的输出大小为 [batch,m,m,m]。
使用反向传播来训练您的输出层以预测您的预期输出。
最后,您将拥有一个网络,它没有 return 肱骨的 3D 坐标,而是 return 它在 3D 中位置的概率图 space。您可以扫描最高概率的输出并读取坐标。
这与 AlphaGo 击败围棋的方式非常相似。
建议的改进 - 训练 1 个网络来预测 A 和一个单独的网络来预测 B