2017-01-22 6 views
-1

テンソルフローでCNNを実行しています。私はtf.device(/ gpu:0)を使ってgpuにすべての変数を入れていますが、それらのうちのいくつかはまだCPUに入っているようです。私は自分のコードを実行しているときに私のGPUのutilsを見ている、それは100%になるし、0%に行く。どのような変数がCPUテンソルフローで実行されているかを確認する方法

私がconfig.log_device_placement = Trueを使用すると、どの変数がどのデバイスに割り当てられているかわかります。私のコードでは変数の数が多いので、どちらがCPUであるのか分からない。

だから、どの変数がCPUに固定されているか分かりますか? または、私はtf.deviceを使用してgpuに割り当てる際に、なぜ私の変数のいくつかがCPUに固定されるべきであるかどうか考えていますか?ところで

、私はこの問題をアップサンプリングのためのコードを、以下のことにより、アップサンプラ(簡単な補間tf.image.resize_images)を変更した後は起こった:

def unravel_argmax(argmax, shape): 
    with tf.device(gpu_n): 
     argmax_shape = argmax.get_shape() 
     new_1dim_shape = tf.shape(tf.constant(0, shape=[tf.Dimension(4), argmax_shape[0]*argmax_shape[1]*argmax_shape[2]*argmax_shape[3]])) 
     batch_shape = tf.constant(0, dtype=tf.int64, shape=[argmax_shape[0], 1, 1, 1]).get_shape() 
     b = tf.multiply(tf.ones_like(argmax), tf.reshape(tf.range(shape[0]), batch_shape)) 
     y = argmax // (shape[2] * shape[3]) 
     x = argmax % (shape[2] * shape[3]) // shape[3] 
     c = tf.ones_like(argmax) * tf.range(shape[3]) 
     pack = tf.stack([b, y, x, c]) 
     pack = tf.reshape(pack, new_1dim_shape) 
     pack = tf.transpose(pack) 
     return pack 


def unpool_layer2x2_batch(updates, mask, ksize=[1, 2, 2, 1]): 
    with tf.device(gpu_n): 
     input_shape = updates.get_shape() 
     new_dim_y = input_shape[1] * ksize[1] 
     new_dim_x = input_shape[2] * ksize[2] 
     output_shape = tf.to_int64((tf.constant(0, dtype=tf.int64, shape=[input_shape[0], new_dim_y, new_dim_x, input_shape[3]]).get_shape())) 
     indices = unravel_argmax(mask, output_shape) 
     new_1dim_shape = tf.shape(tf.constant(0, shape=[input_shape[0] * input_shape[1] * input_shape[2] * input_shape[3]])) 
     values = tf.reshape(updates, new_1dim_shape) 
     ret = tf.scatter_nd(indices, values, output_shape) 
     return ret 

を私はunpoolingためhereから、このコードを得ました。

+1

実際にCPUによって計算されているopsはありますか? – Natecat

+0

それは私の質問です!私の変数のいくつかがCPUに固定されているかどうかを知るにはどうすればいいですか?現在、私はgpu utilsを見ていると、変数がCPU上にあるように見えます。なぜなら、変数は100%と0%の間で上下するためです。いくつかの変数がCPUとGPUの間を行き来しているようです。 –

+0

より一般的な問題は、計算の途中のものがCPUに置かれていることです。また、GPUがデータをTFに読み書きするのを待っている可能性もあります。あなたはタイムラインを見てこれを理解することができます –

答えて

0

セッションの設定によってデバイスの配置を記録できます。設定:

sess = tf.Session(config=tf.ConfigProto(log_device_placement=True)) 
関連する問題