TensorFlow에서 tf.identity는 무엇에 사용됩니까?
내가 본 것 tf.identity
같은 공식 CIFAR-10 튜토리얼 및 유래에 배치 정상화 구현 등 몇 군데에서 사용하지만 필요 왜 나는 볼 수 없습니다.
그것은 무엇을 위해 사용됩니까? 누구나 한두 가지 사용 사례를 줄 수 있습니까?
제안 된 답변 중 하나는 CPU와 GPU 간의 전송에 사용할 수 있다는 것입니다. 이것은 나에게 명확하지 않습니다. 에 따라 질문에 대한 확장 이 : loss = tower_loss(scope)
에 정의 된 모든 사업자가 나에게 제안하는 GPU 블록, 아래 tower_loss
GPU에 매핑됩니다. 그런 말에 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
'code' 카테고리의 다른 글
Ubuntu에서 iPhone 앱 개발 (0) | 2020.12.05 |
---|---|
java.sql.Connection 스레드는 안전합니까? (0) | 2020.12.05 |
ASP.NET Core에서 SqlClient를 사용하는 방법? (0) | 2020.12.04 |
Django와 다른 Python 웹 프레임 워크? (0) | 2020.12.04 |
보색을 계산하는 JS 함수? (0) | 2020.12.04 |