Tensorflow: O objeto 'Tensor' do TF 2.0 não tem o atributo 'numpy' ao usar .numpy () embora a execução rápida esteja habilitada por padrão

Criado em 4 abr. 2019  ·  54Comentários  ·  Fonte: tensorflow/tensorflow

Embora Eager_execution esteja habilitado por padrão no TF 2.0, estou recebendo erros ao usar .numpy ()

Observe que não estou usando o código no modo de compatibilidade com TF 1.0.

expt = [[[0, 0, 0],
[4, 71, 141],
[0, 0, 0]],

       [[ 83,  25,  85],
        [ 90, 190, 143],
        [  4, 141,  49]],

       [[  0,   0,   0],
        [  4,  71,  49],
        [  0,   0,   0]]]

expt = tf.convert_to_tensor (expt)

valores_esperados = expt.numpy ()

AttributeError: o objeto 'Tensor' não tem o atributo 'numpy'

VERSÃO DE TESTE DE CPU DO TENSORFLOW 2.0.

Fixed in Nightly TF 2.0 core awaiting response support

Comentários muito úteis

Eu tive o mesmo problema. Descobri que eu estava tentando usar .numpy () dentro de uma função @ tf.function. Tanto quanto eu entendo tf.function não é executado avidamente para fins de desempenho. Se eu remover o decorador @ tf.function .numpy () funcionará.

Todos 54 comentários

@ Mainak431 Você resolveu seu problema?

sim.

qual foi a sua solução?

.Numpy só é compatível com o modo antecipado. Se você estiver no modo gráfico, ele não será compatível. Para verificar, se você está no modo ansioso. Faça, tf. avidamente (). Ele retorna verdadeiro ou falso. No modo gráfico, você deve usar eval em uma sessão para obter o valor do tensor no array numpy.

@ Mainak431
módulo 'tensorflow' não tem atributo 'ansiosamente'
módulo 'tensorflow.compat.v1' não tem atributo 'ansiosamente'

Estou usando o pacote tensorflow-gpu == 2.0.0-alpha0
.numpy () em um dos meus tensores, o objeto 'Tensor' não tem o atributo 'numpy'

tf.eagerly () dá ao módulo 'tensorflow' nenhum atributo 'ansiosamente'

tf.executing_eagerly () em vez de tf.eagerly () funcionou para eu verificar se estou no modo ansioso

Alguém encontrou uma solução para isto?

mesmo problema aqui ... invoco um modelo keras no modo ansioso e recebo um Tensor, não um EagerTensor, o que causa problemas com o OpenAI Gym

Execute este tf.enable_eager_execution () e então quando você tentar tf.executing_eagerly () ele deve fornecer True. Depois disso, você pode usar something.numpy () para ver os valores.

@AkashNagaraj Acabei de apresentar um problema em que o código está sendo executado avidamente (e deveria, já que é TF 2.0), mas estou tendo um problema de "falta de numpy". Você se importaria de dar uma olhada? https://github.com/tensorflow/tensorflow/issues/32842

Obrigado!

Eu tive o mesmo problema. Descobri que eu estava tentando usar .numpy () dentro de uma função @ tf.function. Tanto quanto eu entendo tf.function não é executado avidamente para fins de desempenho. Se eu remover o decorador @ tf.function .numpy () funcionará.

Eu tive o mesmo problema. Descobri que eu estava tentando usar .numpy () dentro de uma função @ tf.function. Tanto quanto eu entendo tf.function não é executado avidamente para fins de desempenho. Se eu remover o decorador @ tf.function .numpy () funcionará.

Isso funciona para mim, @ tf.function transformou toda a função em modo gráfico

Por que não há uma única solução mencionada neste tópico =. =

Minha função não tem um decorador, mas .numpy () ainda falha conforme descrito por pôsteres anteriores. Alguém encontrou uma solução para isso?

Descobri que meu problema foi resolvido após inserir tf.compat.v1.enable_eager_execution () no início do meu script (muito semelhante ao que os pôsteres anteriores disseram, mas isso funciona para TF 2.0) ...

Estou tendo o mesmo problema e nenhuma das soluções mencionadas funcionou para mim.

Estou usando o TF 2.0, minha função não tem um decorador, tf.eagerly () retorna True e ainda obtenho o mesmo AttributeError: O objeto 'Tensor' não tem atributo 'numpy'.

Mesmo problema.

Verifiquei se estava executando com entusiasmo e não tenho um decorador na minha função de perda personalizada. Eu também tentei o comentário da solução dois de Michael, que não funcionou.

Recebo o erro: AttributeError: o objeto 'Tensor' não tem o atributo 'numpy'

Percebi que esse erro só aparece quando tento converter tensores em numpy durante o ajuste do modelo. Meu melhor palpite é que parece ser um problema de forma.

Por exemplo, o seguinte tensor

tf.Tensor ([[1 3] [0 4]], forma = (2, 2), dtipo = int64)

é conversível usando .numpy (). No entanto, ao tentar implementar uma métrica personalizada para um problema de classificação, y_true.numpy () e y_pred.numpy () aumentam

AttributeError: o objeto 'Tensor' não tem o atributo 'numpy'.

Aqui está um exemplo de ambos:

y_true:
print (y_true): Tensor ("dense_ target: 0 ", shape = (None, None, None), dtype = float32)
imprimir (tipo (y_true)):

y_pred:
print (y_pred): Tensor ("denso / Identidade: 0 ", forma = (Nenhum, Nenhum, 6), dtype = float32)
imprimir (tipo (pred)):

@renatomello Estou tendo o mesmo problema que você. Abri um novo problema: # 35393.

@renatomello o problema ainda persiste ao tentar implementar uma métrica customizada. Você encontrou uma solução alternativa?

@renatomello o problema ainda persiste ao tentar implementar uma métrica customizada. Você encontrou uma solução alternativa?

Não, eu não fiz. Estou tentando ver se há uma função de back-end TF / Keras que faz algo semelhante que eu possa trabalhar. Caso contrário, terei que criar um sozinho.

Eu encontrei essa área ao usar as funções regex no pré-processamento de dados. Usar a lógica Python requer o uso de tf.py_function conforme mencionado na documentação e neste thread StackOverflow (Observação tf.py_func() agora é tf.py_function() )

Assim que mudei meu código de
data = fnames.map(process_path)
para
data = fnames.map(lambda x: tf.py_function(process_path, [x], [tf.string]))
o código foi executado corretamente.

Encontrei esse problema ao experimentar a camada TextVectorization no TF2.1 com um split muito personalizado. O que consertou para mim foi passar dynamic=True para a construção TextVectorization .

Percebi que esse erro só aparece quando tento converter tensores em numpy durante o ajuste do modelo. Meu melhor palpite é que parece ser um problema de forma.

Por exemplo, o seguinte tensor

tf.Tensor ([[1 3] [0 4]], forma = (2, 2), dtipo = int64)

é conversível usando .numpy (). No entanto, ao tentar implementar uma métrica personalizada para um problema de classificação, y_true.numpy () e y_pred.numpy () aumentam

AttributeError: o objeto 'Tensor' não tem o atributo 'numpy'.

Aqui está um exemplo de ambos:

y_true:
print (y_true): Tensor ("dense_ target: 0 ", shape = (None, None, None), dtype = float32)
imprimir (tipo (y_true)):

y_pred:
print (y_pred): Tensor ("denso / Identidade: 0 ", forma = (Nenhum, Nenhum, 6), dtype = float32)
imprimir (tipo (pred)):

Não sei o motivo, mas resolvi esse problema adicionando
experimental_run_tf_function=False
na função de compilação do meu modelo.

Percebi que esse erro só aparece quando tento converter tensores em numpy durante o ajuste do modelo. Meu melhor palpite é que parece ser um problema de forma.
Por exemplo, o seguinte tensor

tf.Tensor ([[1 3] [0 4]], forma = (2, 2), dtipo = int64)
é conversível usando .numpy (). No entanto, ao tentar implementar uma métrica personalizada para um problema de classificação, y_true.numpy () e y_pred.numpy () aumentam
AttributeError: o objeto 'Tensor' não tem o atributo 'numpy'.
Aqui está um exemplo de ambos:
y_true:
print (y_true): Tensor ("dense_ target: 0 ", shape = (None, None, None), dtype = float32)
imprimir (tipo (y_true)):
y_pred:
print (y_pred): Tensor ("denso / Identidade: 0 ", forma = (Nenhum, Nenhum, 6), dtype = float32)
imprimir (tipo (pred)):

Não sei o motivo, mas resolvi esse problema adicionando
experimental_run_tf_function=False
na função de compilação do meu modelo.

Não parece fazer diferença no meu caso

Encontrei esse problema ao experimentar a camada TextVectorization no TF2.1 com um split muito personalizado. O que consertou para mim foi passar dynamic=True para a construção TextVectorization .

Como você fez isso exatamente?

primeiro, você deve registrar a Sessão da seguinte forma:
sess = tf.Session ()
então .. usar:
valores_esperados = expt.eval (sessão = sessão)
o resultado deve ser:
imprimir (valores_esperados)
Fora [41]:
matriz ([[[0, 0, 0],
[4, 71, 141],
[0, 0, 0]]])
obrigado

Encontrei esse problema ao experimentar a camada TextVectorization no TF2.1 com um split muito personalizado. O que consertou para mim foi passar dynamic=True para a construção TextVectorization .

Como você fez isso exatamente?

Como isso. Ainda estou aprendendo ML / TF em geral, então isso pode ter sido a coisa errada a fazer. É tudo magia negra até que 'simplesmente funcione'.

vectorize_layer = tf.keras.layers.experimental.preprocessing.TextVectorization(
    standardize=tf_custom_standardize,
    split=tf_custom_split,
    max_tokens=len(vocab)+1,
    output_mode='int',
    dynamic=True
)

Este problema ainda persiste para mim. Não estou usando a anotação @ tf.function e executando avidamente. A solução alternativa que estou usando agora é np.array (yourtensor.to_list ())

Este problema ainda persiste para mim. Não estou usando a anotação @ tf.function e executando avidamente. A solução alternativa que estou usando agora é np.array (yourtensor.to_list ())

Isso é o que eu recebo
AttributeError: 'Tensor' object has no attribute 'to_list'

De acordo com os códigos em tensorflow, quando o objeto tensor está no tensor de modo ansioso (tensorflow.python.framework.ops.EagerTensor), podemos chamar tesnsorObj.numpy ()
este método é implementado em tensorflow / python / framework / ops.py
Mas se o objeto tensor é um tensor geral, por exemplo, pertencente a tensorflow.python.framework.ops.Tensor, então não terá o método numpy (), os códigos de implementação também estão em tensorflow / python / framework / ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/ops.py

Isso significa que todos os objetos tensores em execução em @ tf.function não podem chamar tensorObj.numpy ()
O modo de execução ansioso adiciona a flexibilidade ao TF2.0 e também adiciona complexidade a ele.

De acordo com os códigos em tensorflow, quando o objeto tensor está no tensor de modo ansioso (tensorflow.python.framework.ops.EagerTensor), podemos chamar tesnsorObj.numpy ()
este método é implementado em tensorflow / python / framework / ops.py
Mas se o objeto tensor é um tensor geral, por exemplo, pertencente a tensorflow.python.framework.ops.Tensor, então não terá o método numpy (), os códigos de implementação também estão em tensorflow / python / framework / ops.py
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/framework/ops.py

Isso significa que todos os objetos tensores em execução em @ tf.function não podem chamar tensorObj.numpy ()
O modo de execução ansioso adiciona a flexibilidade ao TF2.0 e também adiciona complexidade a ele.

Obrigado pela explicação detalhada.

No entanto, esse problema não foi resolvido na versão 2.1.0 estável. Foi-me dito no # 38038 que o problema estava resolvido na versão 2.2.0 do tf-nightly.

@renatomello Sou um novato completo no TF. Portanto, não tenho certeza se o seguinte ajudará a resolver seu problema.
Eu resolvo o erro AttributeError: 'Tensor' object has no attribute 'numpy' , usando experimental_run_functions_eagerly (True) .
Eu uso o TF ver. 2.1 (Para obter informações detalhadas sobre a versão, consulte a saída do console abaixo). Eu permito explicar o que estou fazendo com este código:

import sys
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
import numpy as np

counter=0

class MyDense(layers.Dense):
  def __init__(self, units, activation,input_shape):
    super().__init__(units=units, activation=activation,input_shape=input_shape)

  def call(self, inputs):
      global counter

      counter += 1
      print('\n{}. inputs.numpy()='.format(counter))
      if hasattr(inputs,'numpy'):
          print('{}'.format(inputs.numpy()))
      else:
          print('not available.')

      return super().call(inputs)

def test(run_eagerly):
    print('\n*** *** *** test(run_eagerly={})'.format(run_eagerly))
    tf.config.experimental_run_functions_eagerly(run_eagerly)

    dim0=256
    dim1=24
    train = np.arange(dim0*dim1).reshape(dim0,dim1)
    label = np.ones(dim0)

    model = tf.keras.Sequential()
    model.add(MyDense(10,activation='softmax',input_shape=(dim1,)))

    model.compile(optimizer=tf.keras.optimizers.SGD(),
                  loss=tf.keras.losses.SparseCategoricalCrossentropy())

    model.fit(train,
              label,
              batch_size=dim0,
              epochs=1)

print("Python version")
print (sys.version)
print("TensorFlow version")
print(tf.__version__)
print('\n\n')

test(False)
test(True)

Eu executo o código acima no console do editor do Spyder (Spyder versão 4.0.1). A saída do console correspondente é (apenas partes da saída):

Python version
3.7.6 (default, Jan  8 2020, 19:59:22) 
[GCC 7.3.0]
TensorFlow version
2.1.0

*** *** *** test(run_eagerly=False)

1. inputs.numpy()=
not available.
Train on 256 samples

2. inputs.numpy()=
not available.

3. inputs.numpy()=
not available.
256/256 [==============================] - 0s 899us/sample - loss: 6344.8682

*** *** *** test(run_eagerly=True)

4. inputs.numpy()=
not available.
Train on 256 samples

5. inputs.numpy()=
[[2328. 2329. 2330. ... 2349. 2350. 2351.]
 [5280. 5281. 5282. ... 5301. 5302. 5303.]
 [2208. 2209. 2210. ... 2229. 2230. 2231.]
 ...
 [5160. 5161. 5162. ... 5181. 5182. 5183.]
 [ 840.  841.  842. ...  861.  862.  863.]
 [6048. 6049. 6050. ... 6069. 6070. 6071.]]
256/256 [==============================] - 0s 132us/sample - loss: 16.1181

Agora, veja na saída do console abaixo de test(run_eagerly=False) : Todas as três chamadas MyDense.call () indicam que input.numpy () não está disponível (Nota lateral: Quando entendi corretamente, as duas primeiras MyDense.call () chamadas são apenas para construir o modelo. Portanto, é significativo que eles não tenham input.numpy () disponível.). Então, isso é significativo.
Veja na saída do console abaixo test(run_eagerly=True) : No quinto MyDense.call () está disponível o input.numpy (). Então, isso também é significativo. E isso resolve o erro.

Eu tive o mesmo problema. Descobri que eu estava tentando usar .numpy () dentro de uma função @ tf.function. Tanto quanto eu entendo tf.function não é executado avidamente para fins de desempenho. Se eu remover o decorador @ tf.function .numpy () funcionará.

Funciona para mim.

Tentei todas as soluções mencionadas neste tópico e nenhuma delas funcionou para mim. Estou em 2.2.0-rc2.

Não parece ser um problema de execução ansiosa no meu caso. O erro vem dessas linhas quando chamei keras.backend.get_value() :

  if context.executing_eagerly() or isinstance(x, ops.EagerTensor):
    return x.numpy()

Tive o mesmo problema. Acontece que, por padrão, a execução avidamente é desabilitada ao executar a função de ajuste em um modelo. Para combater isso, você pode executar: model.run_eagerly = True antes de executar model.fit.
Isso funcionou como um encanto para mim no Tensorflow 2.2

model.compile (..., run_eagerly = True) funcionou para mim ao criar uma métrica personalizada

Tive um problema semelhante ao trabalhar com Keras.
Não sei se isso vai ajudar outro, mas seguir me ajudou:
Eu estava usando:
model = Sequential () antes e mudou para
model = tf.keras.Sequential ()
E funcionou para mim.

@ Mainak431 , você se importaria de reabrir o problema?

Tive um problema semelhante ao trabalhar com Keras.
Não sei se isso vai ajudar outro, mas seguir me ajudou:
Eu estava usando:
model = Sequential () antes e mudou para
model = tf.keras.Sequential ()
E funcionou para mim.

Essa foi realmente a solução para mim, eu reutilizei algum código antigo que importava diretamente do keras, não das camadas tensorflow.keras etc. alterar as instruções de importação resolveu o erro de atributo.

@Blubbaa O mesmo aqui. Foi a única coisa que funcionou para mim.

Se eu quiser verificar o valor em tensor, mas tiver que desabilitar o modo antecipado por causa da compatibilidade de tf.placeholder , como devo fazer? Eu tentei adicionar tf.enable_eager_execution entre a camada sem tf.placeholder apenas para obter este erro ValueError: tf.enable_eager_execution must be called at program startup.

O seguinte código funcionou:

def parse_str(str_tensor):
    raw_string = str_tensor.numpy().decode("utf-8") 

    # play with raw string
    raw_string = 'AAA'+raw_string     
    return raw_string

Função de análise de chamada:

def tf_pre_processing(row):
  return tf.py_function(parse_str, [row['context']], [tf.string])


train = t.map(tf_pre_processing).batch(1).take(1)

list(train)

@ Mainak431 O código original estava funcionando conforme o esperado. Aqui está a essência.

@ tu1258 Você não precisa desabilitar a execução tf.compat.v1.placeholder vez de tf.placeholder . Se ainda não funcionar, compartilhe um código autônomo para reproduzir o problema.

Por favor, me avise se houver mais perguntas. Obrigado!

Eu tive o mesmo problema. Descobri que eu estava tentando usar .numpy () dentro de uma função @ tf.function. Tanto quanto eu entendo tf.function não é executado avidamente para fins de desempenho. Se eu remover o decorador @ tf.function .numpy () funcionará.

Acho que seguir a opção no Tensorflow2.x pode ajudar
tf.config.run_functions_eagerly

No local que você está chamando tf.function, você pode tentar executá-lo avidamente e, em seguida, desabilitar a execução antecipada de tf.function.

Eu sou novo no tensorflow, mas seguindo este tutorial (no Jupyter Notebook) https://www.tensorflow.org/tutorials/quickstart/beginner?hl=en apresentarei o erro

predictions = model(x_train[:1]).numpy()
Tensor object has no attribute 'numpy'

@louisnot não consigo reproduzir o erro. Por favor, verifique a essência aqui . Obrigado!

Se você estiver enfrentando o erro, pode compartilhar um ponto principal? Obrigado!

Não tive nenhum problema em usar a essência.

Estou encerrando este problema porque ele foi resolvido em tf-nightly . Sinta-se à vontade para reabrir se o problema persistir. Obrigado!

@bhupendrathore Você pode abrir um novo problema com um código autônomo simples para reproduzir o erro? Obrigado!

Tenho o mesmo problema,; quando eu conserto em sua solução com pip install tf-nightly , os erros ocorrem:

ERROR: Could not find a version that satisfies the requirement tf-nightly (from versions: none)
ERROR: No matching distribution found for tf-nightly

@jvishnuvardhan

@liangzelang vejo que você abriu outra nova edição. nós vamos resolver isso lá. Obrigado

Esta página foi útil?
0 / 5 - 0 avaliações