TensorFlow 텐서를 Numpy 배열로 변환

Sep 13 2020

문제 설명

TensorFlow 2.3.0에서 사용자 지정 손실 함수를 작성하려고합니다. 손실을 계산하려면 y_pred매개 변수를 numpy 배열로 변환해야합니다. 그러나 <class 'tensorflow.python.framework.ops.Tensor'>TensorFlow 함수가 그렇게하는 것처럼 보이지만 그것을 numpy 배열 로 변환하는 방법을 찾을 수 없습니다 .

코드 예

def custom_loss(y_true, y_pred):
    print(type(y_pred))
    npa = y_pred.make_ndarray()
    ...
    

if __name__ == '__main__':
    ...
    model.compile(loss=custom_loss, optimizer="adam")
    model.fit(x=train_data, y=train_data, epochs=10)

오류 메시지를 제공합니다 AttributeError: 'Tensor' object has no attribute 'make_ndarray. y_pred매개 변수 유형을 인쇄 한 후 :<class 'tensorflow.python.framework.ops.Tensor'>

내가 지금까지 시도한 것

해결책을 찾고 있는데 이것이 일반적인 문제인 것 같고 몇 가지 제안 사항이 있지만 지금까지는 작동하지 않았습니다.

1. "... Tensor 객체에서 .numpy ()를 호출하십시오.": TensorFlow에서 텐서를 numpy 배열로 어떻게 변환 할 수 있습니까?

그래서 나는 시도했다.

def custom_loss(y_true, y_pred):
    npa = y_pred.numpy()
    ...

나에게주는 AttributeError: 'Tensor' object has no attribute 'numpy'

2. "tensorflow.Tensor.eval ()을 사용하여 텐서를 배열 로 변환 ": Python에서 TensorFlow 텐서를 NumPy 배열로 변환하는 방법

그래서 나는 시도했다.

def custom_loss(y_true, y_pred):
    npa = y_pred.eval(session=tf.compat.v1.Session())
    ...

내가 본 핵심 오류 메시지 중 가장 긴 흔적 중 하나를 제공합니다.

InvalidArgumentError: 2 root error(s) found.
      (0) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
         [[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]
         [[functional_1/cropping2d/strided_slice/_1]]
      (1) Invalid argument: You must feed a value for placeholder tensor 'functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource' with dtype resource
         [[node functional_1/conv2d_2/BiasAdd/ReadVariableOp/resource (defined at main.py:303) ]]

또한 버전 1.x에서 TensorFlow 호환성 함수를 호출해야하는 것은 미래를 보장하지 않는다고 느끼기 때문에이 접근 방식을 너무 좋아하지 않습니다.

3. TensorFlow Docs를 살펴보면 제가 기다려야하는 기능이있는 것 같았습니다. tf.make_ndarray 텐서에서 numpy ndarray를 만듭니다.

그래서 나는 시도했다.

def custom_loss(y_true, y_pred):
    npa = tf.make_ndarray(y_pred)
    ...

나에게주는 AttributeError: 'Tensor' object has no attribute 'tensor_shape'

TF 문서의 예제를 보면 proto_tensor에서 이것을 사용하므로 먼저 proto로 변환을 시도했습니다.

def custom_loss(y_true, y_pred):
    proto_tensor = tf.make_tensor_proto(y_pred)
    npa = tf.make_ndarray(proto_tensor)
    ...

그러나 이미 tf.make_tensor_proto(y_pred)오류가 발생합니다.TypeError: Expected any non-tensor type, got a tensor instead.

또한 const 텐서를 먼저 만들려고하면 동일한 오류가 발생합니다.

def custom_loss(y_true, y_pred):
    a = tf.constant(y_pred)
    proto_tensor = tf.make_tensor_proto(a)
    npa = tf.make_ndarray(proto_tensor)
    ...

이것에 대해 더 많은 포스트가 있지만 모두이 세 가지 기본 아이디어로 돌아 오는 것 같습니다. 귀하의 제안을 기다리고 있습니다!

답변

runDOSrun Sep 13 2020 at 17:11

y_pred.numpy()TF 2에서 작동하지만 AttributeError: 'Tensor' object has no attribute 'make_ndarray당신이 그렇지 않으면하지 않았을 당신이 열망 모드에서 실행되지 않습니다 코드의 부분이 있음을 나타냅니다 Tensor객체하지만를 EagerTensor.

Eager 모드를 활성화하려면 그래프의 내용이 작성되기 전에 코드 시작 부분에 다음을 입력하십시오.

tf.config.experimental_run_functions_eagerly(True)

둘째, 모델을 컴파일 할 때 다음 매개 변수를 추가합니다.

model.compile(..., run_eagerly=True, ...)

이제 Eager 모드에서 실행 중이며 모든 변수는 실제로 인쇄하고 작업 할 수있는 값을 보유합니다. Eager 모드로 전환하려면 코드를 추가로 조정해야 할 수 있습니다 ( 개요는 여기 참조 ).