【发布时间】:2017-10-07 16:31:46
【问题描述】:
我正在尝试构建一个将 3d 网格的顶点位置作为输入的神经网络, 并输出内部两点的坐标。
出于测试目的,我有一个数据集,其中包含一个几何图形,该几何图形有 20 个点,每个点在内部有两个点。
数据集的每个文件都包含 2 级顶点的坐标,其中 obj 的形状为 [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
【问题讨论】:
-
Tensorflow 内置了使用卷积处理 2d 和 3d 数据集的函数。当您将数据展平为 1d 时(就像您拥有的那样),您将失去有意义的几何图形。考虑 tensorflow.org/get_started/mnist/beginners 和 tensorflow.org/get_started/mnist/pros 之间的区别。卷积是一种强大的技术,我认为可以极大地帮助您解决这个问题。
-
是确定性的 2 个点,它们是 2 个有意义的点(例如总是在动物的左眼和右眼后面)还是只是网格内的 2 个点?
-
是的,卷积神经网络是我的第一选择,甚至导致最终的想法是使用人形网格作为输入。读完这篇文章后,我尝试了一个简单的线性模型:stackoverflow.com/questions/34500641/…,顺便说一句,我会尝试回去使用 CNN。我只是想知道使用 3d 坐标作为输入是否可以,或者我需要体素化网格。这两点是有意义的,它们应该像“指南”一样用来放置其他对象。如果使用带有顶点的 CNN,...我应该如何塑造张量?
-
你说这两个点是放置其他对象的指南。您是否相信如果给定相同的数据和电子表格以及大量时间,人类将能够按照您指定的正确顺序始终如一地获得相同的 2 分?我问这个是因为它有疑问。想想 AlphaGo 并考虑它的架构。 AlphaGo NN 预测的是每一个步是否是好步的可能性,然后将其输入到 AlphaBeta 算法中。 NN没有预测下一步动作,它对所有个动作进行评分。您在创建得分方面可能会取得更大的成功。
-
我确信人类能够始终如一地获得相同的 2 分,因为在我的工作中,我必须在人形网格中为每个骨关节放置一个点,所以我可能已经一个包含人体网格和关节位置的大型数据库。我只需要弄清楚如何让网络自己做:)(在手臂的例子中,你需要将点放在肩膀、肘部和手腕上)
标签: 3d tensorflow neural-network coordinates vertices