tensorflow Dataset操作

项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

1.Dataset简介

Dataset是tf 1.3加入的新API,主要是用于相关的数据处理与构建,并输入模型。
之前的版本处理数据的方式一般有:
1.使用placeholder,从内存中读取数据,很多早期tf相关的代码与例子大部分都是使用这种方式。
2.使用队列机制读取硬盘上的数据。

2.from_tensor_slices

from_tensor_slices是dataset里经常被使用到的函数,作用就是对给定的各种数据,包括元祖,列表,张量等进行切片。。

举个常见的例子

import tensorflow as tf
import numpy as np

def t1():
    features = np.random.normal(0.0, 1.0, size=(5, 2))
    labels = np.random.normal(0.0, 1.0, (5, 1))
    print(features)
    print(labels)

    data = tf.data.Dataset.from_tensor_slices((features, labels))
    print(data)

t1()

输出结果为

[[ 0.37208844 -1.26077084]
 [-0.71780999  2.58988077]
 [ 1.3527441  -0.44104282]
 [-0.55810738 -1.35183379]
 [-0.40439778 -0.57422795]]
[[ 1.76836302]
 [-0.20405357]
 [ 1.25057682]
 [-0.43016585]
 [ 1.79215106]]
<DatasetV1Adapter shapes: ((2,), (1,)), types: (tf.float64, tf.float64)>

上面的例子中,features是一个 5 ∗ 2 5*2 52大小的矩阵,labels是 5 ∗ 1 5*1 51的矩阵,注意两个矩阵需要行数一致。

from_tensor_slices所做的,就是将特征矩阵中的每一行拿出来,维度为(2,),labels矩阵里的每一行拿出来,维度为(1,),这样就相当于做了一个"切片"。

3.make_one_shot_iterator

import tensorflow as tf
import numpy as np


def t1():
    features = np.random.normal(0.0, 1.0, size=(5, 2))
    labels = np.random.normal(0.0, 1.0, (5, 1))

    data = tf.data.Dataset.from_tensor_slices((features, labels))

    data = data.make_one_shot_iterator().get_next()
    # data = data.shuffle(100).batch(2).make_one_shot_iterator().get_next()

    with tf.Session() as sess:
        try:
            while True:
                print(sess.run(data))
        except tf.errors.OutOfRangeError:
            print("out of range!")

t1()

最终输出为

(array([-0.7805815 ,  0.26261423]), array([-1.08216157]))
(array([ 0.28119871, -1.26563717]), array([0.07952392]))
(array([-1.82131283, -1.75011567]), array([0.29634039]))
(array([-1.41344481,  0.39402909]), array([1.53077699]))
(array([ 3.88245974, -0.65329503]), array([-0.57519203]))
out of range!

4.shuffle repeat batch

实际开发过程中,经常使用的一种方式为

import tensorflow as tf
import numpy as np


def t1():
    features = np.random.normal(0.0, 1.0, size=(5, 2))
    labels = np.random.normal(0.0, 1.0, (5, 1))

    data = tf.data.Dataset.from_tensor_slices((features, labels))

    data = data.shuffle(100).batch(2).make_one_shot_iterator().get_next()

    with tf.Session() as sess:
        try:
            while True:
                print(sess.run(data))
        except tf.errors.OutOfRangeError:
            print("out of range!")

t1()

最终输出为

(array([[ 0.19499576, -0.11807744],
       [ 1.0751453 ,  1.33679166]]), array([[-0.08767326],
       [ 0.34821432]]))
(array([[ 0.0240161 , -1.50674333],
       [ 0.03043996, -0.5588178 ]]), array([[0.98569578],
       [0.69333419]]))
(array([[-0.15767341,  0.63513155]]), array([[-0.64394318]]))
out of range!

shuffle的作用是将数据打散
repeat是将数据重复多次。因为在模型训练过程中,肯定不止一个epoch,使用repeat的话就可以达到多个epoch的目的。
batch是每次取多条数据,每次训练的时候用一个batch的数据去训练。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值