0
入力に関するNNのヤコビアンを計算して評価したいと思います。私はヤコビアンを構築するのにかかる時間についてはあまり気にしません。私はヤコビアンの評価にもっと関心があります。ヤコビの評価を加速する
weights = {
'w1': tf.Variable(tf.random_normal([num_input, num_hidden_1])),
'w2': tf.Variable(tf.random_normal([num_hidden_1, num_hidden_2])),
'w_final': tf.Variable(tf.random_normal([num_hidden_2, 1]))
}
biases = {
'b1': tf.Variable(tf.random_normal([num_hidden_1])),
'b2': tf.Variable(tf.random_normal([num_hidden_2])),
'b_final': tf.Variable(tf.random_normal([num_hidden_2])),
}
def g(x):
layer_1 = tf.nn.sigmoid(tf.add(tf.matmul(x, weights['w1']),
biases['b1']))
layer_2 = tf.nn.sigmoid(tf.add(tf.matmul(layer_1, weights['w2']),
biases['b2']))
final = tf.add(tf.matmul(layer_2, weights['w_final']),
biases['b_final'])
return final
となりましたヤコビアン
# https://github.com/tensorflow/tensorflow/issues/675
def jacobian(y_flat, x):
n = y_flat.shape[0]
loop_vars = [
tf.constant(0, tf.int32),
tf.TensorArray(tf.float32, size=n),
]
_, jacobian = tf.while_loop(
lambda j, _: j < n,
lambda j, result: (j+1, result.write(j, tf.gradients(y_flat[j], x))),
loop_vars)
return jacobian.stack()
の計算は、今、これが長いへの道を取る:
i = 784
o = 1
n = 500
real_data = tf.placeholder(tf.float32, shape=[n, i])
g_app = g(real_data)
y=g_app
x=real_data
start = time.time()
j_4 = jacobian(y,x)
constructed = time.time()
print(str(int(constructed - start)) + "jacobian constructed")
loop = constructed
for z in range(0,10):
j_out = sess.run(j_4, feed_dict={x:np.random.rand(n,i)})
temp = time.time()
print(str(int(temp - loop)) + " Seconds: " + str(j_out.shape))
loop = temp
これが私の出力です:
0 jacobian constructed
6 Seconds: (500, 1, 500, 784)
4 Seconds: (500, 1, 500, 784)
5 Seconds: (500, 1, 500, 784)
5 Seconds: (500, 1, 500, 784)
6 Seconds: (500, 1, 500, 784)
3 Seconds: (500, 1, 500, 784)
4 Seconds: (500, 1, 500, 784)
3 Seconds: (500, 1, 500, 784)
3 Seconds: (500, 1, 500, 784)
3 Seconds: (500, 1, 500, 784)
がありますこれをスピードアップする方法は?私はこれがとても遅い理由を見ません、理論的に似たような勾配降下はありませんか?