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/