Python 在tensorflow中输入图像数据进行迁移学习

Python 在tensorflow中输入图像数据进行迁移学习,python,tensorflow,Python,Tensorflow,我正在尝试使用tensorflow进行迁移学习。我从教程中下载了预先培训过的model inception3。在代码中,对于预测: prediction = sess.run(softmax_tensor,{'DecodeJpeg/contents:0'}:image_data}) 是否有一种方法可以提供png图像。我尝试将DecodeJpeg更改为DecodePng,但没有成功。此外,如果我想要像numpy数组或一批数组一样提供解码图像文件,我应该更改什么 谢谢 中使用的附带的Incepti

我正在尝试使用tensorflow进行迁移学习。我从教程中下载了预先培训过的model inception3。在代码中,对于预测:

prediction = sess.run(softmax_tensor,{'DecodeJpeg/contents:0'}:image_data})
是否有一种方法可以提供png图像。我尝试将DecodeJpeg更改为DecodePng,但没有成功。此外,如果我想要像numpy数组或一批数组一样提供解码图像文件,我应该更改什么


谢谢

中使用的附带的InceptionV3图形仅支持现成的JPEG图像。有两种方法可以将此图形用于PNG图像:

将PNG图像转换为高度x宽度x 3通道Numpy数组,例如使用,然后输入“DecodeJpeg:0”张量:

将numpy作为np导入 从PIL导入图像 ... image=image.openexample.png image_array=np.arrayimage[:,:,0:3]仅选择RGB通道。 prediction=sess.runsoftmax_张量,{'DecodeJpeg:0':图像_数组} 也许令人困惑的是,“DecodeJpeg:0”是DecodeJpeg op的输出,因此通过输入该张量,您可以输入原始图像数据

将tf.image.decode_png op添加到导入的图形中。简单地将fed张量的名称从“DecodeJpeg/contents:0”切换到“DecodePng/contents:0”不起作用,因为附带的图形中没有“DecodePng”op。您可以使用input_map参数将此类节点添加到图形中,以:

png_data=tf.placeholdertf.string,形状=[] 解码的\u png=tf.image.decode\u pngpng\u数据,通道=3 ... 图形_def=。。。 softmax_tensor=tf.import_graph_def 图形_def, 输入\u map={'DecodeJpeg:0':已解码\u png}, return_elements=['softmax:0'] sess.runsoftmax_张量,{png_数据:…}
下面的代码应该处理这两种情况

将numpy作为np导入 从PIL导入图像 image_file='test.jpeg' 将tf.Session作为SES: softmax\u tensor=sess.graph.通过名称“最终结果:0”获取\u tensor\u 如果图像_file.lower.endswith“.jpeg”: image\u data=tf.gfile.FastGFileimage\u文件'rb'。读取 prediction=sess。运行'final_result:0',{'DecodeJpeg/contents:0':image_data} elif image_file.lower.endswith.png': image=image.openimage\u文件 image_array=np.arrayimage[:,:,0:3] prediction=sess。运行'final_result:0',{'DecodeJpeg:0':image_array} 预测=预测[0] 印刷预测 或具有直接字符串的较短版本:

image_file='test.png'或'test.jpeg' image\u data=tf.gfile.FastGFileimage\u文件'rb'。读取 ph=tf.placeholdertf.string,形状=[] 将tf.Session作为SES: 预测=sess.runoutput\u layer\u name,{ph:image\u data}
我试过你的第一种方法。它输出“无法从提要中获取元素”。我不知道为什么。但是你的第二个工作。谢谢根据您的第二个答案,我假设“DecodeJpeg:0”是用jpg_data=tf.placeholdertf.string、shape=[]构建的;decoded_jpg=tf.image.decode_jpeg_data,channels=3,因此它会等待字符串而不是numpy数组。@Yamaneko:选项1显示了如何直接向numpy数组馈送数据。tensor DecodeJpeg:0是对JPEG图像进行解码的运算的输出,因此如果输入替换值,它也应该是解码图像。@milez这些运算的工作方式仍然相同,因此答案仍然有效。我怀疑OpenCV转换为字符串时有问题,但这里没有足够的空间来详细说明。请随意发布一个新问题,并附上您尝试过的最简单的例子!好吧,我知道了。根据tf示例,pretrained Inception v3中的第一个节点是DecodeJpeg/contents:0,它需要一个jpeg编码的图像作为字符串。但是,第二个节点是DecodeJpeg:0,它接受解码图像作为numpy数组,如您所说。我只是忽略了一个事实,即您的示例中没有包含/contents:您是否尝试将PNG图像传递给此操作?文件表明,该操作也支持PNG解码。