TensorFlow 读取自己的数据集

数据读取

TensorFlow程序读取数据一共有3种方法:
1. 供给数据(Feeding): 在TensorFlow程序运行的每一步, 让Python代码来供给数据。
2. 从文件读取数据: 在TensorFlow图的起始, 让一个输入管线从文件中读取数据。
3. 预加载数据: 在TensorFlow图中定义常量或变量来保存所有数据(仅适用于数据量比较小的情况)。

feeding

  1. placeholder占位符,在计算图中占个位置
  2. 在会话中用feed_dict输入数据
with tf.Session():
  input = tf.placeholder(tf.float32)
  classifier = ...
  print classifier.eval(feed_dict={input: my_python_preprocessing_fn()})

大型feed_dict使用例子

从文件读取数据

步骤

  1. 文件名列表
  2. 可配置的 文件名乱序(shuffling)
  3. 可配置的 最大训练迭代数(epoch limit)
  4. 文件名队列
  5. 针对输入文件格式的阅读器
  6. 纪录解析器
  7. 可配置的预处理器
  8. 样本队列

产生文件列表

产生文件列表,方法如下:
["file0", "file1"] 或者[("file%d" % i) for i in range(2)] 或者[("file%d" % i) for i in range(2)]) 或者tf.train.match_filenames_once

生成文件队列

将文件名列表交给tf.train.string_input_producer 函数. string_input_producer来生成一个先入先出的队列, 文件阅读器会需要它来读取数据。

可配置的文件名乱序(shuffling)

设置string_input_producer函数参数,选择是否乱序,设置迭代次数

针对输入文件格式的阅读器

根据你的文件格式, 选择对应的文件阅读器, 然后将文件名队列提供给阅读器的read方法。阅读器的read方法会输出一个key来表征输入的文件和value其中的纪录(对于调试非常有用),同时得到一个字符串标量, 这个字符串标量可以被一个或多个解析器,或者转换操作将其解码为张量并且构造成为样本。

过程:选择的文件读取器,读取文件名队列并解码,输入tf.train.shuffle_batch 函数中,生成 batch 队列,传递给下一层。

CSV文件

假如你要读取的文件是像 CSV 那样的文本文件,用的文件读取器和解码器就是 TextLineReaderdecode_csv

bin(二进制文件)

假如你要读取的数据是像 cifar10 那样的 .bin 格式的二进制文件,就用 tf.FixedLengthRecordReader 和 tf.decode_raw 读取固定长度的文件读取器和解码器。
例子:cifar10_input.py详解


将数据转换成 tfrecords格式后读取

如果你要读取的数据是图片,或者是其他类型的格式,那么可以先把数据转换成 TensorFlow 的标准支持格式 tfrecords ,它其实是一种二进制文件,通过修改 tf.train.ExampleFeatures,将protocol buffer序列化为一个字符串,再通过 tf.python_io.TFRecordWriter 将序列化的字符串写入tfrecords,然后再用跟上面一样的方式读取tfrecords,只是读取器变成了tf.TFRecordReader,之后通过一个解析器tf.parse_single_example ,然后用解码器 tf.decode_raw解码。
例子选段

def convert_to(data_set, name):
  """Converts a dataset to tfrecords."""
  images = data_set.images
  labels = data_set.labels
  num_examples = data_set.num_examples

  if images.shape[0] != num_examples:
    raise ValueError('Images size %d does not match label size %d.' %
                     (images.shape[0], num_examples))
  rows = images.shape[1]
  cols = images.shape[2]
  depth = images.shape[3]

  filename = os.path.join(FLAGS.directory, name + '.tfrecords')
  print('Writing', filename)
  with tf.python_io.TFRecordWriter(filename) as writer:
    for index in range(num_examples):
      image_raw = images[index].tostring()
      example = tf.train.Example(
          features=tf.train.Features(
              feature={
                  'height': _int64_feature(rows),
                  'width': _int64_feature(cols),
                  'depth': _int64_feature(depth),
                  'label': _int64_feature(int(labels[index])),
                  'image_raw': _bytes_feature(image_raw)
              }))
writer.write(example.SerializeToString())

tensorflow 官方例子,更好但是更长
Step by Step, A Tutorial on How to Feed Your Own Image Data to Tensorflow

直接读取图片
  • 首先,设置你的 ROOT_PATH。这个路径是带有你的训练数据和测试数据的目录。

  • 接下来,你可以借助 join() 函数为 ROOT_PATH 增加特定的路径。你将这两个特定的路径存储在 train_data_directory 和 test_data_directory 中

  • 之后,你可以调用 load_data() 函数,并将 train_data_directory 作为它的参数。

  • 现在 load_data() 启动并自己开始收集 train_data_directory 下的所有子目录;为此它借助了一种被称为列表推导式(list comprehension)的方法——这是一种构建列表的自然方法。基本上就是说:如果在 train_data_directory 中发现了一些东西,就双重检查这是否是一个目录;如果是,就将其加入到你的列表中。注意:每个子目录都代表了一个标签。

  • 接下来,你必须循环遍历这些子目录。首先你要初始化两个列表:labels 和 imanges。然后你要收集这些子目录的路径以及存储在这些子目录中的图像的文件名。之后,你可以使用 append() 函数来收集这两个列表中的数据。

  • 参考资料-机器之心交通标志数据集

def load_data(data_directory):
    directories = [d for d in os.listdir(data_directory) 
                   if os.path.isdir(os.path.join(data_directory, d))]
    labels = []
    images = []    for d in directories:
        label_directory = os.path.join(data_directory, d)
        file_names = [os.path.join(label_directory, f) 
                      for f in os.listdir(label_directory) 
                      if f.endswith(".ppm")]        for f in file_names:
            images.append(skimage.data.imread(f))
            labels.append(int(d))    return images, labels

ROOT_PATH = "/your/root/path"train_data_directory = os.path.join(ROOT_PATH, "TrafficSigns/Training")
test_data_directory = os.path.join(ROOT_PATH, "TrafficSigns/Testing")

images, labels = load_data(train_data_directory)

预加载数据

参考资料

TF Boys (TensorFlow Boys ) 养成记(二): TensorFlow 数据读取
tensorflow(二)----线程队列与io操作
极客学院 TensorFlow 官方文档中文版 数据读取

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: TensorFlow可以通过以下代码读取MNIST数据集: ```python import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data # 读取MNIST数据集 mnist = input_data.read_data_sets("MNIST_data/", one_hot=True) # 打印训练集、验证集和测试集的大小 print("训练集大小:", mnist.train.num_examples) print("验证集大小:", mnist.validation.num_examples) print("测试集大小:", mnist.test.num_examples) # 打印训练集中第一个样本的标签和像素值 print("训练集第一个样本的标签:", mnist.train.labels[0]) print("训练集第一个样本的像素值:", mnist.train.images[0]) ``` 其中,`input_data.read_data_sets()`函数会自动下载MNIST数据集并将其存储在指定的文件夹中。`one_hot=True`表示将标签转换为one-hot编码。训练集、验证集和测试集分别存储在`mnist.train`、`mnist.validation`和`mnist.test`中。每个样本的标签存储在`labels`中,像素值存储在`images`中。 ### 回答2: TensorFlow是一个用于构建和训练机器学习模型的强大框架。在机器学习中,MNIST数据集是一个广泛使用的手写数字识别任务。TensorFlow提供了一个方便的API,可以用于读取MNIST数据集。 首先,要使用MNIST数据集,需要从TensorFlow的datasets模块中导入它: ```python from tensorflow.keras.datasets import mnist ``` 然后,我们可以使用load_data()方法来下载并读取MNIST数据集: ```python (x_train, y_train), (x_test, y_test) = mnist.load_data() ``` 上述代码将会下载MNIST数据集,分别读取训练和测试数据,将其分别存储在x_train、y_train、x_test和y_test四个变量中。 其中,x_train和x_test变量包含手写数字图像的像素值,每个图像由28x28个像素组成。y_train和y_test变量则包含相应图像的标签,即手写数字的真实值。 在读取MNIST数据集后,我们可以使用matplotlib等图形库来显示和可视化数据集。 例如,可以使用下面的代码显示MNIST数据集中的第一个训练样本: ```python import matplotlib.pyplot as plt plt.imshow(x_train[0], cmap='gray') plt.show() ``` 除了使用预先定义的MNIST数据集TensorFlow还提供了灵活的API,可以读取自定义的数据集。可以使用tf.data工具包或者直接从存储在磁盘上的文件中读取数据。 总之,TensorFlow提供了非常简单和灵活的API,可以方便地读取MNIST数据集。这使得开发者可以专注于模型的构建和训练,而不必花费太多时间和精力处理数据读取的问题。 ### 回答3: TensorFlow是一种非常强大的机器学习框架,它可以方便地实现各种模型,包括深度神经网络。MNIST是一个手写数字的数据集,它由6万张图片组成,其中5万张是训练集,1万张是测试集。在TensorFlow中,读取MNIST数据集非常简单,只需按照以下步骤操作即可。 首先,我们需要导入必要的库,包括TensorFlow本身和numpy。Numpy是Python中的一个常用数学库,可以方便地处理数组和矩阵。 ```python import tensorflow as tf import numpy as np ``` 接下来,我们可以从TensorFlow内置的数据集中加载MNIST数据集TensorFlow提供了一个方便的API来自动下载和管理MNIST数据集,我们只需调用一行代码即可。 ```python mnist = tf.keras.datasets.mnist ``` 接下来,我们可以将训练集和测试集分别加载到内存中,使用`load_data()`方法即可。此时,训练集和测试集将被存储为numpy数组。 ```python (train_images, train_labels), (test_images, test_labels) = mnist.load_data() ``` 最后,我们需要将数据集转换为TensorFlow中的张量。由于MNIST数据集是28x28的灰度图像,每个像素的灰度值介于0和255之间,我们需要进行一些数据预处理才能将其作为输入传递给神经网络模型。 ```python # 将图片灰度值缩小为0到1之间,并将其转换为浮点张量 train_images = train_images / 255.0 test_images = test_images / 255.0 # 添加一个维度作为通道维,使每个图像的形状为(28, 28, 1) train_images = np.expand_dims(train_images, axis=-1) test_images = np.expand_dims(test_images, axis=-1) # 将标签转换为独热编码 train_labels = tf.keras.utils.to_categorical(train_labels, num_classes=10) test_labels = tf.keras.utils.to_categorical(test_labels, num_classes=10) # 将numpy数组转换为TensorFlow张量 train_dataset = tf.data.Dataset.from_tensor_slices((train_images, train_labels)) test_dataset = tf.data.Dataset.from_tensor_slices((test_images, test_labels)) ``` 现在,我们已经成功地将MNIST数据集加载到了TensorFlow中,并将其转换为可以用于训练和测试模型的张量。我们可以像任何其他TensorFlow数据集一样使用这些数据集,如构建迭代器或批处理数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值