python - 将 ImageFeatureColumn 与 ml.Preprocess + ml.features.FeatureMetadata.parse_features 结合使用时出现错误

标签 python google-cloud-ml

Google Cloud ML Iris example清楚表明我可以通过以下步骤为 Tensorflow 模型创建输入张量:

  • 创建 feature_set = 将特征名称映射到 ml.features.FeatureColumn 对象的字典
  • feature_set 传递到 ml.Preprocess 以生成元数据对象
  • 调用 ml.features.FeatureMetadata.parse_features,它使用该元数据对象创建一个 Tensor,将表示 tf.Example 编码的训练示例的 Tensor 转换为字典代表 feature_set 中特征的张量。

但是,当我在 feature_set 中包含 ml.features.ImageFeatureColumn 时,这对我不起作用。特别是,FeatureMetadata.parse_features 生成的张量对于我的图像特征来说形状错误。根据 ImageFeatureColumn.transform 的返回值的定义,图像特征由标量 JPEG 编码字符串组成,这表明相应的 Tensor 的形状应为 (BATCH_SIZE, 1).但是 FeatureMetadata.parse_features 给了我一个形状为 (BATCH_SIZE, ImageFeatureColumn.feature_size > 1) 的张量。

这使得我无法在该张量上调用tf.image.decode_jpeg。无论我使用什么柔道来尝试使该功能正常工作,我都会收到以下错误:

ValueError: Cannot reshape a tensor with 524288 elements to shape () (1 elements)

当我将 ImageFeatureColumn.feature_size(或基于此值生成的元数据)更改为 1 时,此错误消失。

您可以运行以下脚本来查看此错误:http://pastebin.com/kHjqgp0r

(运行不带参数的脚本以查看错误。使用参数 --hack 运行脚本以查看我在脚本中所做的修复是否有效。)

这是一个错误吗?

顺便说一句,这是 google.cloud.ml 的 0.1.7-alpha 版本。

最佳答案

Tensorflow 没有图像数据类型,因此图像的张量返回的大小不是 1,而是图像中所有字节的大小。

Tensorflow 对于固定长度的张量效果最好,但设定大小的 Jpeg 可能具有不同的二进制长度。为了解决这个问题,为 jpeg 返回的张量的 feature_size 设置为(图像宽度)*(图像高度)* 8 字节/像素,以确保它足够大以容纳图像。您将 target_size 设置为 (256, 256),因此图像大小将调整为该大小,并且(每像素 8 字节)x 256 x 256 = 524288 字节。

这些张量应该能够发送到decode_jpeg。

请告诉我这是否有帮助。

关于python - 将 ImageFeatureColumn 与 ml.Preprocess + ml.features.FeatureMetadata.parse_features 结合使用时出现错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40727154/

相关文章:

python - 为什么使用 Google AI-Platform 进行本地训练无法在虚拟环境中进行?

python - python中如何比较两个值是否相同但情况不同

python - 在 ubuntu 上将 python 包关联到不同版本的 python

python - Numpy 屏蔽数组 argmax 在完全屏蔽数组上不返回 'masked'?

python - 如何在 TensorFlow 中使用批量标准化?

python - 加载模型时出现意外错误: problem in predictor - ModuleNotFoundError: No module named 'torchvision'

python - 运行图时出现异常: Unable to get element from the feed as bytes

python - 在类中生成动态方法

tensorflow - 在谷歌云机器学习上部署 Retrained inception 模型