1

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

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

但是,当我ml.features.ImageFeatureColumn在我的feature_set. 特别是,FeatureMetadata.parse_features为我的图像特征生成一个形状错误的张量。正如 的返回值所定义的ImageFeatureColumn.transform,图像特征由一个标量 JPEG 编码的字符串组成,这表明相应的张量应该是 形状(BATCH_SIZE, 1)。但是FeatureMetadata.parse_features给了我一个形状的张量(BATCH_SIZE, ImageFeatureColumn.feature_size > 1)

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

ValueError:无法将具有 524288 个元素的张量重塑为 shape ()(1 个元素)

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

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

(运行不带参数的脚本以查看错误。带参数运行它--hack以查看我在脚本中所做的修复工作。)

这是一个错误吗?

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

4

1 回答 1

1

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

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

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

让我知道这是否有帮助。

于 2016-11-21T22:26:49.280 回答