简单基础
每个元素包含一个或多个Tensor对象。例如,在图片管道中。一个元素可能是单个训练样本,具有一对表示图片数据和标签的张量。
一个Dataset对象包含多个元素,每个元素包含一个或多个Tensor对象,这些对象被称为组件。
Dataset的属性由构成该Dataset的元素的属性映射得到,元素可以是单个张量、张量元组,也可以是张量的嵌套元组。
创建tf.data.Dataset
-
直接从Tensor创建Dataset( 例如:Data.from_tensor_slices() )
-
对一个或多个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 #需要给出次数
) #用测试集进行检测