概述
本文讲解使用tensorflow的tf.data.Dataset读取某路径下的图片
导入模块
import os.path
import matplotlib.pyplot as plt
import tensorflow as tf
import glob
获取该路径下的所有图片路径
使用 glob 库
path=r"C:\Users\mym\Desktop\数据集\2_class\*\*.jpg"
imgs_path=glob.glob(path)
print(imgs_path)
图片数量
img_count=len(imgs_path)
img_count
根据图片名称获取类别
imgs_label=[]
imgname_map={"lake":1,"airplane":0}
for item in imgs_path:
imgname=os.path.basename(item)
imgnametemp=imgname[:imgname.find("_")]
# print(imgnametemp)
imgs_label.append(imgname_map[imgnametemp])
print(imgs_path)
生成dataset
ds=tf.data.Dataset.from_tensor_slices((imgs_path,imgs_label))
ds
查看
for img,label in ds.take(10):
print(img,"---",label)
打乱顺序
ds3=ds2.shuffle(buffer_size=img_count)
定义读取图片函数
# 将上面的操作封装成函数
def _parse(path,label):
img_tensor0=tf.io.read_file(path)
img0=tf.io.decode_jpeg(img_tensor0,channels=3)
print("----------",img0.shape)
img0=tf.image.resize(img0,(256,256))
print("----------",img0.shape)
img0_1=img0/255
print("----------",img0_1.shape)
return img0_1,label
ds2=ds.map(_parse,num_parallel_calls=tf.data.experimental.AUTOTUNE)
查看
for img,label in ds2.take(10):
# print(img,"---",label)
plt.imshow(img)
plt.show()
print(int(label))
定义 训练集 和 测试集
# 训练集数量
train_count=int(img_count*0.7)
# 测试集数量
test_count=img_count-train_count
train_count,test_count
train_data=ds3.take(train_count)
test_data=ds3.skip(train_count)
关键处理
BATCH_SIZE=32
# prefetch() 一般作为最后一个转换
train_data2=train_data.shuffle(buffer_size=train_count).batch(BATCH_SIZE).prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
test_data2=test_data.batch(BATCH_SIZE)
关键处理(无限循环数据)
关键代码:.repeat(train_count)
BATCH_SIZE=32
# prefetch() 一般作为最后一个转换
train_data2=train_data.shuffle(buffer_size=train_count).repeat(train_count).batch(BATCH_SIZE).prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
test_data2=test_data.batch(BATCH_SIZE)
注意
由于 Dataset 无限循环数据,所以模型调用fit()方法训练时,必须设置参数steps_per_epoch
例如:Dataset有100张图片,通过dataset.batch(50)设置批次大小为50,则steps_per_epoch值为2
如果有验证集,必须设置参数validation_steps。验证集样本数/batch样本数
详细参见:tf.keras.Sequential
例子
model.compile(optimizer="adam",loss="binary_crossentropy",metrics=["acc"])
steps_per_epoch=train_count//BATCH_SIZE
validation_steps=test_count//BATCH_SIZE
history=model.fit(train_data2,epochs=15,steps_per_epoch=steps_per_epoch,validation_data=test_data2,validation_steps=validation_steps)
感谢:
https://www.tensorflow.org/tutorials/load_data/images
https://www.tensorflow.org/guide/data_performance