tensorflow读取图片

概述

本文讲解使用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


原文出处:/show_1EF4Wk6S9pDC.html