我试图在具有64个CPU的CentOS 7机器上同时运行几个TensorFlow会话.我的同事报告说他可以使用以下两个代码块在他的机器上使用4个内核生成并行加速:
mnist.py
import numpy as np
import input_data
from PIL import Image
import tensorflow as tf
import time
def main(randint):
print 'Set new seed:', randint
np.random.seed(randint)
tf.set_random_seed(randint)
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# Setting up the softmax architecture
x = tf.placeholder("float", [None, 784])
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
y = tf.nn.softmax(tf.matmul(x, W) + b)
# Setting up the cost function
y_ = tf.placeholder("float", [None, 10])
cross_entropy = -tf.reduce_sum(y_*tf.log(y))
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
# Initialization
init = tf.initialize_all_variables()
sess = …Run Code Online (Sandbox Code Playgroud) python parallel-processing python-multiprocessing tensorflow
我在TensorFlow中实现了一个损失函数,用于计算均方误差.用于计算目标的所有张量都是float64类型,因此损失函数本身是dtype float64.特别是,
print cost
==> Tensor("add_5:0", shape=TensorShape([]), dtype=float64)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试最小化时,我获得了关于张量类型的值错误:
GradientDescentOptimizer(learning_rate=0.1).minimize(cost)
==> ValueError: Invalid type <dtype: 'float64'> for add_5:0, expected: [tf.float32].
Run Code Online (Sandbox Code Playgroud)
我不明白为什么当导致计算的所有变量都是float64类型时,张量的预期dtype是单精度浮点数.我已经确认当我将所有变量强制为float32时,计算会正确执行.
有没有人知道为什么会发生这种情况?我的电脑是64位电脑.
这是一个重现行为的示例
import tensorflow as tf
import numpy as np
# Make 100 phony data points in NumPy.
x_data = np.random.rand(2, 100) # Random input
y_data = np.dot([0.100, 0.200], x_data) + 0.300
# Construct a linear model.
b = tf.Variable(tf.zeros([1], dtype=np.float64))
W = tf.Variable(tf.random_uniform([1, 2], minval=-1.0, maxval=1.0, dtype=np.float64))
y = tf.matmul(W, x_data) + b
# Minimize the squared errors. …Run Code Online (Sandbox Code Playgroud) 通过阅读TensorFlow文档,我看到有一种方法可以计算方阵的Cholesky分解.但是,通常当我想使用Cholesky分解时,我这样做的目的是求解直接矩阵求逆可能不稳定的线性系统.
因此,我正在寻找一种类似于Scipy中实现的方法.有没有人知道TensorFlow中是否存在这种情况,或者是否存在可以合并的方式?
所以假设我有一个张量
X = tf.placeholder("float", [None, 5])
Run Code Online (Sandbox Code Playgroud)
这样我就知道列数而不是行数.我需要初始化维度的向量nrows x 1
现在,以下代码块不起作用,
o = tf.ones(shape=(tf.shape(X)[0], 1))
==> TypeError: List of Tensors when single Tensor expected
Run Code Online (Sandbox Code Playgroud)
也没有,
o = tf.ones(shape=(X.get_shape()[0].value, 1))
==> TypeError: Input 'dims' of 'Fill' Op has type
string that does not match expected type of int32.
Run Code Online (Sandbox Code Playgroud)
现在,我发现解决这个问题的一种方法是实际上使我的矢量为占位符,
o = tf.placeholder(dtype=tf.float32, shape=[None, 1])
Run Code Online (Sandbox Code Playgroud)
并传入一个适当大小的numpy数组feed_dict.但是这个解决方案让我感到不优雅,而不是占位符的预期用途.我可能在这里错了,但肯定有更好的方法.
我有兴趣使用TensorFlow计算矩阵行列式的导数.我可以从实验中看出,TensorFlow尚未实现通过行列式区分的方法:
LookupError: No gradient defined for operation 'MatrixDeterminant'
(op type: MatrixDeterminant)
Run Code Online (Sandbox Code Playgroud)
进一步的调查显示,实际上可以计算导数; 例如,参见Jacobi的公式.我确定为了实现这种通过决定因素来区分我需要使用函数装饰器的方法,
@tf.RegisterGradient("MatrixDeterminant")
def _sub_grad(op, grad):
...
Run Code Online (Sandbox Code Playgroud)
但是,我对张量流不熟悉,无法理解如何实现这一目标.有没有人对此事有任何见解?
这是我遇到这个问题的一个例子:
x = tf.Variable(tf.ones(shape=[1]))
y = tf.Variable(tf.ones(shape=[1]))
A = tf.reshape(
tf.pack([tf.sin(x), tf.zeros([1, ]), tf.zeros([1, ]), tf.cos(y)]), (2,2)
)
loss = tf.square(tf.matrix_determinant(A))
optimizer = tf.train.GradientDescentOptimizer(0.001)
train = optimizer.minimize(loss)
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
for step in xrange(100):
sess.run(train)
print sess.run(x)
Run Code Online (Sandbox Code Playgroud) 假设我想使用闭合形式解决方案计算TensorFlow中的最小二乘系数.通常,我会这样做,
beta_hat = tf.matmul(
tf.matmul(tf.matrix_inverse(tf.matmul(tf.transpose(X), X)), tf.transpose(X)), y
)
Run Code Online (Sandbox Code Playgroud)
其中X和y分别对应于所述协变量和目标变量,TensorFlow占位符.
如果我想进行预测,我会做类似的事情,
y_pred = tf.matmul(X, beta_hat)
Run Code Online (Sandbox Code Playgroud)
如果我要执行,
sess.run(y_pred, feed_dict={X: data_X})
Run Code Online (Sandbox Code Playgroud)
我当然会得到一个错误,我没有为占位符提供必要的值y.我想beta_hat在计算它之后可以灵活地将其视为常量(这样我就不需要为新的协变量矩阵定义一个新的占位符来进行预测).实现这一目标的一种方法是,
# Make it constant.
beta_hat = sess.run(beta_hat, feed_dict={X: data_X, y: data_y})
y_pred = tf.matmul(X, beta_hat)
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更优雅的方法将张量处理为常量,这样我既不需要执行会话也不需要获取常量,也不需要为输入数据创建单独的占位符来用于预测.
以下是一些示例代码,用于演示我正在描述的情况.
import numpy as np
import tensorflow as tf
n, k = 100, 5
X = tf.placeholder(dtype=tf.float32, shape=[None, k])
y = tf.placeholder(dtype=tf.float32, shape=[None, 1])
beta = np.random.normal(size=(k, ))
data_X = np.random.normal(size=(n, k))
data_y = data_X.dot(beta)
data_y …Run Code Online (Sandbox Code Playgroud)