如何在张量流中将“张量”转换为“ numpy”数组?

时间:2019-05-10 09:50:53

标签: python tensorflow tensorflow-datasets tensorflow2.0

我正在尝试在tesnorflow2.0版本中将张量转换为numpy。由于tf2.0启用了急切的执行功能,因此默认情况下它应该也可以正常运行。当我在tf.data.Dataset API中执行代码时,它给出了错误

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

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

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函数

1 个答案:

答案 0 :(得分:0)

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

内部的tf.data.Dataset对象通过创建静态图形来工作:这意味着您无法使用.numpy(),因为在静态图形上下文中的tf.Tensor对象不会具有此属性。

因此,input_image = random_noise(image.numpy())行应为input_image = random_noise(image)

但是由于random_noiseget_noise包中调用model.utils,因此代码很可能再次失败。 如果get_noise函数是使用Tensorflow编写的,那么一切都会正常。否则,它将无法正常工作。

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

例如,如果您的函数get_noise仅凭输入图像的光泽产生随机噪声,则可以按以下方式定义它:

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

仅使用Tensorflow原语,它将起作用。

希望此概述对您有所帮助!

PS:您可能会对文章“分析tf.function来发现AutoGraph的优势和微妙之处”感兴趣-它们涵盖了这一方面(也许第3部分与您的情况有关):{{3} } part 1 part 2