[python] TensorFlow에서 Tensor 객체의 값을 인쇄하는 방법은 무엇입니까?

TensorFlow에서 행렬 곱셈의 소개 예제를 사용하고 있습니다.

matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)

제품을 인쇄하면 제품이 Tensor객체 로 표시됩니다 .

<tensorflow.python.framework.ops.Tensor object at 0x10470fcd0>

그러나 내가 어떻게 가치를 알 수 product있습니까?

다음은 도움이되지 않습니다.

print product
Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32)

그래프가 실행된다는 것을 알고 Sessions있지만 Tensor그래프에서 session?를 실행하지 않고 객체 의 출력을 확인할 수있는 방법 이 없습니까?



답변

가장 쉬운 [A] a의 실제 값 평가하는 방법 Tensor객체는 그것을 전달하는 Session.run()방법, 또는 호출 Tensor.eval()하면 기본 세션이있을 때 (A의 예 with tf.Session():블록을, 또는 아래 참조). 일반적으로 [B] 에서는 세션에서 일부 코드를 실행하지 않으면 서 텐서의 값을 인쇄 할 수 없습니다.

프로그래밍 모델을 실험하고 있고 텐서를 쉽게 평가할 수있는 방법을 원한다면 tf.InteractiveSession프로그램 시작시 세션을 열고 모든 Tensor.eval()(및 Operation.run()) 호출에 해당 세션을 사용할 수 있습니다. 셸이나 IPython 노트북과 같은 대화식 설정에서 Session어느 곳에서나 개체 를 전달하는 것이 지루할 때 더 쉽습니다 . 예를 들어 다음은 Jupyter 노트북에서 작동합니다.

with tf.Session() as sess:  print(product.eval()) 

이것은 작은 표현에는 어리석은 것처럼 보일 수 있지만 Tensorflow 1.x의 주요 아이디어 중 하나는 실행 지연입니다 . 에 연결하면 Session) 더 효율적으로 실행을 예약 할 수 있습니다 (예 : 독립 부품을 병렬로 실행하고 GPU 사용).


[A] : Python 프로그램으로 반환하지 않고 텐서의 값을 인쇄하려면 Andrzej가 다른 답변에서 제안한tf.print() 것처럼 연산자를 사용할 수 있습니다 . 공식 문서에 따르면 :

운영자가 실행되도록하려면 사용자는 생산 된 op를 tf.compat.v1.Sessionrun 메소드에 전달하거나 tf.compat.v1.control_dependencies([print_op]표준 출력으로 인쇄되는) 로 지정하여 op를 실행 된 op에 대한 제어 종속성으로 사용해야합니다 .

또한 다음을 참고하십시오.

Jupyter 노트북 및 Colab tf.print에서 노트북 셀 출력으로 인쇄합니다. 노트북 커널의 콘솔 로그에는 쓰지 않습니다.

[B]는 : 당신은 수도 사용 수 tf.get_static_value()의 값이 효율적으로 계산할 경우, 지정된 텐서의 상수 값을 얻을 기능.


답변

다른 답변은 그래프를 평가할 때까지 값을 인쇄 할 수 없다는 것이 맞지만, 일단 평가 한 후에는 그래프 내부에 실제로 값을 인쇄하는 쉬운 방법에 대해서는 이야기하지 않습니다.

가장 쉬운 방법은 그래프 (하여 평가 될 때마다 텐서 값 볼 run또는 eval사용하는 경우) Print이 예에서와 같이 동작 :

# Initialize session
import tensorflow as tf
sess = tf.InteractiveSession()

# Some tensor we want to print the value of
a = tf.constant([1.0, 3.0])

# Add print operation
a = tf.Print(a, [a], message="This is a: ")

# Add more elements of the graph using a
b = tf.add(a, a)

이제 전체 그래프를 평가할 때마다 (예 :를 사용하여 b.eval())

I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3]


답변

다른 사람들의 말을 반복하면 그래프를 실행하지 않고 값을 확인할 수 없습니다.

값을 인쇄하기 쉬운 예제를 찾는 사람을위한 간단한 스 니펫은 다음과 같습니다. ipython 노트북에서 코드를 수정하지 않고 실행할 수 있습니다

import tensorflow as tf

#define a variable to hold normal random values 
normal_rv = tf.Variable( tf.truncated_normal([2,3],stddev = 0.1))

#initialize the variable
init_op = tf.initialize_all_variables()

#run the graph
with tf.Session() as sess:
    sess.run(init_op) #execute init_op
    #print the random values that we sample
    print (sess.run(normal_rv))

산출:

[[-0.16702934  0.07173464 -0.04512421]
 [-0.02265321  0.06509651 -0.01419079]]


답변

아니요, 그래프를 실행하지 않으면 ( session.run()) 텐서의 내용을 볼 수 없습니다 . 당신이 볼 수있는 유일한 것은 :

  • 텐서의 차원 (그러나 나는 TF가 가지고 있는 연산 목록에 대해 계산하기가 어렵다고 가정한다 )
  • 텐서를 생성하는 데 사용될 작업 유형 ( transpose_1:0, random_uniform:0)
  • 텐서의 요소 유형 ( float32)

나는 이것을 문서에서 찾지 못했지만 변수의 값 (그리고 일부 상수는 할당시 계산되지 않았다)을 믿는다.


이 예제를 살펴보십시오.

import tensorflow as tf
from datetime import datetime
dim = 7000

난 그냥 임의의 숫자의 상수 텐서를 시작하는 첫 번째 예는 거의 똑같이 희미하게 ( 0:00:00.003261)

startTime = datetime.now()
m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1)
print datetime.now() - startTime

두 번째 경우, 상수가 실제로 평가되고 값이 할당되는 경우 시간은 dim ( 0:00:01.244642) 에 따라 크게 달라집니다

startTime = datetime.now()
m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1)
sess = tf.Session()
sess.run(m1)
print datetime.now() - startTime

그리고 무언가를 계산하여 더 명확하게 만들 수 있습니다 ( d = tf.matrix_determinant(m1), 시간이 흘러갑니다 O(dim^2.8))

추신 : 그것은 설명서에 설명되어 있습니다 .

텐서 객체는 연산 결과에 대한 상징적 핸들이지만 실제로 연산의 출력 값을 보유하지는 않습니다.


답변

나는 당신이 몇 가지 기본 사항을 얻어야한다고 생각합니다. 위의 예제를 통해 텐서 (다차원 배열)를 만들었습니다. 그러나 텐서 흐름이 실제로 작동하려면 ” 세션 ” 을 시작하고 세션 에서 ” 작업 “을 실행해야합니다 . “세션”및 “작업”이라는 단어를 주목하십시오. tensorflow와 함께 작동하려면 4 가지를 알아야합니다.

  1. 텐서
  2. 운영
  3. 세션
  4. 그래프

이제 당신이 쓴 것에서 텐서와 작업을 주었지만 세션이 실행 중이거나 그래프가 없습니다. 텐서 (그래프의 가장자리)는 그래프를 통해 흐르고 연산 (그래프의 노드)에 의해 조작됩니다. 기본 그래프가 있지만 세션에서 시작할 수 있습니다.

print라고 말하면 정의한 변수 또는 상수의 모양에만 액세스 할 수 있습니다.

그래서 당신은 당신이 누락 된 것을 볼 수 있습니다 :

 with tf.Session() as sess:
           print(sess.run(product))
           print (product.eval())

그것이 도움이되기를 바랍니다!


답변

Tensorflow 1.x

import tensorflow as tf
tf.enable_eager_execution()
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]

Tensorflow 2.x에서는 열망 모드가 기본적으로 활성화되어 있습니다. 다음 코드는 TF2.0에서 작동합니다.

import tensorflow as tf
matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)

#print the product
print(product)         # tf.Tensor([[12.]], shape=(1, 1), dtype=float32)
print(product.numpy()) # [[12.]]


답변

위의 답변을 바탕으로 특정 코드 스 니펫을 사용하여 다음과 같이 제품을 인쇄 할 수 있습니다.

import tensorflow as tf
#Initialize the session
sess = tf.InteractiveSession()

matrix1 = tf.constant([[3., 3.]])
matrix2 = tf.constant([[2.],[2.]])
product = tf.matmul(matrix1, matrix2)

#print the product
print(product.eval())

#close the session to release resources
sess.close()