Ошибка возникает при вызове преобразования RandomRotation
и создании нового экземпляра класса Image
. В частности, функция core.fill()
в строке 2544 return im._new( core.fill(mode, size, color))
в функции new
в файле anaconda3/envs/py36/lib/python3.6/site-packages/PIL/Image.py
является источником «зла».
core
является псевдонимом файла anaconda3/envs/py36/lib/python3.6/site-packages/PIL/_imaging.cpython-36m-x86_64-linux-gnu.so
при импорте как from . import _imaging as core
в строке 69 в том же файле (Image.py).
Функция core.fill(mode, size, color))
в зависимости от mode
имеет различные ожидания относительно color
. color
всегда 3-кортеж, строки 726-727 в файле anaconda3/envs/py36/lib/python3.6/site-packages/torchvision/transforms/functional.py
, функция rotate
т.е. RandomRotation
transform.
Если mode == RGB
, то все в порядке. Если mode == L
, то TypeError: function takes exactly 1 argument (3 given)
повышается. Если mode == F
, TypeError: must be real number, not tuple
повышен. Я обнаружил, что при преобразовании моих изображений.
Для mode in [ 'L', 'F']
параметр color
должен быть одним целым числом. Для других mode
s это также может быть истиной.
Таким образом, я решил свою проблему, обновив код как
if mode in [ 'L', 'F'] and isinstance( color, tuple):
color = color[ 0]
return im._new( core.fill(mode, size, color))
в файле anaconda3/envs/py36/lib/python3.6/site-packages/PIL/Image.py
, функция new
.
Это изменение наиболее близко к проблеме. Однако, поскольку new
, по-видимому, используется для каждого преобразования, может быть лучше изменить код где-то еще, чтобы изменение имело минимальное влияние на остальную часть кода.