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


259

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?를 실행하지 않고 객체 의 출력을 확인할 수있는 방법 이 없습니까?

답변:


250

가장 쉬운 [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()의 값이 효율적으로 계산할 경우, 지정된 텐서의 상수 값을 얻을 기능.


17
Session.run ()을 호출하지 않고 텐서의 일부 속성을 가져올 수 있습니다. 예를 들어 tensor.get_shape ()를 호출 할 수 있습니다. 많은 경우에, 이것은 디버그하기에 충분한 정보를 제공합니다.
Ian Goodfellow

5
아래의 tf.Print op에 대한 And 's answer도 참조하십시오. "tensorflow print"를 인터넷 검색하는 동안이 stackoverflow 답변을 계속 찾고 있으며이 최고의 답변은 tf.Print op가없는 것처럼 들립니다.
Ian Goodfellow

2
나는 대답에 약간의 경고를 추가 했으므로 이제 더 명확해야합니다. (원래 질문자가 텐서의 모양을 얻는 데 관심이 있다고 생각하지는 않습니다.)
mrry

1
tf.Print를 통해 콘솔로 인쇄하는 대신 파일로 저장하는 방법이 있습니까?
thang

tf.Session()Tensorflow 2에서는 작동하지 않습니다 tf.compat.v1.Session(). 대신 사용할 수 있습니다 .
마이크

158

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

가장 쉬운 방법은 그래프 (하여 평가 될 때마다 텐서 값 볼 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]

37
a = tf.print의 a를 다른 것으로 사용하는 것이 매우 중요합니다! tf.print (A, [A])을, 그렇지 않으면 아무것도하지 않습니다
파 비우 디아스

5
우리는 단지 사용할 수 있습니다 a.eval()!
Udayraj Deshmukh

1
@FabioDias 나는 당신의 요점을 생각하지 않습니까? 시간이 있으면 친절하게
설명해 주시겠습니까

7
참고 사항 tf.Print()(지금) 사용되지되었다 제거. 대신을 사용하십시오 tf.print(). 문서 : tensorflow.org/api_docs/python/tf/Printtensorflow.org/api_docs/python/tf/print를 참조하십시오 .
Hephaestus

1
와우 나는 1 년 후 @yuqli에 대한 내 의견을보고 놀랐지 만 지금은 그의 요점을 이해한다. 참조 중단 된 API에 대해 아직 게시물을하지만 아이디어는 아마도 유사하다.
yuqli

27

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

값을 인쇄하기 쉬운 예제를 찾는 사람을위한 간단한 스 니펫은 다음과 같습니다. 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]]

2
참고로 :WARNING:tensorflow:From <ipython-input-25-8583e1c5b3d6>:1: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02. Instructions for updating: Use 'tf.global_variables_initializer' instead.
Mark Cramer

20

아니요, 그래프를 실행하지 않으면 ( 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))

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

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


15

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

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

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

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

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

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

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


13

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.]]

1
TensorFlow 버전 1.13.2를 설치하고 더 열악한 실행 (tf.executing_eagerly ()으로 실행하는 경우 확인)을 활성화하고 사용자 정의 손실 함수 내에서 텐서 값을 평가하려고 할 때 오류 'Tensor'객체에 'numpy'속성이 없습니다. 문제를 해결하는 데 도움을 주셔서 감사합니다.
Niko Gamulin

1
@NikoGamulin은 스크립트 시작 부분에 tf.compat.v1.enable_eager_execution ()을 넣었는지 확인하십시오. 버전 1.14.0이 있고 PyCharm에서 스크립트를 실행하고 있으며 tensor.numpy ()가 작동합니다.
Tommaso Di Noto

1
@NikoGamulin이 오류는 그래프 모드에서 텐서에 액세스하려고 할 때만 나타납니다. 실행이 제대로 활성화되지 않았 으면 좋겠다고 생각합니다. 열악한 실행을 확인하려면 aa = tf.constant (2.0), b = tf.constant (3.0), print (tf.add (a, b))를 정의하십시오. 답변이 5.0으로 표시되면 열망이 올바르게 활성화 된 것입니다.
Vishnuvardhan Janapati

9

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

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()

8

Tensorflow 2.0 이상 (또는 Eager 모드 환경)에서 .numpy()메소드 를 호출 할 수 있습니다 .

import tensorflow as tf

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

print(product.numpy()) 

tf.print(product)또한 print(product.numpy())TF 2.0과 동일한 출력을 제공합니다 .
HUSMEN

8

tf.keras.backend.eval 작은 표현을 평가하는 데 유용합니다.

tf.keras.backend.eval(op)

TF 1.x 및 TF 2.0 호환


최소한의 검증 가능한 예

from tensorflow.keras.backend import eval

m1 = tf.constant([[3., 3.]])
m2 = tf.constant([[2.],[2.]])

eval(tf.matmul(m1, m2))
# array([[12.]], dtype=float32)

명시 적으로 만들 필요가 없기 때문에 유용 Session또는 InteractiveSession.


7

당신은 가능하게하여, 세션의 그래프를 실행하지 않고 TensorObject의 출력을 확인할 수 있습니다 열망 실행 .

다음 두 줄의 코드를 추가하면됩니다. import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

당신 바로 후에 import tensorflow.

print product귀하의 예에서 출력은 다음 과 같습니다. tf.Tensor([[ 12.]], shape=(1, 1), dtype=float32)

현재 (2017 년 11 월) 열성적인 실행을 위해서는 Tensorflow 야간 빌드를 설치해야합니다. 사전 제작 된 휠은 여기 에서 찾을 수 있습니다 .


5

그주의 사항 tf.Print()텐서 이름을 변경합니다. 인쇄하려는 텐서가 자리 표시자인 경우 급지 중에 원래 이름을 찾을 수 없으므로 데이터를 급지 할 수 없습니다. 예를 들면 다음과 같습니다.

import tensorflow as tf
tens = tf.placeholder(tf.float32,[None,2],name="placeholder")
print(eval("tens"))
tens = tf.Print(tens,[tens, tf.shape(tens)],summarize=10,message="tens:")
print(eval("tens"))
res = tens + tens
sess = tf.Session()
sess.run(tf.global_variables_initializer())

print(sess.run(res))

출력은 다음과 같습니다

python test.py
Tensor("placeholder:0", shape=(?, 2), dtype=float32)
Tensor("Print:0", shape=(?, 2), dtype=float32)
Traceback (most recent call last):
[...]
InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'placeholder' with dtype float

5

TensorFlow Core 프로그램은 두 개의 개별 섹션으로 구성된 것으로 생각해야합니다.

  • 계산 그래프 작성
  • 계산 그래프를 실행합니다.

아래 코드의 경우 계산 그래프를 작성하십시오.

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

또한 TensorFlow 프로그램에서 모든 변수를 초기화하려면 다음과 같이 특수 조작을 명시 적으로 호출해야합니다.

init = tf.global_variables_initializer()

이제 그래프를 작성하고 모든 변수를 초기화했습니다. 다음 단계는 노드를 평가하는 것입니다. 세션 내에서 계산 그래프를 실행해야합니다. 세션은 TensorFlow 런타임의 제어 및 상태를 캡슐화합니다.

다음 코드는 Session 객체를 생성 한 다음 run 메소드를 호출하여 평가할 충분한 계산 그래프를 실행합니다 product.

sess = tf.Session()
// run variables initializer
sess.run(init)

print(sess.run([product]))

4

Keras를 사용할 수 있습니다. 한 줄 답변은 다음 eval과 같은 방법 을 사용 하는 것입니다.

import keras.backend as K
print(K.eval(your_tensor))

3

이 간단한 코드를 사용해보십시오! (자기 설명입니다)

import tensorflow as tf
sess = tf.InteractiveSession() # see the answers above :)
x = [[1.,2.,1.],[1.,1.,1.]]    # a 2D matrix as input to softmax
y = tf.nn.softmax(x)           # this is the softmax function
                               # you can have anything you like here
u = y.eval()
print(u)

2

나는 이것을 실행할 때까지 모든 대답을 읽은 후에도 필요한 것을 이해하기 쉽지 않았습니다. TensofFlow도 나에게 새로운 것입니다.

def printtest():
x = tf.constant([1.0, 3.0])
x = tf.Print(x,[x],message="Test")
init = (tf.global_variables_initializer(), tf.local_variables_initializer())
b = tf.add(x, x)
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(b))
    sess.close()

그러나 여전히 세션을 실행하여 반환 된 값이 필요할 수 있습니다.

def printtest():
    x = tf.constant([100.0])
    x = tf.Print(x,[x],message="Test")
    init = (tf.global_variables_initializer(), tf.local_variables_initializer())
    b = tf.add(x, x)
    with tf.Session() as sess:
        sess.run(init)
        c = sess.run(b)
        print(c)
        sess.close()

1

기본적으로 tensorflow에서 어떤 종류의 텐서를 만들면 tensorflow 세션을 실행할 때만 액세스 할 수있는 텐서가 만들어지고 저장됩니다.
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
세션을 실행하지 않고 상수 텐서를 생성했다고 가정하면
- op: 연산을 얻을 수 있습니다 . 이 텐서를 계산하는 연산입니다.
- value_index: 정수 이 텐서를 생성하는 작업 끝점의 인덱스입니다.
- dtype: DType. 이 텐서에 저장된 요소의 유형입니다.

값을 얻으려면 다음과 같이 필요한 텐서로 세션을 실행할 수 있습니다.

with tf.Session() as sess:
    print(sess.run(c))
    sess.close()

출력은 다음과 같습니다.

배열 ([[1., 2., 3.], [4., 5., 6.]], dtype = float32)


1

버전 1.10 이후에 tensorflow에 도입 된 열성적인 실행을 활성화하십시오. 사용하기 매우 쉽습니다.

# Initialize session
import tensorflow as tf
tf.enable_eager_execution()


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

print(a)

1

https://www.tensorflow.org/api_docs/python/tf/print에 제공된 팁을 사용하여 log_d형식화 된 문자열을 인쇄 하는 기능을 사용합니다 .

import tensorflow as tf

def log_d(fmt, *args):
    op = tf.py_func(func=lambda fmt_, *args_: print(fmt%(*args_,)),
                    inp=[fmt]+[*args], Tout=[])
    return tf.control_dependencies([op])


# actual code starts now...

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

with log_d('MAT1: %s, MAT2: %s', matrix1, matrix2): # this will print the log line
    product = tf.matmul(matrix1, matrix2)

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

0
import tensorflow as tf
sess = tf.InteractiveSession()
x = [[1.,2.,1.],[1.,1.,1.]]    
y = tf.nn.softmax(x)           

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

print(product.eval())
tf.reset_default_graph()
sess.close()

0

tf.Print는 더 이상 사용되지 않습니다. 대신 tf.print (소문자 p)를 사용하는 방법이 있습니다.

세션을 실행하는 것이 좋은 옵션이지만 항상가는 방법은 아닙니다. 예를 들어 특정 세션에서 텐서를 인쇄 할 수 있습니다.

새로운 인쇄 메소드는 출력 텐서가없는 인쇄 조작을 리턴합니다.

print_op = tf.print(tensor_to_print)

출력이 없기 때문에 tf.Print와 같은 방식으로 그래프에 삽입 할 수 없습니다. 대신 세션의 종속성을 제어하기 위해 추가하여 인쇄 할 수 있습니다.

sess = tf.compat.v1.Session()
with sess.as_default():
  tensor_to_print = tf.range(10)
  print_op = tf.print(tensor_to_print)
with tf.control_dependencies([print_op]):
  tripled_tensor = tensor_to_print * 3
sess.run(tripled_tensor)

때때로 더 큰 그래프에서 하위 함수로 부분적으로 생성 된 경우 print_op를 세션 호출에 전파하는 것이 번거 롭습니다. 그런 다음 tf.tuple을 사용하여 인쇄 작업을 다른 작업과 연결하면 세션이 코드를 실행하는 작업과 함께 해당 작업과 함께 실행됩니다. 그 방법은 다음과 같습니다.

print_op = tf.print(tensor_to_print)
some_tensor_list = tf.tuple([some_tensor], control_inputs=[print_op])
# Use some_tensor_list[0] instead of any_tensor below.

-2

질문 : TensorFlow에서 Tensor 객체의 값을 인쇄하는 방법은 무엇입니까?

대답:

import tensorflow as tf

# Variable
x = tf.Variable([[1,2,3]])

# initialize
init = (tf.global_variables_initializer(), tf.local_variables_initializer())

# Create a session
sess = tf.Session()

# run the session
sess.run(init)

# print the value
sess.run(x)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.