开始使用我的CloudML来获得自己的数据

2024-04-26 02:30:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我成功地执行了所有步骤of the online tutorial for google cloud ml。在

但是,由于本教程中使用的数据集已经是一个TFRecord,所以我不太理解transform如何将numpy数据集转换为TFRecord数据集。在

然后,我尝试使用this a little bit modified code compared to the official convert_to_records.py创建我的TFRecord。我所理解的是,我们只能将原始变量转换为TFRecord,这就是为什么要使用将float列表转换为字节的技巧。 然后我必须把我的字符串转换回浮动列表。因此,我试图用第97行或第98行in my modified script model.py执行此任务。在

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

ValueError: rank of shape must be at least 2 not: 1

这是因为我的变量features的形状是(批处理大小)而不是(批处理大小,图像像素)。但我不明白为什么。在

我是想用错误的方式启动googlecloudml呢,还是有更多的参数需要调整?在


Tags: oftheto数据pycloud列表for
2条回答

该错误表示应为秩2(矩阵),但实际值为秩1(向量)。我怀疑这是因为np.TO字符串()返回单个字符串,而不是字符串列表。在

我认为这有点不相干,因为我不认为浮点到字符串和字符串到浮点的转换是一致的。使用numpy的内置tostring()方法将float转换为字符串。它返回数据的字节表示:即

import numpy as np
x = np.array([1.0, 2.0])
print x.tostring()

退货

^{pr2}$

而不是

^{3}$

后者是什么tf.string_to_号期望。在

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

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)

Feature proto允许float32存储在float_list中。如果使用float64,则只需要将浮点转换为字节。你的数据是float32,所以这是不必要的。在

这可能有助于分析read_数据的输出_sets.py以及parse_example操作的输出模型.py在

读取数据集产生的结果

正如您所指出的,read_data_sets为每个图像创建numpy数组。对于高度x宽度x通道(图像是单色的),它们有形状[28,28,1],在最初的读取数据集调用中,您指定希望图像数据作为uint8数组。当您对uint8 numpy数组调用tostring时,形状信息将被丢弃,并且由于每个uint8是一个单字节,因此最终将得到一个长度为784的字节字符串,原始28x28x1 numpy数组中的每个像素都有一个条目。然后将其作为bytes_list存储在结果tf.train.Example中。在

简而言之,特性映射中features键下的每个条目都有一个字节列表,其中正好有一个条目。该条目是一个长度为784的字符串,其中字符串中的每个“字符”都是0到255之间的值,表示原始28x28图像中某个点的单色像素值。下面是Python打印的tf.train.Example的示例实例:

features {
  feature {
    key: "features"
    value {
      bytes_list {
        value: "\000\000\257..."
      }
    }
  }
  feature {
    key: "labels"
    value {
      int64_list {
        value: 10
      }
    }
  }
}

parse_示例期望并返回的结果

tf.parse_example接受tf.string对象的向量作为输入。这些对象是序列化的tf.train.Example对象。在您的代码中,util.read_examples正是这样产生的。在

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

^{pr2}$

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

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

使用图像

将图像数据放在字符串中不是很有用;我们需要将其转换回数值数据。执行此操作的TensorFlow操作是tf.decode_raw(Jeremy Lewiexplained为什么tf.string_to_number在这里不起作用):

^{3}$

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

# 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型通过使用dtype=tf.float32(默认值)调用read_data_sets。然后,您可以将您的tf.train.Example构造为explained,Jeremy Lewi也给出了解析这些示例的代码。但是,在这种情况下,形状会有所不同。每个实例的形状(如FixedLenFeature中的形状所示)现在是IMAGE_PIXELStf.parsed_example输出中的features项的形状是[batch_size, IMAGE_PIXELS]。在

当然,uint8和{}之间的权衡是,磁盘上的数据大约是后者的四倍,但可以避免前者所需的额外转换。在MNIST中没有太多数据的情况下,直接处理浮点数据所增加的清晰度可能值得额外的空间。在

相关问题 更多 >