系统
ubuntu 20.04

IDE
pycharm(社区版)
ps:建议专业版,真能避免许多麻烦

代码

import tensorflow as tf
import matplotlib.pyplot as plt
import pathlib
import random

#提取所有文件路径
data_dir = '/...../test'
data_root = pathlib.Path(data_dir)
all_image_path = list(data_root.glob('*/*'))
all_image_path = [str(path) for path in all_image_path]
#乱序
random.shuffle(all_image_path)
#记录总数,以备后用
image_count = len(all_image_path)

#编码标签
#Cat 0  Dog 1
label_names = sorted(item.name for item in data_root.glob('*/'))
label_to_index = dict((name,index) for index,name in enumerate(label_names))

#给图片贴标签
#pathlib.Path('..../2.jpg').parent.name   返回上一级目录名称
all_image_label = [label_to_index[pathlib.Path(p).parent.name] for p in all_image_path]

#图片预处理函数
def load_preprosess_image(image_path,image_label):
    #读取图片
    img_raw = tf.io.read_file(image_path)
    #解码图片
    img_tensor = tf.image.decode_jpeg(img_raw,channels=3)
    #统一图片大小
    img_tensor = tf.image.resize(img_tensor,[256,256])
    #转换数据类型
    img_tensor = tf.cast(img_tensor, tf.float32)
    #归一化
    img = img_tensor/255
    #将总标签列表中每个标签各自成列表
    label = tf.reshape(image_label,[1])
    return img,label

# 创建数据集
path_ds = tf.data.Dataset.from_tensor_slices((all_image_path,all_image_label))
dataset = path_ds.map(load_preprosess_image)


#划分训练集和测试集
#测试个数取整
test_count = int(image_count*0.2)
#训练个数
train_count = image_count - test_count
#训练数据集
train_dataset = dataset.skip(test_count)
#测试数据集
test_dataset = dataset.take(test_count)
#电脑性能好的话batch值可以大点
batch_size = 16
#训练数据集重复,乱序,规定batch值
train_dataset = train_dataset.repeat().shuffle(buffer_size=train_count).batch(batch_size)
#测试数据集不用过多处理
test_dataset = test_dataset.batch(batch_size)


#建立模型
#引用预训练网络(多次测试,发现自己写的模型准确率不是很高,用现成的不仅不用自己写那么多神经层,而且也不用自己一次次优化,真香)
covn_base = tf.keras.applications.VGG16(weights='imagenet',include_top=False)
model = tf.keras.Sequential()
model.add(covn_base)
#全局平均值化 降维
model.add(tf.keras.layers.GlobalAveragePooling2D())
model.add(tf.keras.layers.Dense(512,activation='relu'))
model.add(tf.keras.layers.Dense(1,activation='sigmoid'))

#训练模型
#预训练网络权重不被训练
covn_base.trainable = False
#没自定义训练,均默认
#配置优化器,损失函数,显示准确率
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_dataset,epochs=10,steps_per_epoch=steps_per_epoch,validation_data=test_dataset,validation_steps=validation_steps)

#调用参数,绘制图型
plt.subplot(211)
plt.plot(history.epoch,history.history['acc'])
plt.plot(history.epoch,history.history['val_acc'])
plt.subplot(212)
plt.plot(history.epoch,history.history.get('loss'))
plt.plot(history.epoch,history.history.get('val_loss'))
plt.show()

#测试准确率高的话,保存一下,以备后有
model.save('destinguish_Cat_Ddo.h5')

运行结果
在这里插入图片描述
在这里插入图片描述