Python 在将图像转换为张量以执行神经风格转换时,我得到了图像没有形状的值错误

Python 在将图像转换为张量以执行神经风格转换时,我得到了图像没有形状的值错误,python,tensorflow,deep-learning,Python,Tensorflow,Deep Learning,我使用tensorflow_hub模块执行神经风格转换,得到错误“图像”不包含形状”。我不明白我在哪里犯了错误 这是我的代码: 导入tensorflow\u hub作为hub 导入tensorflow作为tf 将numpy作为np导入 将matplotlib.pyplot作为plt导入 content\u path=r'C:\Users\Sriram\Desktop\efil.jpg' style\u path=r'C:\Users\Sriram\Desktop\download1.jfif'

我使用tensorflow_hub模块执行神经风格转换,得到错误“图像”不包含形状”。我不明白我在哪里犯了错误

这是我的代码:

导入tensorflow\u hub作为hub
导入tensorflow作为tf
将numpy作为np导入
将matplotlib.pyplot作为plt导入
content\u path=r'C:\Users\Sriram\Desktop\efil.jpg'
style\u path=r'C:\Users\Sriram\Desktop\download1.jfif'
content\u image=plt.imread(content\u路径)
style\u image=plt.imread(style\u路径)
plt.子地块(1,2,1)
plt.title('内容图像')
打印轴(“关闭”)
plt.子地块(1、2、2)
plt.title('样式图像')
打印轴(“关闭”)
def图像到张量(路径到图像):
img=tf.io.read\u文件(路径\u到\u img)
img=tf.image.decode_image(img,channels=3,dtype=tf.float32)
#将图像调整为特定尺寸
img=tf.image.resize(img[720512])
img=img[tf.newaxis,:]
返回img
定义张量到图像(张量):
张量=张量*255
张量=np.array(张量,dtype=np.uint8)
张量=张量[0]
plt.图(figsize=(20,10))
打印轴(“关闭”)
返回plt.imshow(张量)
内容\图像\张量=图像\到\张量(内容\路径)
样式\图像\张量=图像\到\张量(样式\路径)
集线器模块=集线器加载('https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2')
组合结果=中心模块(tf.常量(内容图像张量)、tf.常量(样式图像张量))[0]
结果=张量到图像(组合结果)
以下是错误:

runfile('C:/Users/Sriram/.spyder-py3/temp.py', wdir='C:/Users/Sriram/.spyder-py3')
Traceback (most recent call last):

  File "C:\Users\Sriram\.spyder-py3\temp.py", line 30, in <module>
    content_image_tensor = image_to_tensor(content_path)

  File "C:\Users\Sriram\.spyder-py3\temp.py", line 20, in image_to_tensor
    img = tf.image.resize(img, [720, 512])

  File "C:\Users\Sriram\anaconda3\lib\site-packages\tensorflow\python\ops\image_ops_impl.py", line 1182, in resize_images
    skip_resize_if_same=True)

  File "C:\Users\Sriram\anaconda3\lib\site-packages\tensorflow\python\ops\image_ops_impl.py", line 1029, in _resize_images_common
    raise ValueError('\'images\' contains no shape.')

ValueError: 'images' contains no shape
runfile('C:/Users/Sriram/.spyder-py3/temp.py',wdir='C:/Users/Sriram/.spyder-py3')
回溯(最近一次呼叫最后一次):
文件“C:\Users\Sriram\.spyder-py3\temp.py”,第30行,在
内容\图像\张量=图像\到\张量(内容\路径)
文件“C:\Users\Sriram\.spyder-py3\temp.py”,第20行,在图像到张量中
img=tf.image.resize(img[720512])
文件“C:\Users\Sriram\anaconda3\lib\site packages\tensorflow\python\ops\image\u ops\u impl.py”,第1182行,在resize\u images中
如果相同,则跳过调整大小)
文件“C:\Users\Sriram\anaconda3\lib\site packages\tensorflow\python\ops\image\u ops\u impl.py”,第1029行,位于“resize\u images\u common”
提升值错误(“\'images\”不包含形状。“)
ValueError:“图像”不包含形状

您的代码在TensorFlow 2.2上运行良好,因此我假设您在TensorFlow 1.x上使用
decode\u图像
:当“一般”解码图像时,形状不会返回-这使得调用
resize()
失败。有多种方法可以做到这一点

利用已知的图像大小 如果事先知道图像的大小,可以使用以下方法将大小强制到张量上(然后调整大小):

img=tf.io.read\u文件(路径到\u img)
img=tf.image.decode_image(img,channels=3,dtype=tf.float32)
#变通办法
img.set_形状([宽度、高度,3])
img=tf.image.resize(img[720512])
img=img[tf.newaxis,:]
利用已知的图像格式 如果您知道所有图像都是JPEG格式,则可以使用
decode\u JPEG
,这会更好一些:

img=tf.io.read\u文件(路径到\u img)
#变通办法
img=tf.image.decode\u jpeg(img,通道=3)
img=tf.image.convert\u image\u dtype(img,np.float32)
img=tf.image.resize(img[720512])
img=img[tf.newaxis,:]
使用带裁剪和填充的“调整大小” 或者,您也可以尝试使用显然能解决该问题的方法:

img=tf.io.read\u文件(路径到\u img)
img=tf.image.decode_image(img,channels=3,dtype=tf.float32)
#变通办法
img=tf.image。使用裁剪或焊盘(img,720,512)调整图像大小
img=img[tf.newaxis,:]

不过有一个警告:代码假定所有操作都是急切地执行的,这是TensorFlow 2.x上的默认值,而不是TensorFlow 1.x上的默认值。因此,
tensor\u to\u image(tensor)
函数将失败,因为提供的张量不能简单地转换为NumPy数组。要解决此问题,可以在脚本开始时运行

tf.compat.v1.enable_eager_execution()

在旁注上-您可以使用和将图像转换回:

def tensor\u到图像(tensor):
tensor=tf.image.convert\u image\u dtype(tensor,np.uint8)
张量=tf.挤压(张量)
plt.图(figsize=(20,10))
打印轴(“关闭”)
返回plt.imshow(张量)
这将确保所有值都适当饱和(例如,当转换为
np.float32
时,将不会有
0..1
之外的值),并摆脱某种神奇的
[0]
索引