Skip to main content
 首页 » 编程设计

python之如何在 tensorflow 中将 "tensor"转换为 "numpy"数组

2024年08月13日34xiaohuochai

我正在尝试在 tesnorflow2.0 版本中将张量转换为 numpy。由于 tf2.0 启用了 eager execution,因此它应该默认工作并且在正常运行时也可以工作。当我在 tf.data.Dataset API 中执行代码时出现错误

“AttributeError: 'Tensor' 对象没有属性 'numpy'”

我在 tensorflow 变量之后尝试了“.numpy()”,对于“.eval()”,我无法获得默认 session 。

from __future__ import absolute_import, division, print_function, unicode_literals 
import tensorflow as tf 
# tf.executing_eagerly() 
import os 
import time 
import matplotlib.pyplot as plt 
from IPython.display import clear_output 
from model.utils import  get_noise 
import cv2 
 
 
def random_noise(input_image): 
  img_out = get_noise(input_image) 
  return img_out 
 
 
def load_denoising(image_file): 
  image = tf.io.read_file(image_file) 
  image = tf.image.decode_png(image) 
  real_image = image 
  input_image = random_noise(image.numpy()) 
  input_image = tf.cast(input_image, tf.float32) 
  real_image = tf.cast(real_image, tf.float32) 
  return input_image, real_image 
 
 
def load_image_train(image_file): 
  input_image, real_image = load_denoising(image_file) 
  return input_image, real_image 

这很好用

inp, re = load_denoising('/data/images/train/18.png') 
# Check for correct run 
plt.figure() 
plt.imshow(inp) 
print(re.shape,"  ", inp.shape) 

这会产生上述错误

train_dataset = tf.data.Dataset.list_files('/data/images/train/*.png') 
train_dataset = train_dataset.map(load_image_train,num_parallel_calls=tf.data.experimental.AUTOTUNE) 

注意:random_noise有cv2和sklearn函数

请您参考如下方法:

如果要在 tf.data.Dataset.map 调用中使用此张量,则不能对张量使用 .numpy 方法。

引擎盖下的 tf.data.Dataset 对象通过创建静态图来工作:这意味着您不能使用 .numpy() 因为 tf.Tensor 静态图上下文中的对象没有此属性。

因此,input_image = random_noise(image.numpy()) 行应该是 input_image = random_noise(image)。

但由于 random_noise 从 model.utils 包中调用了 get_noise,代码可能会再次失败。 如果 get_noise 函数是使用 Tensorflow 编写的,那么一切都会起作用。否则,它不会工作。

解决方案?仅使用 Tensorflow 原语编写代码。

例如,如果您的函数 get_noise 只是用输入图像的表面创建随机噪声,您可以这样定义它:

def get_noise(image): 
    return tf.random.normal(shape=tf.shape(image)) 

仅使用 Tensorflow 基元,它就可以工作。

希望这篇概述对您有所帮助!

P.S:您可能有兴趣查看文章“分析 tf.function 以发现 AutoGraph 的优势和微妙之处”——它们涵盖了这方面(也许第 3 部分与您的场景相关):part 1 part 2 part 3