机器学习:【10】tf.data模块实践

简单基础

每个元素包含一个或多个Tensor对象。例如,在图片管道中。一个元素可能是单个训练样本,具有一对表示图片数据和标签的张量。

一个Dataset对象包含多个元素,每个元素包含一个或多个Tensor对象,这些对象被称为组件。

Dataset的属性由构成该Dataset的元素的属性映射得到,元素可以是单个张量、张量元组,也可以是张量的嵌套元组。

创建tf.data.Dataset

  1. 直接从Tensor创建Dataset( 例如:Data.from_tensor_slices() )

  2. 对一个或多个tf.data.Dataset进行创建

#本代码基于tensorflow2.0
#用来建立dataset

import tensorflow as tf

dataset = tf.data.Dataset.from_tensor_slices([1, 2, 3, 4, 5, 6, 7]) 
#转化为tf.dataDataset类型
#这个函数要求每一个组件的结构都是相同的

dataset

for ele in dataset: #会变成tf.Tensor数据类型
    print(ele)
    print(ele.numpy()) #转化成tf.numpy()类型 

dataset_dic = tf.data.Dataset.from_tensor_slices({'a':[1,2,3,4],
                                                 'b':[6,7,8,9],
                                                 'c':[12,13,14,15]}
)

for ele in dataset_dic:
    print(ele)
#会可发现为四个元素,每个都是三种字典都包括的 

#利用numpy来实现的效果是完全一样的
import numpy as np

dataset = tf.data.Dataset.from_tensor_slices(np.array([1, 2, 3, 4, 5, 6, 7]))

for ele in dataset:
    print(ele)
    print(ele.numpy) #输出具体数值

#可以用for进行迭代
for ele in dataset.take(4): #输出前四个
    print(ele.numpy)

next(iter(dataset.take(1))) #不太明白,等下问下百度

 dataset对数据变化

epoch:对全部的数据进行一次训练,如果是乱序输入的,就会更有效训练网络(几乎是必须的)

  • suffle将数据进行乱序
dataset = dataset.shuffle(7) #参数是元素的数量,乱序一次,一般为全部数据

dataset = dataset.repeat(3) #参数可设置重复次数,否则为无限

for ele in dataset:
    print(ele.numpy())
  • batch调节训练批次的大小
dataset = dataset.batch() #参数为训练批次的大小
  •  应用函数对数据进行变换
#即为应用一个方法对数据做变换
dataset = dataset.map(tf.square) #可以调用一个函数

for ele in dataset:
    print(ele.numpy())

#后续会细说map的

在fashion_mnisit上的应用

#本代码基于tensorflow2.0

import tensorflow as tf

(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist

train_images = train_images/255
test_images = test_images/255

ds_train_img = tf.data.Dataset.from_tensor_slices(train_images) #创建dataset
ds_train_lab = tf.data.Dataset.from_tensor_slices(train_labels) #uint8 无符号整形

ds_train = tf.data.Dataset.zip((ds_train_img,ds_train_lab)) #用来将两个合并在一起,元组形式
#合并后便于进行变换

ds_train = ds_train.shuffle(10000).repeat().batch(64) #取10000个进行乱序,每次输出64个图片及对应label

model = tf.keras.Sequential([
    tf.keras.layers.Flatten(input_shape=(28,28)),
    tf.keras.layers.Dense(128,activation='relu'),
    tf.keras.layers.Dense(10,activation='softmax')
])

model.compile(optimizer = 'adam',
        loss = 'sparse_categorical_crossentropy',
        metrics = ['accuracy']
)

steps_per_epochs = train_images.shape[0]//64 #用第一维60000除以64,必须是个整数的

model.fit(ds_train, epochs = 5, steps_per_epoch = steps_per_epochs) 
#直接代入train数据就可以训练

-----------------------------------------------------------------------------------
#下面创建test数据的dataset
ds_test_img = tf.data.Dataset.from_tensor_slices(test_images) #创建dataset
ds_test_lab = tf.data.Dataset.from_tensor_slices(test_labels) #uint8 无符号整形
ds_test = tf.data.Dataset.zip((ds_test_img, ds_test_lab))

#也可以一句话创建
#ds_test_lab = tf.data.Dataset.from_tensor_slices((test_images, test_labels))

#test数据没必要进行suffle,并没有意义,但是需要batch
ds_test = ds_test.batch(64)

model.fit(ds_train,
          epochs = 5, 
          steps_per_epoch = steps_per_epochs, 
          validation_data = ds_test,
          validation_steps = 10000//64 #需要给出次数
) #用测试集进行检测

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex-YiWang

不要打赏,想要一个赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值