tf.nn.conv2d происходит недопустимоеargumenterror: Значение для attr ‘T’ uint8 отсутствует в списке разрешенных значений

#python-3.x #tensorflow

Вопрос:

Я просто изучаю, как использовать версию tensorflow 2.x. Но в моем коде возникает ошибка, и я не знаю причины.

 import cv2
import matplotlib.pyplot as plt
img = cv2.imread('dataset/bird_pic_by_benjamin_planche.png', cv2.IMREAD_GRAYSCALE)
import tensorflow as tf
import tensorflow.keras as keras
img = tf.constant(img)
img = tf.reshape(img, [1, 680, 608])
img = tf.reshape(img, [1, 680, 608, 1])
parameters = [[1/16, 2/16, 1/16],
             [2/16, 4/16, 2/16],
             [1/16, 2/16, 1/16]]
kernel = tf.constant(parameters)
print("Kernel shape : {}".format(kernel.shape))
kernel = tf.reshape(kernel, [3, 3, 1, 1])
print("Kernel shape : {}".format(kernel.shape))
img = tf.nn.conv2d(img, kernel, strides=[1, 1, 1, 1], padding='SAME')
 

ошибка заключается в

————————————————————————— Недопустимая ошибка отслеживания (последний последний вызов) в — — — — > 1 img = tf.nn.conv2d(img, ядро, шаги=[1, 1, 1, 1], заполнение=»ТО ЖЕ САМОЕ»)

c:usersgoeunminiconda3envstflibsite-packagestensorflowpythonutildispatch.py в оболочке(*args, **kwargs) 199 «»»Вызовите цель и обратитесь к диспетчерам, если есть ошибка типа.»»» 200 попробуйте: —> 201 вернуть цель(*args, **kwargs) 202 за исключением (ошибка типа, ошибка значения): 203 # Примечание: convert_to_eager_tensor в настоящее время вызывает ошибку значения, а не ошибку

c:usersgoeunminiconda3envstflibsite-packagestensorflowpythonopsnn_ops.py в conv2d_v2(ввод, фильтры, шаги, заполнение, формат данных, расширения, имя) 2164 формат данных=формат данных, 2165
расширения=расширения, -> 2166 имя=имя) 2167 2168

c:usersgoeunminiconda3envstflibsite-packagestensorflowpythonutildispatch.py в оболочке(*args, **kwargs) 199 «»»Вызовите цель и обратитесь к диспетчерам, если есть ошибка типа.»»» 200 попробуйте: —> 201 вернуть цель(*args, **kwargs) 202 за исключением (ошибка типа, ошибка значения): 203 # Примечание: convert_to_eager_tensor в настоящее время вызывает ошибку значения, а не ошибку

c:usersgoeunminiconda3envstflibsite-packagestensorflowpythonopsnn_ops.py в conv2d(ввод, фильтр, шаги, заполнение, use_cudnn_on_gpu, формат данных, расширения, имя, фильтры) 2272
формат данных=формат данных, 2273 расширения=расширения, -> 2274 имя=имя) 2275 возвращают значения squeeze_batch_dims( ввод 2276,

c:usersgoeunminiconda3envstflibsite-packagestensorflowpythonopsgen_nn_ops.py в conv2d(ввод, фильтр, шаги, заполнение, use_cudnn_on_gpu, explicit_paddings, формат данных, расширения, имя) 935 возвращает _результат 936, кроме _core._NotOkStatusException как e: —> 937 _ops.raise_from_not_ok_status(e, имя) 938, кроме _core.Исключение _FallbackException: пропуск 939

c:usersgoeunminiconda3envstflibsite-packagestensorflowpythonframeworkops.py в raise_from_not_ok_status(e, имя) 6841 сообщение = e.сообщение (» имя: » имя, если имя не является никем другим «») 6842 # pylint: отключить=защищенный доступ- > 6843 шесть.raise_from(исключение core._status_to_exception(e.код, сообщение), Отсутствует) 6844 # pylint: включить=защищенный доступ 6845

c:usersgoeunminiconda3envstflibsite-packagessix.py в raise_from(значение, from_value)

InvalidArgumentError: Значение для attr ‘T’ uint8 отсутствует в списке разрешенных значений: половина, bfloat16, поплавок, двойной, int32 ; NodeDef: {{узел Conv2D}}; Op<имя=Conv2D; подпись=ввод:T, фильтр:T -> вывод:T; attr=T:тип,разрешено=[DT_HALF, DT_BFLOAT16, DT_FLOAT, DT_DOUBLE, DT_INT32]; attr=шаги:список(int); attr=use_cudnn_on_gpu:bool,по умолчанию=true; attr=заполнение:строка,разрешено=[«ТО ЖЕ САМОЕ», «ДОПУСТИМО», «ЯВНО»]; attr=явные дополнения:список(int),по умолчанию=[]; attr=формат данных:строка,по умолчанию=»NHWC»,разрешено=[«NHWC», «NCHW»]; attr=расширения:список(int),по умолчанию=[1, 1, 1, 1]<имя=Conv2D; подпись=ввод:T, фильтр:T ->> [Op:Conv2D]

в чем проблема..? Пожалуйста, помогите мне..

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

1. Каков тип данных img тензора?

2. его тип <dtype: ‘uint8’>

3. Итак, преобразуйте его в float32, чтобы он поддерживался conv2d. используйте img=tf.cast(img, dtype=tf.float32) перед подачей его на слой

4. ух ты, спасибо тебе огромное!! Теперь это работает!

Ответ №1:

Вы должны преобразовать свой входной тензор в один из поддерживаемых типов данных tf.nn.conv2d . Основываясь на приведенном здесь документе, поддерживаются следующие типы half, bfloat16, float32, float64 .

Ваш входной тензор ( img ) имеет uint8 формат и не поддерживается в качестве типа входных данных. Итак, просто преобразуйте свой тензор, прежде чем передавать его в слой:

 img = tf.cast(img, dtype=tf.float32)