code

TensorFlow에서 tf.identity는 무엇에 사용됩니까?

codestyles 2020. 12. 4. 08:15
반응형

TensorFlow에서 tf.identity는 무엇에 사용됩니까?


내가 본 것 tf.identity같은 공식 CIFAR-10 튜토리얼 및 유래에 배치 정상화 구현 등 몇 군데에서 사용하지만 필요 왜 나는 볼 수 없습니다.

그것은 무엇을 위해 사용됩니까? 누구나 한두 가지 사용 사례를 줄 수 있습니까?

제안 된 답변 중 하나는 CPU와 GPU 간의 전송에 사용할 수 있다는 것입니다. 이것은 나에게 명확하지 않습니다. 에 따라 질문에 대한 확장 : loss = tower_loss(scope)에 정의 된 모든 사업자가 나에게 제안하는 GPU 블록, 아래 tower_lossGPU에 매핑됩니다. 그런 말에 tower_loss, 우리는 참조 total_loss = tf.identity(total_loss)가 반환되기 전에. 왜? tf.identity여기서 사용하지 않는 결점은 무엇입니까 ?


약간의 걸림돌 후에 나는 내가 본 모든 예제에 맞는 단일 사용 사례를 발견했다고 생각합니다. 다른 사용 사례가있는 경우 예를 들어 자세히 설명하세요.

사용 사례 :

특정 변수가 평가 될 때마다 연산자를 실행한다고 가정 해보십시오. 예를 들어 x변수 y가 평가 될 때마다 하나를 추가하고 싶다고 가정합니다 . 이것이 작동하는 것처럼 보일 수 있습니다.

x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)

with tf.control_dependencies([x_plus_1]):
    y = x
init = tf.initialize_all_variables()

with tf.Session() as session:
    init.run()
    for i in xrange(5):
        print(y.eval())

그렇지 않습니다 : 0, 0, 0, 0, 0을 인쇄합니다. 대신 control_dependencies블록 내의 그래프에 새 노드를 추가해야하는 것 같습니다 . 그래서 우리는이 트릭을 사용합니다 :

x = tf.Variable(0.0)
x_plus_1 = tf.assign_add(x, 1)

with tf.control_dependencies([x_plus_1]):
    y = tf.identity(x)
init = tf.initialize_all_variables()

with tf.Session() as session:
    init.run()
    for i in xrange(5):
        print(y.eval())

작동합니다 : 1, 2, 3, 4, 5를 인쇄합니다.

CIFAR-10 튜토리얼에서 우리가 감소하는 경우 tf.identity, 다음 loss_averages_op실행되지 않을 것입니다.


tf.identity장치간에 텐서를 명시 적으로 전송하려는 경우 (예 : GPU에서 CPU로) 유용합니다. op는 그래프에 send / recv 노드를 추가하여 입력 장치와 출력 장치가 다를 때 복사본을 만듭니다.

기본 동작은 작업이 다른 장치에서 발생할 때 암시 적으로 전송 / 수신 노드가 추가되지만 변수 값을 가져 오는 데 유용 할 수있는 상황 (특히 다중 스레드 / 분산 설정)을 상상할 수 있습니다. 단일 실행 내에서 여러 번 session.run. tf.identity소스 장치에서 값을 읽어야하는시기와 관련하여 더 많은 제어가 가능합니다. 이 작업에 더 적합한 이름은 read.

또한 tf.Variable link 의 구현 에서 ID op가 생성자에 추가되어 변수에 대한 모든 액세스가 소스의 데이터를 한 번만 복사하도록합니다. 변수가 GPU에 있지만 여러 CPU 작업에서 읽는 경우 (또는 그 반대의 경우) 여러 복사본이 비용이 많이들 수 있습니다. 사용자는 tf.identity원하는 경우 여러 호출로 동작을 변경할 수 있습니다 .

수정 : 질문이 수정 된 후 답변이 업데이트되었습니다.

또한 tf.identity텐서에 대한 참조를 업데이트하기 위해 더미 노드로 사용할 수 있습니다. 이는 다양한 제어 흐름 작업에 유용합니다. CIFAR의 경우 손실 값을 검색하기 전에 ExponentialMovingAverageOp가 관련 변수를 업데이트하도록 강제하고 싶습니다. 이것은 다음과 같이 구현 될 수 있습니다.

with tf.control_dependencies([loss_averages_op]):
  total_loss = tf.identity(total_loss)

여기에서는 tf.identity따로 표시의 유용한 아무것도하지 않는 total_loss평가 한 후 달아 될 텐서를 loss_averages_op.


위의 것 외에도 RNN에서 상태를 초기화 할 때와 같이 이름 인수가없는 작업에 이름을 할당해야 할 때 간단히 사용합니다.

rnn_cell = tf.contrib.rnn.MultiRNNCell([cells])
# no name arg
initial_state = rnn_cell.zero_state(batch_size,tf.float32)
# give it a name with tf.identity()
initial_state = tf.identity(input=initial_state,name="initial_state")

다른 답변에서 완전히 다루지 않은 다른 사용 사례를 발견했습니다.

def conv_layer(input_tensor, kernel_shape, output_dim, layer_name, decay=None, act=tf.nn.relu):
    """Reusable code for making a simple convolutional layer.
    """
    # Adding a name scope ensures logical grouping of the layers in the graph.
    with tf.name_scope(layer_name):
        # This Variable will hold the state of the weights for the layer
        with tf.name_scope('weights'):
            weights = weight_variable(kernel_shape, decay)
            variable_summaries(weights, layer_name + '/weights')
        with tf.name_scope('biases'):
            biases = bias_variable([output_dim])
            variable_summaries(biases, layer_name + '/biases')
        with tf.name_scope('convolution'):
            preactivate = tf.nn.conv2d(input_tensor, weights, strides=[1, 1, 1, 1], padding='SAME')
            biased = tf.nn.bias_add(preactivate, biases)
            tf.histogram_summary(layer_name + '/pre_activations', biased)
        activations = act(biased, 'activation')
        tf.histogram_summary(layer_name + '/activations', activations)
        return activations

컨볼 루션 계층을 구성 할 때 대부분의 경우 활성화를 반환하여 다음 계층에 공급할 수 있습니다. 그러나 때로는 (예 : 자동 인코더를 빌드 할 때) 사전 활성화 값이 필요합니다.

이 상황에서 우아한 해결책은 tf.identity효과적으로 레이어를 활성화하지 않고 활성화 함수 로 전달 하는 것입니다.


I found another application of tf.identity in Tensorboard. If you use tf.shuffle_batch, it returns multiple tensors at once, so you see messy picture when visualizing the graph, you can't split tensor creation pipeline from actiual input tensors: messy

But with tf.identity you can create duplicate nodes, which don't affect computation flow: nice


When our input data is serialized in bytes, and we want to extract features from this dataset. We can do so in key-value format and then get a placeholder for it. Its benefits are more realised when there are multiple features and each feature has to be read in different format.

  #read the entire file in this placeholder      
  serialized_tf_example = tf.placeholder(tf.string, name='tf_example')

  #Create a pattern in which data is to be extracted from input files
  feature_configs = {'image': tf.FixedLenFeature(shape=[256], dtype=tf.float32),/
                     'text': tf.FixedLenFeature(shape=[128], dtype=tf.string),/
                     'label': tf.FixedLenFeature(shape=[128], dtype=tf.string),}

  #parse the example in key: tensor dictionary
  tf_example = tf.parse_example(serialized_tf_example, feature_configs)

  #Create seperate placeholders operation and tensor for each feature
  image = tf.identity(tf_example['image'], name='image')
  text  = tf.identity(tf_example['text'], name='text')
  label = tf.identity(tf_example['text'], name='label')

In distribution training, we should use tf.identity or the workers will hang at waiting for initialization of the chief worker:

vec = tf.identity(tf.nn.embedding_lookup(embedding_tbl, id)) * mask
with tf.variable_scope("BiRNN", reuse=None):
    out, _ = tf.nn.bidirectional_dynamic_rnn(fw, bw, vec, sequence_length=id_sz, dtype=tf.float32)

For details, without identity, the chief worker would treat some variables as local variables inappropriately and the other workers wait for an initialization operation that can not end


I see this kind of hack to check assert:

assertion = tf.assert_equal(tf.shape(image)[-1], 3, message="image must have 3 color channels")
with tf.control_dependencies([assertion]):
    image = tf.identity(image)

Also it's used just to give a name:

image = tf.identity(image, name='my_image')

참고URL : https://stackoverflow.com/questions/34877523/in-tensorflow-what-is-tf-identity-used-for

반응형