我在Python中手工开发相关系数。我已经开发了使用NumPy数组,但我的矩阵很大,NumPy需要很长时间。
这是我已有的代码:
def corrcoef_2(x):
c = np.zeros((x.shape[0],x.shape[0],x.shape[0]))
for k1 in range(0,x.shape[0]):
for k2 in range(0,x.shape[0]):
c[k1,k2] = correlation(x[k1,:],x[k2,:])
return c
def correlation(T1, T2):
numerator = np.mean((T1 - T1.mean()) * (T2 - T2.mean()))
denominator = T1.std() * T2.std()
if denominator == 0:
return 0
else:
result = numerator / denominator
return result
我不能使用Numpy corrcoef或TensorFlow原生方法,因为在我想将我的corrcoef函数推广到三维之后。
我可以做同样的事情,但是使用TensorFlow吗?我该怎么办?
感谢。
答案 0 :(得分:0)
你会发现这在张量流中相对简单。大多数Numpy操作都可以在tensorflow中使用,并且通常使用相同的名称和形式(tensorflow会尝试模仿numpy)。
有助于您这样做的一些事情:
请记住,张量流不同于numpy,因为您需要首先定义所有数学运算(这些是符号),然后使用sess.run
请求tensorflow计算特定值。您应该编写代码,使得您具有build_graph
函数,其中定义了所有tensorflow操作。在创建会话with tf.Session() as sess:
之后,您不需要在该点之后创建任何张量流操作符(您可以这样做,但这通常意味着您正在做一些错误的操作)。
请注意,您可以像执行numpy一样执行+ - * /
之类的操作,tensorflow会覆盖这些操作,以根据需要使用tf.sum
和tf.multiply
等张量流结构替换它们。
您可以 NOT 在tensorflow中使用任何numpy操作。一切都需要成为张量流操作。如果你绝对不能没有一些python代码,你必须用tf.py_func
明确地包装它,但是如果你觉得有必要这样做,那就发布一个关于SO的问题,验证为什么它是必要的,它不应该在你的情况下
您的build_graph
函数看起来应该与您提供的代码非常相似,只需要使用大量tf.
函数代替numpy等效函数。
一旦你在tensorflow中运行,你就可以在GPU上运行这些操作,只要你有一个支持CUDA的GPU并安装tensorflow-gpu
,就没有什么特别需要使用GPU,tensorflow会假设这是你的意图。