首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >开始用我自己的数据集启动google-cloud-ml

开始用我自己的数据集启动google-cloud-ml
EN

Stack Overflow用户
提问于 2016-10-24 12:01:48
回答 2查看 266关注 0票数 2

我成功地执行了所有步骤google云ml在线教程的

但是,由于本教程中使用的数据集已经是TFRecord,我不太清楚如何将numpy数据集转换为TFRecord数据集。

然后,我尝试使用TFRecord创建records.py。我理解的是,我们只能将原始变量转换为TFRecord,这就是为什么使用将浮点数列表转换为字节的技巧。然后,我必须在某个地方将我的字符串转换成一个浮动列表。因此,我尝试使用第97行或第98行在我修改的脚本model.py中来执行此任务。

不幸的是,这些尝试都没有奏效。我总是收到以下错误消息:

代码语言:javascript
复制
ValueError: rank of shape must be at least 2 not: 1

这是因为我的变量特性的形状是(batch_size,)而不是(batch_size,IMAGE_PIXELS)。但我不明白为什么。

我是试图以错误的方式启动google ml,还是有更多的参数需要调整?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-24 13:46:50

误差表示期望的秩2(矩阵),但实际值是秩1(向量)。我怀疑这是因为np.tostring()返回的是单个字符串,而不是字符串列表。

我认为这有点切分,因为我不认为您的浮动到字符串和字符串到浮动转换是一致的。使用numpy的内置字符串()方法将浮动转换为字符串。返回数据的字节表示形式:

代码语言:javascript
复制
import numpy as np
x = np.array([1.0, 2.0])
print x.tostring()

返回

代码语言:javascript
复制
�?@

而不是

代码语言:javascript
复制
['1.0', '2.0']

后者正是tf.string_to_number所期望的。

您可以使浮动到字符串和字符串到浮点数的转换保持一致,但我认为更好的解决方案是将数据表示为浮点数。例如:

代码语言:javascript
复制
def _int64_feature(value):
  return tf.train.Feature(int64_list=tf.train.Int64List(value=value))

def _float_feature(value):
  return tf.train.Feature(float_list=tf.train.FloatList(value=value))

e = tf.train.Example(features=tf.train.Features(feature={
          'labels': _int64_feature([10]),
          'features': _float_feature([100.0, 200, ....])}))

feature_map = {
      'labels': tf.FixedLenFeature(
          shape=[1], dtype=tf.int64, default_value=[-1]),
      'features': tf.FixedLenFeature(
          shape=[NUM_PIXELS], dtype=tf.float32),
}
result = tf.parse_example([e.SerializeToString()], features=feature_map)

特征原图允许浮动32秒存储在float_list中。如果使用float64,则只需要将浮点数转换为字节。您的数据是float32,因此这是不必要的。

票数 3
EN

Stack Overflow用户

发布于 2016-10-24 13:46:23

这可能有助于分析read_data_sets.py的输出和model.py中的parse_example操作的输出。

read_data_sets产生的

正如您所指出的,集合为每个图像创建了numpy数组。它们的形状为28、28、1,用于高度x宽度x通道(图像为单色),在您最初对read_data_sets的调用中,您将图像数据指定为uint8数组。当您在串字串 numpy数组上调用uint8时,形状信息将被丢弃,并且由于每个uint8都是一个字节,最终得到一个长度为784的字节字符串,在原始的28x28x1 numpy数组中,每个像素都有一个条目--按主要顺序排列。然后将其作为bytes_list存储在生成的tf.train.Example中。

综上所述,features键下的功能地图中的每个条目都有一个字节列表,其中只有一个条目。该条目是一个长度为784的字符串,其中字符串中的每个“字符”都是一个0-255之间的值,表示原始28x28图像中一个点的单色像素值。下面是由Python打印的tf.train.Example示例实例:

代码语言:javascript
复制
features {
  feature {
    key: "features"
    value {
      bytes_list {
        value: "\000\000\257..."
      }
    }
  }
  feature {
    key: "labels"
    value {
      int64_list {
        value: 10
      }
    }
  }
}

parse_example所期望并返回的

示例接受tf.string对象的向量作为输入。这些对象是序列化的tf.train.Example对象。在您的代码中,util.read_examples会产生准确的结果。

tf.parse_example的另一个参数是示例的模式。如前所述,您的示例中的features条目是上面定义的tf.string。供参考,您的代码有:

代码语言:javascript
复制
def parse_examples(examples):
  feature_map = {
      'labels': tf.FixedLenFeature(
          shape=[], dtype=tf.int64, default_value=[-1]),
      'features': tf.FixedLenFeature(
          shape=[], dtype=tf.string),
  }
  return tf.parse_example(examples, features=feature_map)

与您收到的错误消息相关的感兴趣的东西是形状参数。该形状参数指定单个实例的形状,在本例中,通过指定shape=[],您是说每个图像都是一个秩-0字符串,也就是说,一个普通的旧字符串(即,不是向量,不是矩阵等等)。这要求bytes_list只有一个元素。这正是您在features的每个tf.train.Example字段中存储的内容。

即使shape属性引用单个实例的形状,features字段的tf.parse_example输出也将是整个示例。这可能有点让人困惑。因此,虽然每个单独的示例都有一个字符串(shape=[]),但是批处理是字符串的向量(shape=[batch_size])。

使用图像

将图像数据包含在字符串中并不是很有用;我们需要将其转换回数字数据。要做到这一点的TensorFlow操作是未加工 (Jeremy 解释tf.string_to_number为什么不能在这里工作):

代码语言:javascript
复制
image_bytes = tf.decode_raw(parsed['features'], out_type=tf.uint8)
image_data = tf.cast(image_bytes, tf.float32)

(确保设置out_type=tf.uint8,因为这是read_data_sets中输出的数据类型)。通常,您需要将结果转换为tf.float32。有时,重塑张量以恢复原始形状甚至是有用的,例如,

代码语言:javascript
复制
# New shape is [batch_size, height, width, channels]. We use
# -1 as the first dimension in case batches are variable size.
image_data = tf.reshape(image_data, [-1, 28, 28, 1])

(注意:您可能不需要在代码中这样做)。

或者,您可以通过使用tf.float32调用read_data_sets (默认)将数据存储为dtype=tf.float32。然后由Jeremy将您的tf.train.Example构造为解释,他还给出了解析此类示例的代码。但是,在这种情况下,形状会有所不同。每个实例的形状(如FixedLenFeature中的形状所示)现在是IMAGE_PIXELS,而tf.parsed_example输出中的features条目的形状是[batch_size, IMAGE_PIXELS]

当然,uint8float32之间的权衡是,磁盘上的数据大约是后者的四倍,但是您避免了前者所需要的额外转换。对于数据不多的MNIST,直接处理浮点数据所增加的清晰度可能值得额外的空间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40217891

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档