第九周 tensorflow实现猫狗识别2

本文介绍了使用TensorFlow进行猫狗图像分类的实践过程,包括数据预处理、数据增强、构建卷积神经网络(CNN)、模型训练以及使用tqdm实现进度条可视化。通过8周的学习,优化了模型,提高了识别准确率。
摘要由CSDN通过智能技术生成

一、本周学习内容:

1、找到第八周的问题

第8周的问题处在训练集和测试集数据的历史损失和准确率,因为是每一个batch输出一次history而不是epoch输出一次,因此我们在最终输出时对一个epoch中的batch取平均值

2、数据增强

from tensorflow.keras.preprocessing.image import ImageDataGenerator
ImageDataGenerator(
rescale=所有数据集将乘以该数值,
rotation_range=随即旋转角度数范围,
width_shift_range=随即宽度偏移量,
height_shift_range=随即高度偏移量,
horizontal_flip=是否随机水平翻转,
zoom_range=随机缩放的范围 -> [1-n,1+n]

参考这个大佬的链接

3、了解tqdm,并使用tqdm实现可视化进度条

tqdm是 Python 进度条库,可以在 Python长循环中添加一个进度提示信息。用户只需要封装任意的迭代器,是一个快速、扩展性强的进度条工具库。
这篇文章介绍tqdm的使用

二、前言

我们的数据图片共有3400张,两个类别,类别即为文件夹名。
类别包括:[‘cat’, ‘dog’]

三、电脑环境

电脑系统:Windows 10
语言环境:Python 3.8.8
编译器:Pycharm 2021.1.3
深度学习环境:TensorFlow 2.8.0,keras 2.8.0
显卡及显存:RTX 3070 8G

四、前期准备

1、导入相关依赖项

from keras.models import Sequential
from keras.layers import *
from tensorflow import keras
from keras.callbacks import ModelCheckpoint
import tensorflow as tf
import matplotlib.pyplot as plt

2、设置GPU(我下载的tensorflow-gpu 默认使用GPU)

只使用GPU

if gpus:
    gpu0 = gpus[0]                                        #如果有多个GPU,仅使用第0个GPU
    tf.config.experimental.set_memory_growth(gpu0, True)  #设置GPU显存用量按需使用
    tf.config.set_visible_devices([gpu0],"GPU")

使用cpu和gpu
os.environ[“CUDA_VISIBLE_DEVICES”] = “-1”

3、加载数据集和展示

(1)、数据预处理

# 创建数据增强器
train_datagen=ImageDataGenerator(
    rescale=1. / 255,
    rotation_range=45,
    width_shift_range=.15,
    height_shift_range=.15,
    horizontal_flip=False,
    zoom_range=0.5
)
val_datagen=ImageDataGenerator(
    rescale=1. / 255,
    rotation_range=45,
    width_shift_range=.15,
    height_shift_range=.15,
    horizontal_flip=False,
    zoom_range=0.5
)
# 加载数据
train_ds=train_datagen.flow_from_directory(
    data_dir,
    target_size=(224,224),
    batch_size=10,  #迭代一次数据大小
    class_mode='categorical'#如果One-hot就是categorical,二分类用binary
)

val_ds=val_datagen.flow_from_directory(
    data_dir,
    target_size=(224,224),
    batch_size=20,
    class_mode='categorical'
)
# 获取标签
class_names = list(train_generator.class_indices.keys())

print(class_names)

(2)、数据展示

图片展示

# 图片展示
for images, labels in train_ds:
    for i in range(10):
        ax = plt.subplot(5, 10, i + 1)
        plt.imshow(images[i])
        print(labels)
        print(len(images))
        plt.title(class_names[np.argmax(labels[i])])
        plt.axis("off")
        break
    break

plt.show()  #使用pycharm的需要加入这行代码才能将图像显示出来

在这里插入图片描述

五、搭建CNN网络

def vgg_net(num_layer,filter):
    blk = Sequential()
    for _ in range(num_layer):
        blk.add(Conv2D(filters=filter,kernel_size=3,padding='same',activation='relu'))
    blk.add(MaxPool2D(pool_size=(2,2),strides=2))
    return blk

conv_arch = [(2,64),(2,128),(3,256),(3,512),(3,512)]
# model = Sequential([Conv2D(filters=64,kernel_size=3,padding='same',activation='relu',input_shape=(224,224,1))])
model = Sequential()
for num_layer,filter in conv_arch:
    model.add(vgg_net(num_layer,filter))
# print(model.summary())
model.add(Sequential([
    Flatten(),
    Dense(4096,activation='relu'),
    Dropout(0.5),
    Dense(4096,activation='relu'),
    Dropout(0.5),
    Dense(len(class_names),activation='softmax')
]))

x = tf.random.uniform((1,224,224,3))
y = model(x)


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


from tqdm import tqdm
import tensorflow.keras.backend as K

epochs = 10
lr = 1e-4

# 记录训练数据,方便后面的分析
history_train_loss = []
history_train_accuracy = []
history_val_loss = []
history_val_accuracy = []

for epoch in range(epochs):
    train_total = len(train_ds)
    val_total = len(val_ds)

    """
    total:预期的迭代数目
    ncols:控制进度条宽度
    mininterval:进度更新最小间隔,以秒为单位(默认值:0.1)
    """
    with tqdm(total=train_total, desc=f'Epoch {epoch + 1}/{epochs}', mininterval=1, ncols=100) as pbar:

        lr = lr * 0.92
        K.set_value(model.optimizer.lr, lr)
        train_loss = []
        train_accuracy = []
        for image, label in train_ds:
            """
            训练模型,简单理解train_on_batch就是:它是比model.fit()更高级的一个用法
            想详细了解 train_on_batch 的同学,
            可以看看这篇文章:https://www.yuque.com/mingtian-fkmxf/hv4lcq/ztt4gy
            """
            history = model.train_on_batch(image, label)

            train_loss.append(history[0])
            train_accuracy.append(history[1])

            pbar.set_postfix({"loss": "%.4f" % history[0],
                              "accuracy": "%.4f" % history[1],
                              "lr": K.get_value(model.optimizer.lr)})
            pbar.update(1)
        history_train_loss.append(np.mean(train_loss))
        history_train_accuracy.append(np.mean(train_accuracy))
        print('开始验证!')

        with tqdm(total=val_total, desc=f'Epoch {epoch + 1}/{epochs}', mininterval=0.3, ncols=100) as pbar:
            val_loss=[]
            val_accuracy = []
            for image, label in val_ds:
                history = model.test_on_batch(image, label)

                val_loss.append(history[0])
                val_accuracy.append(history[1])

                pbar.set_postfix({"loss": "%.4f" % history[0],
                                  "accuracy": "%.4f" % history[1]})
                pbar.update(1)
            history_val_loss.append(np.mean(val_loss))
            history_val_accuracy.append(np.mean(val_accuracy))

        print('结束验证!')
        print("验证loss为:%.4f" % np.mean(val_loss))
        print("验证准确率为:%.4f" % np.mean(val_accuracy))
Epoch 1/10: 100%|██████████| 55/55 [00:55<00:00,  1.25it/s, loss=0.7950, accuracy=0.5200, lr=9.2e-5]
开始验证!
Epoch 1/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]
Epoch 1/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.6692, accuracy=0.5400]
Epoch 1/10:   7%|█▌                    | 1/14 [00:00<00:07,  1.67it/s, loss=0.6692, accuracy=0.5400]
Epoch 1/10:   7%|█▌                    | 1/14 [00:00<00:07,  1.67it/s, loss=0.6247, accuracy=0.6600]
Epoch 1/10:  14%|███▏                  | 2/14 [00:00<00:07,  1.67it/s, loss=0.6243, accuracy=0.6200]
Epoch 1/10:  21%|████▋                 | 3/14 [00:01<00:06,  1.67it/s, loss=0.5732, accuracy=0.7600]
Epoch 1/10:  29%|██████▎               | 4/14 [00:01<00:02,  4.38it/s, loss=0.5732, accuracy=0.7600]
Epoch 1/10:  29%|██████▎               | 4/14 [00:01<00:02,  4.38it/s, loss=0.5970, accuracy=0.6600]
Epoch 1/10:  36%|███████▊              | 5/14 [00:01<00:02,  4.38it/s, loss=0.5614, accuracy=0.7400]
Epoch 1/10:  43%|█████████▍            | 6/14 [00:01<00:01,  4.38it/s, loss=0.5716, accuracy=0.6800]
Epoch 1/10:  50%|███████████           | 7/14 [00:01<00:01,  5.49it/s, loss=0.5716, accuracy=0.6800]
Epoch 1/10:  50%|███████████           | 7/14 [00:01<00:01,  5.49it/s, loss=0.5993, accuracy=0.7200]
Epoch 1/10:  57%|████████████▌         | 8/14 [00:01<00:01,  5.49it/s, loss=0.5803, accuracy=0.7400]
Epoch 1/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  5.49it/s, loss=0.4826, accuracy=0.8600]
Epoch 1/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.02it/s, loss=0.4826, accuracy=0.8600]
Epoch 1/10:  71%|███████████████      | 10/14 [00:02<00:00,  6.02it/s, loss=0.6271, accuracy=0.5800]
Epoch 1/10:  79%|████████████████▌    | 11/14 [00:02<00:00,  6.02it/s, loss=0.5784, accuracy=0.6600]
Epoch 1/10:  86%|██████████████████   | 12/14 [00:02<00:00,  6.02it/s, loss=0.6444, accuracy=0.6800]
Epoch 1/10:  93%|███████████████████▌ | 13/14 [00:02<00:00,  6.34it/s, loss=0.6444, accuracy=0.6800]
Epoch 1/10: 100%|█████████████████████| 14/14 [00:05<00:00,  2.55it/s, loss=0.6598, accuracy=0.6000]
Epoch 1/10: 100%|██████████| 55/55 [01:01<00:00,  1.11s/it, loss=0.7950, accuracy=0.5200, lr=9.2e-5]
Epoch 2/10:   0%|                                                            | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.5995
验证准确率为:0.6786
Epoch 2/10:  98%|████████▊| 54/55 [00:26<00:00,  2.05it/s, loss=0.3791, accuracy=0.9000, lr=8.46e-5]
开始验证!
Epoch 2/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]
Epoch 2/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.2396, accuracy=0.9200]
Epoch 2/10:   7%|█▌                    | 1/14 [00:00<00:03,  3.43it/s, loss=0.2423, accuracy=0.9200]
Epoch 2/10:  14%|███▏                  | 2/14 [00:00<00:02,  4.57it/s, loss=0.2737, accuracy=0.8800]
Epoch 2/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.85it/s, loss=0.2737, accuracy=0.8800]
Epoch 2/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.85it/s, loss=0.1539, accuracy=0.9000]
Epoch 2/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.85it/s, loss=0.2980, accuracy=0.9200]
Epoch 2/10:  36%|███████▊              | 5/14 [00:00<00:01,  6.85it/s, loss=0.1904, accuracy=0.9200]
Epoch 2/10:  43%|█████████▍            | 6/14 [00:00<00:01,  6.86it/s, loss=0.1904, accuracy=0.9200]
Epoch 2/10:  43%|█████████▍            | 6/14 [00:01<00:01,  6.86it/s, loss=0.1032, accuracy=0.9600]
Epoch 2/10:  50%|███████████           | 7/14 [00:01<00:01,  6.86it/s, loss=0.1594, accuracy=0.9400]
Epoch 2/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.86it/s, loss=0.2330, accuracy=0.9600]
Epoch 2/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.90it/s, loss=0.2330, accuracy=0.9600]
Epoch 2/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.90it/s, loss=0.1394, accuracy=0.9800]
Epoch 2/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.90it/s, loss=0.2391, accuracy=0.8800]
Epoch 2/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.90it/s, loss=0.2008, accuracy=0.9000]
Epoch 2/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.94it/s, loss=0.2008, accuracy=0.9000]
Epoch 2/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.94it/s, loss=0.3320, accuracy=0.8600]
Epoch 2/10: 100%|█████████████████████| 14/14 [00:01<00:00,  7.12it/s, loss=0.1901, accuracy=0.9000]
Epoch 2/10: 100%|█████████| 55/55 [00:28<00:00,  1.94it/s, loss=0.3791, accuracy=0.9000, lr=8.46e-5]
Epoch 3/10:   0%|                                                            | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.2139
验证准确率为:0.9171
Epoch 3/10:  98%|████████▊| 54/55 [00:26<00:00,  2.04it/s, loss=0.0466, accuracy=0.9800, lr=7.79e-5]
Epoch 3/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]开始验证!

Epoch 3/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.1344, accuracy=0.9000]
Epoch 3/10:   7%|█▌                    | 1/14 [00:00<00:03,  3.42it/s, loss=0.1919, accuracy=0.9200]
Epoch 3/10:  14%|███▏                  | 2/14 [00:00<00:02,  4.59it/s, loss=0.2520, accuracy=0.9200]
Epoch 3/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.87it/s, loss=0.2520, accuracy=0.9200]
Epoch 3/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.87it/s, loss=0.0580, accuracy=1.0000]
Epoch 3/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.87it/s, loss=0.0744, accuracy=0.9600]
Epoch 3/10:  36%|███████▊              | 5/14 [00:00<00:01,  6.87it/s, loss=0.1914, accuracy=0.9200]
Epoch 3/10:  43%|█████████▍            | 6/14 [00:00<00:01,  6.81it/s, loss=0.1914, accuracy=0.9200]
Epoch 3/10:  43%|█████████▍            | 6/14 [00:01<00:01,  6.81it/s, loss=0.0322, accuracy=1.0000]
Epoch 3/10:  50%|███████████           | 7/14 [00:01<00:01,  6.81it/s, loss=0.0940, accuracy=0.9800]
Epoch 3/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.81it/s, loss=0.1493, accuracy=0.9400]
Epoch 3/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.87it/s, loss=0.1493, accuracy=0.9400]
Epoch 3/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.87it/s, loss=0.0906, accuracy=0.9600]
Epoch 3/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.87it/s, loss=0.2302, accuracy=0.9000]
Epoch 3/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.87it/s, loss=0.1218, accuracy=0.9600]
Epoch 3/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.90it/s, loss=0.1218, accuracy=0.9600]
Epoch 3/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.90it/s, loss=0.2033, accuracy=0.9200]
Epoch 3/10: 100%|█████████████████████| 14/14 [00:01<00:00,  7.08it/s, loss=0.0882, accuracy=0.9333]
Epoch 3/10: 100%|█████████| 55/55 [00:28<00:00,  1.92it/s, loss=0.0466, accuracy=0.9800, lr=7.79e-5]
Epoch 4/10:   0%|                                                            | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.1365
验证准确率为:0.9438
Epoch 4/10: 100%|█████████| 55/55 [00:27<00:00,  1.95it/s, loss=0.1313, accuracy=0.9600, lr=7.16e-5]
Epoch 4/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]开始验证!

Epoch 4/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.1331, accuracy=0.9400]
Epoch 4/10:   7%|█▌                    | 1/14 [00:00<00:04,  3.05it/s, loss=0.0935, accuracy=0.9800]
Epoch 4/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.11it/s, loss=0.0935, accuracy=0.9800]
Epoch 4/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.11it/s, loss=0.2275, accuracy=0.9400]
Epoch 4/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.11it/s, loss=0.0317, accuracy=1.0000]
Epoch 4/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.12it/s, loss=0.0317, accuracy=1.0000]
Epoch 4/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.12it/s, loss=0.1114, accuracy=0.9600]
Epoch 4/10:  36%|███████▊              | 5/14 [00:00<00:01,  6.12it/s, loss=0.0937, accuracy=0.9400]
Epoch 4/10:  43%|█████████▍            | 6/14 [00:00<00:01,  6.26it/s, loss=0.0937, accuracy=0.9400]
Epoch 4/10:  43%|█████████▍            | 6/14 [00:01<00:01,  6.26it/s, loss=0.0238, accuracy=0.9800]
Epoch 4/10:  50%|███████████           | 7/14 [00:01<00:01,  6.26it/s, loss=0.0896, accuracy=0.9800]
Epoch 4/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.41it/s, loss=0.0896, accuracy=0.9800]
Epoch 4/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.41it/s, loss=0.1320, accuracy=0.9600]
Epoch 4/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.41it/s, loss=0.0116, accuracy=1.0000]
Epoch 4/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.41it/s, loss=0.1019, accuracy=0.9200]
Epoch 4/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.57it/s, loss=0.1019, accuracy=0.9200]
Epoch 4/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.57it/s, loss=0.1263, accuracy=0.9400]
Epoch 4/10:  86%|██████████████████   | 12/14 [00:02<00:00,  6.57it/s, loss=0.0810, accuracy=0.9200]
Epoch 4/10:  93%|███████████████████▌ | 13/14 [00:02<00:00,  6.57it/s, loss=0.0535, accuracy=0.9667]
Epoch 4/10: 100%|█████████████████████| 14/14 [00:02<00:00,  6.70it/s, loss=0.0535, accuracy=0.9667]
Epoch 4/10: 100%|█████████| 55/55 [00:29<00:00,  1.87it/s, loss=0.1313, accuracy=0.9600, lr=7.16e-5]
Epoch 5/10:   0%|                                                            | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.0936
验证准确率为:0.9590
Epoch 5/10:  98%|████████▊| 54/55 [00:27<00:00,  1.94it/s, loss=0.0284, accuracy=0.9800, lr=6.59e-5]
Epoch 5/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]开始验证!

Epoch 5/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.1285, accuracy=0.9400]
Epoch 5/10:   7%|█▌                    | 1/14 [00:00<00:04,  2.92it/s, loss=0.0995, accuracy=0.9800]
Epoch 5/10:  14%|███▏                  | 2/14 [00:00<00:02,  5.85it/s, loss=0.0995, accuracy=0.9800]
Epoch 5/10:  14%|███▏                  | 2/14 [00:00<00:02,  5.85it/s, loss=0.1170, accuracy=0.9800]
Epoch 5/10:  21%|████▋                 | 3/14 [00:00<00:01,  5.85it/s, loss=0.0193, accuracy=1.0000]
Epoch 5/10:  29%|██████▎               | 4/14 [00:00<00:01,  5.85it/s, loss=0.0193, accuracy=1.0000]
Epoch 5/10:  29%|██████▎               | 4/14 [00:00<00:01,  5.85it/s, loss=0.0619, accuracy=0.9800]
Epoch 5/10:  36%|███████▊              | 5/14 [00:01<00:01,  5.85it/s, loss=0.0564, accuracy=0.9800]
Epoch 5/10:  43%|█████████▍            | 6/14 [00:01<00:01,  5.87it/s, loss=0.0564, accuracy=0.9800]
Epoch 5/10:  43%|█████████▍            | 6/14 [00:01<00:01,  5.87it/s, loss=0.0180, accuracy=1.0000]
Epoch 5/10:  50%|███████████           | 7/14 [00:01<00:01,  5.87it/s, loss=0.0712, accuracy=0.9600]
Epoch 5/10:  57%|████████████▌         | 8/14 [00:01<00:01,  5.90it/s, loss=0.0712, accuracy=0.9600]
Epoch 5/10:  57%|████████████▌         | 8/14 [00:01<00:01,  5.90it/s, loss=0.1603, accuracy=0.9200]
Epoch 5/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  5.90it/s, loss=0.0212, accuracy=1.0000]
Epoch 5/10:  71%|███████████████      | 10/14 [00:01<00:00,  5.94it/s, loss=0.0212, accuracy=1.0000]
Epoch 5/10:  71%|███████████████      | 10/14 [00:01<00:00,  5.94it/s, loss=0.1483, accuracy=0.9600]
Epoch 5/10:  79%|████████████████▌    | 11/14 [00:02<00:00,  5.94it/s, loss=0.0767, accuracy=0.9800]
Epoch 5/10:  86%|██████████████████   | 12/14 [00:02<00:00,  6.02it/s, loss=0.0767, accuracy=0.9800]
Epoch 5/10:  86%|██████████████████   | 12/14 [00:02<00:00,  6.02it/s, loss=0.0880, accuracy=0.9600]
Epoch 5/10: 100%|█████████████████████| 14/14 [00:02<00:00,  6.17it/s, loss=0.0126, accuracy=1.0000]
Epoch 5/10: 100%|█████████| 55/55 [00:30<00:00,  1.83it/s, loss=0.0284, accuracy=0.9800, lr=6.59e-5]
Epoch 6/10:   0%|                                                            | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.0771
验证准确率为:0.9743
Epoch 6/10:  98%|████████▊| 54/55 [00:28<00:00,  1.92it/s, loss=0.0023, accuracy=1.0000, lr=6.06e-5]
Epoch 6/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]开始验证!

Epoch 6/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.1735, accuracy=0.9400]
Epoch 6/10:   7%|█▌                    | 1/14 [00:00<00:03,  3.28it/s, loss=0.0859, accuracy=0.9600]
Epoch 6/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.56it/s, loss=0.0859, accuracy=0.9600]
Epoch 6/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.56it/s, loss=0.1493, accuracy=0.9800]
Epoch 6/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.56it/s, loss=0.0028, accuracy=1.0000]
Epoch 6/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.56it/s, loss=0.0705, accuracy=0.9800]
Epoch 6/10:  36%|███████▊              | 5/14 [00:00<00:01,  6.69it/s, loss=0.0705, accuracy=0.9800]
Epoch 6/10:  36%|███████▊              | 5/14 [00:00<00:01,  6.69it/s, loss=0.0208, accuracy=1.0000]
Epoch 6/10:  43%|█████████▍            | 6/14 [00:01<00:01,  6.69it/s, loss=0.0109, accuracy=1.0000]
Epoch 6/10:  50%|███████████           | 7/14 [00:01<00:01,  6.69it/s, loss=0.0476, accuracy=0.9800]
Epoch 6/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.74it/s, loss=0.0476, accuracy=0.9800]
Epoch 6/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.74it/s, loss=0.2229, accuracy=0.9200]
Epoch 6/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.74it/s, loss=0.0016, accuracy=1.0000]
Epoch 6/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.74it/s, loss=0.0714, accuracy=0.9400]
Epoch 6/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.74it/s, loss=0.0714, accuracy=0.9400]
Epoch 6/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.74it/s, loss=0.0613, accuracy=0.9400]
Epoch 6/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.74it/s, loss=0.0545, accuracy=0.9800]
Epoch 6/10:  93%|███████████████████▌ | 13/14 [00:02<00:00,  6.74it/s, loss=0.0455, accuracy=0.9667]
Epoch 6/10: 100%|█████████████████████| 14/14 [00:02<00:00,  6.89it/s, loss=0.0455, accuracy=0.9667]
Epoch 6/10: 100%|█████████| 55/55 [00:30<00:00,  1.80it/s, loss=0.0023, accuracy=1.0000, lr=6.06e-5]
Epoch 7/10:   0%|                                                            | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.0727
验证准确率为:0.9705
Epoch 7/10:  98%|████████▊| 54/55 [00:28<00:00,  2.06it/s, loss=0.0925, accuracy=0.9800, lr=5.58e-5]
Epoch 7/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]开始验证!

Epoch 7/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.1217, accuracy=0.9600]
Epoch 7/10:   7%|█▌                    | 1/14 [00:00<00:03,  3.28it/s, loss=0.0499, accuracy=0.9800]
Epoch 7/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.54it/s, loss=0.0499, accuracy=0.9800]
Epoch 7/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.54it/s, loss=0.1077, accuracy=0.9800]
Epoch 7/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.54it/s, loss=0.0084, accuracy=1.0000]
Epoch 7/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.60it/s, loss=0.0084, accuracy=1.0000]
Epoch 7/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.60it/s, loss=0.0317, accuracy=0.9800]
Epoch 7/10:  36%|███████▊              | 5/14 [00:00<00:01,  6.60it/s, loss=0.0497, accuracy=0.9800]
Epoch 7/10:  43%|█████████▍            | 6/14 [00:00<00:01,  6.62it/s, loss=0.0497, accuracy=0.9800]
Epoch 7/10:  43%|█████████▍            | 6/14 [00:01<00:01,  6.62it/s, loss=0.0032, accuracy=1.0000]
Epoch 7/10:  50%|███████████           | 7/14 [00:01<00:01,  6.62it/s, loss=0.0116, accuracy=1.0000]
Epoch 7/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.62it/s, loss=0.1292, accuracy=0.9400]
Epoch 7/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.68it/s, loss=0.1292, accuracy=0.9400]
Epoch 7/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.68it/s, loss=0.0031, accuracy=1.0000]
Epoch 7/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.68it/s, loss=0.0670, accuracy=0.9800]
Epoch 7/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.68it/s, loss=0.0416, accuracy=0.9800]
Epoch 7/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.75it/s, loss=0.0416, accuracy=0.9800]
Epoch 7/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.75it/s, loss=0.0323, accuracy=0.9800]
Epoch 7/10: 100%|█████████████████████| 14/14 [00:02<00:00,  6.91it/s, loss=0.0175, accuracy=1.0000]
Epoch 7/10: 100%|█████████| 55/55 [00:30<00:00,  1.78it/s, loss=0.0925, accuracy=0.9800, lr=5.58e-5]
Epoch 8/10:   0%|                                                            | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.0482
验证准确率为:0.9829
Epoch 8/10:  98%|████████▊| 54/55 [00:28<00:00,  1.91it/s, loss=0.0016, accuracy=1.0000, lr=5.13e-5]
Epoch 8/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]开始验证!

Epoch 8/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.1328, accuracy=0.9600]
Epoch 8/10:   7%|█▌                    | 1/14 [00:00<00:03,  3.32it/s, loss=0.0430, accuracy=0.9600]
Epoch 8/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.62it/s, loss=0.0430, accuracy=0.9600]
Epoch 8/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.62it/s, loss=0.1390, accuracy=0.9800]
Epoch 8/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.62it/s, loss=0.0029, accuracy=1.0000]
Epoch 8/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.64it/s, loss=0.0029, accuracy=1.0000]
Epoch 8/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.64it/s, loss=0.0137, accuracy=1.0000]
Epoch 8/10:  36%|███████▊              | 5/14 [00:00<00:01,  6.64it/s, loss=0.0734, accuracy=0.9600]
Epoch 8/10:  43%|█████████▍            | 6/14 [00:01<00:01,  6.64it/s, loss=0.0021, accuracy=1.0000]
Epoch 8/10:  50%|███████████           | 7/14 [00:01<00:01,  6.65it/s, loss=0.0021, accuracy=1.0000]
Epoch 8/10:  50%|███████████           | 7/14 [00:01<00:01,  6.65it/s, loss=0.0032, accuracy=1.0000]
Epoch 8/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.65it/s, loss=0.2002, accuracy=0.9400]
Epoch 8/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.65it/s, loss=0.0039, accuracy=1.0000]
Epoch 8/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.65it/s, loss=0.0039, accuracy=1.0000]
Epoch 8/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.65it/s, loss=0.1951, accuracy=0.9400]
Epoch 8/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.65it/s, loss=0.1133, accuracy=0.9600]
Epoch 8/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.65it/s, loss=0.0187, accuracy=1.0000]
Epoch 8/10:  93%|███████████████████▌ | 13/14 [00:01<00:00,  6.69it/s, loss=0.0187, accuracy=1.0000]
Epoch 8/10: 100%|█████████████████████| 14/14 [00:02<00:00,  6.87it/s, loss=0.0072, accuracy=1.0000]
Epoch 8/10: 100%|█████████| 55/55 [00:30<00:00,  1.78it/s, loss=0.0016, accuracy=1.0000, lr=5.13e-5]
Epoch 9/10:   0%|                                                            | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.0677
验证准确率为:0.9786
Epoch 9/10: 100%|█████████| 55/55 [00:28<00:00,  1.88it/s, loss=0.1454, accuracy=0.9800, lr=4.72e-5]
开始验证!
Epoch 9/10:   0%|                                                            | 0/14 [00:00<?, ?it/s]
Epoch 9/10:   0%|                              | 0/14 [00:00<?, ?it/s, loss=0.0488, accuracy=0.9800]
Epoch 9/10:   7%|█▌                    | 1/14 [00:00<00:04,  3.21it/s, loss=0.0275, accuracy=0.9800]
Epoch 9/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.42it/s, loss=0.0275, accuracy=0.9800]
Epoch 9/10:  14%|███▏                  | 2/14 [00:00<00:01,  6.42it/s, loss=0.1349, accuracy=0.9800]
Epoch 9/10:  21%|████▋                 | 3/14 [00:00<00:01,  6.42it/s, loss=0.0158, accuracy=1.0000]
Epoch 9/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.45it/s, loss=0.0158, accuracy=1.0000]
Epoch 9/10:  29%|██████▎               | 4/14 [00:00<00:01,  6.45it/s, loss=0.0304, accuracy=0.9800]
Epoch 9/10:  36%|███████▊              | 5/14 [00:00<00:01,  6.45it/s, loss=0.0252, accuracy=1.0000]
Epoch 9/10:  43%|█████████▍            | 6/14 [00:00<00:01,  6.48it/s, loss=0.0252, accuracy=1.0000]
Epoch 9/10:  43%|█████████▍            | 6/14 [00:01<00:01,  6.48it/s, loss=0.0157, accuracy=0.9800]
Epoch 9/10:  50%|███████████           | 7/14 [00:01<00:01,  6.48it/s, loss=0.0130, accuracy=1.0000]
Epoch 9/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.50it/s, loss=0.0130, accuracy=1.0000]
Epoch 9/10:  57%|████████████▌         | 8/14 [00:01<00:00,  6.50it/s, loss=0.1652, accuracy=0.9400]
Epoch 9/10:  64%|██████████████▏       | 9/14 [00:01<00:00,  6.50it/s, loss=0.0035, accuracy=1.0000]
Epoch 9/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.53it/s, loss=0.0035, accuracy=1.0000]
Epoch 9/10:  71%|███████████████      | 10/14 [00:01<00:00,  6.53it/s, loss=0.0517, accuracy=0.9800]
Epoch 9/10:  79%|████████████████▌    | 11/14 [00:01<00:00,  6.53it/s, loss=0.0636, accuracy=0.9600]
Epoch 9/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.55it/s, loss=0.0636, accuracy=0.9600]
Epoch 9/10:  86%|██████████████████   | 12/14 [00:01<00:00,  6.55it/s, loss=0.0324, accuracy=0.9800]
Epoch 9/10: 100%|█████████████████████| 14/14 [00:02<00:00,  6.72it/s, loss=0.0075, accuracy=1.0000]
Epoch 9/10: 100%|█████████| 55/55 [00:30<00:00,  1.81it/s, loss=0.1454, accuracy=0.9800, lr=4.72e-5]
Epoch 10/10:   0%|                                                           | 0/55 [00:00<?, ?it/s]结束验证!
验证loss为:0.0454
验证准确率为:0.9829
Epoch 10/10: 100%|████████| 55/55 [00:28<00:00,  1.92it/s, loss=0.0038, accuracy=1.0000, lr=4.34e-5]
开始验证!
Epoch 10/10:   0%|                                                           | 0/14 [00:00<?, ?it/s]
Epoch 10/10:   0%|                             | 0/14 [00:00<?, ?it/s, loss=0.0362, accuracy=0.9800]
Epoch 10/10:   7%|█▌                   | 1/14 [00:00<00:03,  3.36it/s, loss=0.0047, accuracy=1.0000]
Epoch 10/10:  14%|███                  | 2/14 [00:00<00:02,  4.48it/s, loss=0.0704, accuracy=0.9800]
Epoch 10/10:  21%|████▌                | 3/14 [00:00<00:01,  6.72it/s, loss=0.0704, accuracy=0.9800]
Epoch 10/10:  21%|████▌                | 3/14 [00:00<00:01,  6.72it/s, loss=0.0008, accuracy=1.0000]
Epoch 10/10:  29%|██████               | 4/14 [00:00<00:01,  6.72it/s, loss=0.0132, accuracy=1.0000]
Epoch 10/10:  36%|███████▌             | 5/14 [00:00<00:01,  6.72it/s, loss=0.0076, accuracy=1.0000]
Epoch 10/10:  43%|█████████            | 6/14 [00:00<00:01,  6.75it/s, loss=0.0076, accuracy=1.0000]
Epoch 10/10:  43%|█████████            | 6/14 [00:01<00:01,  6.75it/s, loss=0.0011, accuracy=1.0000]
Epoch 10/10:  50%|██████████▌          | 7/14 [00:01<00:01,  6.75it/s, loss=0.0001, accuracy=1.0000]
Epoch 10/10:  57%|████████████         | 8/14 [00:01<00:00,  6.75it/s, loss=0.1884, accuracy=0.9400]
Epoch 10/10:  64%|█████████████▌       | 9/14 [00:01<00:00,  6.81it/s, loss=0.1884, accuracy=0.9400]
Epoch 10/10:  64%|█████████████▌       | 9/14 [00:01<00:00,  6.81it/s, loss=0.0014, accuracy=1.0000]
Epoch 10/10:  71%|██████████████▎     | 10/14 [00:01<00:00,  6.81it/s, loss=0.1360, accuracy=0.9600]
Epoch 10/10:  79%|███████████████▋    | 11/14 [00:01<00:00,  6.81it/s, loss=0.0768, accuracy=0.9600]
Epoch 10/10:  86%|█████████████████▏  | 12/14 [00:01<00:00,  6.85it/s, loss=0.0768, accuracy=0.9600]
Epoch 10/10:  86%|█████████████████▏  | 12/14 [00:01<00:00,  6.85it/s, loss=0.0009, accuracy=1.0000]
Epoch 10/10: 100%|████████████████████| 14/14 [00:01<00:00,  7.03it/s, loss=0.0004, accuracy=1.0000]
Epoch 10/10: 100%|████████| 55/55 [00:30<00:00,  1.82it/s, loss=0.0038, accuracy=1.0000, lr=4.34e-5]
结束验证!
验证loss为:0.0384
验证准确率为:0.9871

六、绘制损失函数图像和准确度图像

绘制代码与前几周相同

# 画准确度图
epochs_range = range(epochs)

plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)

plt.plot(epochs_range, history_train_accuracy, label='Training Accuracy')
plt.plot(epochs_range, history_val_accuracy, label='Validation Accuracy')
plt.legend(loc='lower right')
plt.title('Training and Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(epochs_range, history_train_loss, label='Training Loss')
plt.plot(epochs_range, history_val_loss, label='Validation Loss')
plt.legend(loc='upper right')
plt.title('Training and Validation Loss')
plt.show()

在这里插入图片描述

七、模型预测

plt.figure(figsize=(18,3))
plt.suptitle("预测结果展示")
for images,labels in val_ds:
    for i in range(8):
        ax = plt.subplot(1,8,i+1)
        # 显示图片
        plt.imshow(images[i].numpy())
        # 需要给图片增加一个维度
        img_array = tf.expand_dims(images[i],0)
        # 进行预测
        predictions = model.predict(img_array)
        plt.title(class_names[np.argmax(predictions)])
        plt.axis('off')
plt.show()

在这里插入图片描述

以上就是我本周的学习内容
在这里插入图片描述

以下是使用TensorFlow实现猫狗识别的代码示例: ```python import tensorflow as tf from tensorflow.keras.preprocessing.image import ImageDataGenerator # 定义训练集和验证集的路径 train_dir = '/path/to/train' validation_dir = '/path/to/validation' # 进行数据增强 train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=40, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest' ) test_datagen = ImageDataGenerator(rescale=1./255) # 定义训练集和验证集的生成器 train_generator = train_datagen.flow_from_directory( train_dir, target_size=(150, 150), batch_size=20, class_mode='binary' ) validation_generator = test_datagen.flow_from_directory( validation_dir, target_size=(150, 150), batch_size=20, class_mode='binary' ) # 构建模型 model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) # 编译模型 model.compile(loss='binary_crossentropy', optimizer=tf.keras.optimizers.RMSprop(lr=1e-4), metrics=['accuracy']) # 训练模型 history = model.fit( train_generator, steps_per_epoch=100, epochs=100, validation_data=validation_generator, validation_steps=50, verbose=2 ) ``` 在上述代码中,我们使用了TensorFlow的`ImageDataGenerator`来进行数据增强,从而提高模型的泛化能力。然后,我们定义了训练集和验证集的生成器,并使用这些生成器训练我们的模型。模型的结构为4个卷积层和2个全连接层,使用了ReLU作为激活函数,并在输出层使用了sigmoid函数作为二元分类器的激活函数。最后,我们使用了RMSprop优化器和二元交叉熵作为损失函数进行模型的编译和训练。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

降花绘

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值