Tensorflow 2.3: ошибка атрибута: объект ‘Tensor’ не имеет атрибута ‘numpy’

#python #tensorflow #tensorflow2.0

#python #tensorflow #tensorflow2.0

Вопрос:

Я хотел загрузить текстовый файл, заимствованный из here, где каждая строка представляет строку json, подобную следующей:

 {"overall": 2.0, "verified": true, "reviewTime": "02 4, 2014", "reviewerID": "A1M117A53LEI8", "asin": "7508492919", "reviewerName": "Sharon Williams", "reviewText": "DON'T CARE FOR IT.  GAVE IT AS A GIFT AND THEY WERE OKAY WITH IT.  JUST NOT WHAT I EXPECTED.", "summary": "CASE", "unixReviewTime": 1391472000}
  

Я хотел бы извлечь только reviewText и overall функцию из набора данных, используя tensorflow, но столкнулся со следующей ошибкой.

 AttributeError: in user code:

    <ipython-input-4-419019a35c5e>:9 None  *
        line_dataset = line_dataset.map(lambda row: transform(row))
    <ipython-input-4-419019a35c5e>:2 transform  *
        str_example = example.numpy().decode("utf-8")

    AttributeError: 'Tensor' object has no attribute 'numpy'
  

Мой фрагмент кода выглядит следующим образом:

 def transform(example):
    str_example = example.numpy().decode("utf-8")
    json_example = json.loads(str_example)
    overall = json_example.get('overall', None)
    text = json_example.get('reviewText', None)
    return (overall, text)

line_dataset = tf.data.TextLineDataset(filenames = [file_path])
line_dataset = line_dataset.map(lambda row: transform(row))
for example in line_dataset.take(5):
    print(example)
  

Я использую tensorflow 2.3.0.

Ответ №1:

Конвейер ввода набора данных всегда отображается в виде графика (как если бы вы использовали @tf.function ), чтобы ускорить его, что означает, среди прочего, что вы не можете использовать .numpy() . Однако вы можете использовать tf.numpy_function для доступа к данным в виде массива NumPy в графе:

 def transform(example):
    # example will now by a NumPy array
    str_example = example.decode("utf-8")
    json_example = json.loads(str_example)
    overall = json_example.get('overall', None)
    text = json_example.get('reviewText', None)
    return (overall, text)

line_dataset = tf.data.TextLineDataset(filenames = [file_path])
line_dataset = line_dataset.map(
    lambda row: tf.numpy_function(transform, row, (tf.float32, tf.string)))
for example in line_dataset.take(5):
    print(example)
  

Ответ №2:

Немного многословно, но попробуйте сделать это так:

 def transform(example):     
    str_example = example.numpy().decode("utf-8")     
    json_example = json.loads(str_example)     
    overall = json_example.get('overall', None)     
    text = json_example.get('reviewText', None)     
    return (overall, text)  

line_dataset = tf.data.TextLineDataset(filenames = [file_path]) 
line_dataset = line_dataset.map(
    lambda input:     
        tf.py_function(transform, [input], (tf.float32, tf.string))
)  
for example in line_dataset.take(5):     
    print(example)
  

Этот конкретный фрагмент работает для любой функции python, а не только для функций numpy. Итак, если вам нужны такие функции, как print , input и так далее, вы можете использовать это. Вам не обязательно знать все подробности, но если вам интересно, пожалуйста, спросите меня. 🙂

Комментарии:

1. С какой целью используется декоратор в tf_function ?

2. Я изменил ваш фрагмент, чтобы сократить его, и моя версия вашего фрагмента также работает. def transform(example): str_example = example.numpy().decode("utf-8") json_example = json.loads(str_example) overall = json_example.get('overall', None) text = json_example.get('reviewText', None) return (overall, text) line_dataset = tf.data.TextLineDataset(filenames = [file_path]) line_dataset = line_dataset.map(lambda input: tf.py_function(transform, [input], (tf.float32, tf.string))) for example in line_dataset.take(5): print(example)

3. С вашего разрешения, я обновлю свой ответ вашим фрагментом. Ваш код выглядит лучше 🙂