• 卷积神经网络(ResNet-50)鸟类识别


    卷积神经网络(CNN)mnist手写数字分类识别的实现

    卷积神经网络(CNN)多种图片分类的实现

    卷积神经网络(CNN)衣服图像分类的实现

    卷积神经网络(CNN)鲜花的识别

    卷积神经网络(CNN)天气识别

    卷积神经网络(VGG-16)海贼王人物识别

    卷积神经网络(VGG-19)灵笼人物识别

    前期工作

    1. 设置GPU(如果使用的是CPU可以忽略这步)

    我的环境:

    • 语言环境:Python3.6.5
    • 编译器:jupyter notebook
    • 深度学习环境:TensorFlow2.4.1
    import tensorflow as tf
    
    gpus = tf.config.list_physical_devices("GPU")
    
    if gpus:
        tf.config.experimental.set_memory_growth(gpus[0], True)  #设置GPU显存用量按需使用
        tf.config.set_visible_devices([gpus[0]],"GPU")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2. 导入数据

    import matplotlib.pyplot as plt
    # 支持中文
    plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
    plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
    
    import os,PIL
    
    # 设置随机种子尽可能使结果可以重现
    import numpy as np
    np.random.seed(1)
    
    # 设置随机种子尽可能使结果可以重现
    import tensorflow as tf
    tf.random.set_seed(1)
    
    from tensorflow import keras
    from tensorflow.keras import layers,models
    
    import pathlib
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    data_dir = "weather_photos/"
    data_dir = pathlib.Path(data_dir)
    
    • 1
    • 2

    3. 查看数据

    image_count = len(list(data_dir.glob('*/*')))
    
    print("图片总数为:",image_count)
    
    • 1
    • 2
    • 3

    二、数据预处理

    文件夹数量
    Bananaquit166 张
    Black Throated Bushtiti111 张
    Black skimmer122 张
    Cockatoo166张

    1. 加载数据

    使用image_dataset_from_directory方法将磁盘中的数据加载到tf.data.Dataset

    batch_size = 32
    img_height = 224
    img_width = 224
    
    • 1
    • 2
    • 3
    train_ds = tf.keras.preprocessing.image_dataset_from_directory(
        data_dir,
        validation_split=0.2,
        subset="training",
        seed=123,
        image_size=(img_height, img_width),
        batch_size=batch_size)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    Found 565 files belonging to 4 classes.
    Using 452 files for training.
    
    • 1
    • 2
    val_ds = tf.keras.preprocessing.image_dataset_from_directory(
        data_dir,
        validation_split=0.2,
        subset="validation",
        seed=123,
        image_size=(img_height, img_width),
        batch_size=batch_size)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    Found 565 files belonging to 4 classes.
    Using 113 files for validation.
    
    • 1
    • 2

    我们可以通过class_names输出数据集的标签。标签将按字母顺序对应于目录名称。

    class_names = train_ds.class_names
    print(class_names)
    
    • 1
    • 2
    ['Bananaquit', 'Black Skimmer', 'Black Throated Bushtiti', 'Cockatoo']
    
    • 1

    2. 可视化数据

    plt.figure(figsize=(10, 5))  # 图形的宽为10高为5
    
    for images, labels in train_ds.take(1):
        for i in range(8):
            
            ax = plt.subplot(2, 4, i + 1)  
    
            plt.imshow(images[i].numpy().astype("uint8"))
            plt.title(class_names[labels[i]])
            
            plt.axis("off")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    在这里插入图片描述

    plt.imshow(images[1].numpy().astype("uint8"))
    
    • 1

    在这里插入图片描述

    3. 再次检查数据

    for image_batch, labels_batch in train_ds:
        print(image_batch.shape)
        print(labels_batch.shape)
        break
    
    • 1
    • 2
    • 3
    • 4
    (8, 224, 224, 3)
    (8,)
    
    • 1
    • 2
    • Image_batch是形状的张量(8, 224, 224, 3)。这是一批形状240x240x3的8张图片(最后一维指的是彩色通道RGB)。
    • Label_batch是形状(8,)的张量,这些标签对应8张图片

    4. 配置数据集

    AUTOTUNE = tf.data.AUTOTUNE
    
    train_ds = train_ds.cache().shuffle(1000).prefetch(buffer_size=AUTOTUNE)
    val_ds = val_ds.cache().prefetch(buffer_size=AUTOTUNE)
    
    • 1
    • 2
    • 3
    • 4

    三、残差网络(ResNet)介绍

    1. 残差网络解决了什么

    残差网络是为了解决神经网络隐藏层过多时,而引起的网络退化问题。退化(degradation)问题是指:当网络隐藏层变多时,网络的准确度达到饱和然后急剧退化,而且这个退化不是由于过拟合引起的。

    拓展: 深度神经网络的“两朵乌云”

    • 梯度弥散/爆炸

    简单来讲就是网络太深了,会导致模型训练难以收敛。这个问题可以被标准初始化和中间层正规化的方法有效控制。(现阶段知道这么一回事就好了)

    • 网络退化

    随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降,这个退化不是由于过拟合引起的。

    2. ResNet-50介绍

    ResNet-50有两个基本的块,分别名为Conv BlockIdentity Block

    在这里插入图片描述
    在这里插入图片描述

    四、构建ResNet-50网络模型

    下面是本文的重点,可以试着按照上面三张图自己构建一下ResNet-50

    from keras import layers
    
    from keras.layers import Input,Activation,BatchNormalization,Flatten
    from keras.layers import Dense,Conv2D,MaxPooling2D,ZeroPadding2D,AveragePooling2D
    from keras.models import Model
    
    def identity_block(input_tensor, kernel_size, filters, stage, block):
    
        filters1, filters2, filters3 = filters
    
        name_base = str(stage) + block + '_identity_block_'
    
        x = Conv2D(filters1, (1, 1), name=name_base + 'conv1')(input_tensor)
        x = BatchNormalization(name=name_base + 'bn1')(x)
        x = Activation('relu', name=name_base + 'relu1')(x)
    
        x = Conv2D(filters2, kernel_size,padding='same', name=name_base + 'conv2')(x)
        x = BatchNormalization(name=name_base + 'bn2')(x)
        x = Activation('relu', name=name_base + 'relu2')(x)
    
        x = Conv2D(filters3, (1, 1), name=name_base + 'conv3')(x)
        x = BatchNormalization(name=name_base + 'bn3')(x)
    
        x = layers.add([x, input_tensor] ,name=name_base + 'add')
        x = Activation('relu', name=name_base + 'relu4')(x)
        return x
    
    
    def conv_block(input_tensor, kernel_size, filters, stage, block, strides=(2, 2)):
    
        filters1, filters2, filters3 = filters
    
        res_name_base = str(stage) + block + '_conv_block_res_'
        name_base = str(stage) + block + '_conv_block_'
    
        x = Conv2D(filters1, (1, 1), strides=strides, name=name_base + 'conv1')(input_tensor)
        x = BatchNormalization(name=name_base + 'bn1')(x)
        x = Activation('relu', name=name_base + 'relu1')(x)
    
        x = Conv2D(filters2, kernel_size, padding='same', name=name_base + 'conv2')(x)
        x = BatchNormalization(name=name_base + 'bn2')(x)
        x = Activation('relu', name=name_base + 'relu2')(x)
    
        x = Conv2D(filters3, (1, 1), name=name_base + 'conv3')(x)
        x = BatchNormalization(name=name_base + 'bn3')(x)
    
        shortcut = Conv2D(filters3, (1, 1), strides=strides, name=res_name_base + 'conv')(input_tensor)
        shortcut = BatchNormalization(name=res_name_base + 'bn')(shortcut)
    
        x = layers.add([x, shortcut], name=name_base+'add')
        x = Activation('relu', name=name_base+'relu4')(x)
        return x
    
    def ResNet50(input_shape=[224,224,3],classes=1000):
    
        img_input = Input(shape=input_shape)
        x = ZeroPadding2D((3, 3))(img_input)
    
        x = Conv2D(64, (7, 7), strides=(2, 2), name='conv1')(x)
        x = BatchNormalization(name='bn_conv1')(x)
        x = Activation('relu')(x)
        x = MaxPooling2D((3, 3), strides=(2, 2))(x)
    
        x =     conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1))
        x = identity_block(x, 3, [64, 64, 256], stage=2, block='b')
        x = identity_block(x, 3, [64, 64, 256], stage=2, block='c')
    
        x =     conv_block(x, 3, [128, 128, 512], stage=3, block='a')
        x = identity_block(x, 3, [128, 128, 512], stage=3, block='b')
        x = identity_block(x, 3, [128, 128, 512], stage=3, block='c')
        x = identity_block(x, 3, [128, 128, 512], stage=3, block='d')
    
        x =     conv_block(x, 3, [256, 256, 1024], stage=4, block='a')
        x = identity_block(x, 3, [256, 256, 1024], stage=4, block='b')
        x = identity_block(x, 3, [256, 256, 1024], stage=4, block='c')
        x = identity_block(x, 3, [256, 256, 1024], stage=4, block='d')
        x = identity_block(x, 3, [256, 256, 1024], stage=4, block='e')
        x = identity_block(x, 3, [256, 256, 1024], stage=4, block='f')
    
        x =     conv_block(x, 3, [512, 512, 2048], stage=5, block='a')
        x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b')
        x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c')
    
        x = AveragePooling2D((7, 7), name='avg_pool')(x)
    
        x = Flatten()(x)
        x = Dense(classes, activation='softmax', name='fc1000')(x)
    
        model = Model(img_input, x, name='resnet50')
        
        # 加载预训练模型
        model.load_weights("resnet50_weights_tf_dim_ordering_tf_kernels.h5")
    
        return model
    
    model = ResNet50()
    model.summary()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    Model: "resnet50"
    __________________________________________________________________________________________________
    Layer (type)                    Output Shape         Param #     Connected to                     
    ==================================================================================================
    input_1 (InputLayer)            [(None, 224, 224, 3) 0                                            
    __________________________________________________________________________________________________
    zero_padding2d (ZeroPadding2D)  (None, 230, 230, 3)  0           input_1[0][0]                    
    __________________________________________________________________________________________________
    conv1 (Conv2D)                  (None, 112, 112, 64) 9472        zero_padding2d[0][0]             
    __________________________________________________________________________________________________
    bn_conv1 (BatchNormalization)   (None, 112, 112, 64) 256         conv1[0][0]                      
    __________________________________________________________________________________________________
    activation (Activation)         (None, 112, 112, 64) 0           bn_conv1[0][0]                   
    __________________________________________________________________________________________________
    max_pooling2d (MaxPooling2D)    (None, 55, 55, 64)   0           activation[0][0]                 
    __________________________________________________________________________________________________
    2a_conv_block_conv1 (Conv2D)    (None, 55, 55, 64)   4160        max_pooling2d[0][0]              
    __________________________________________________________________________________________________
    2a_conv_block_bn1 (BatchNormali (None, 55, 55, 64)   256         2a_conv_block_conv1[0][0]        
    __________________________________________________________________________________________________
    2a_conv_block_relu1 (Activation (None, 55, 55, 64)   0           2a_conv_block_bn1[0][0]          
    __________________________________________________________________________________________________
    2a_conv_block_conv2 (Conv2D)    (None, 55, 55, 64)   36928       2a_conv_block_relu1[0][0]        
    __________________________________________________________________________________________________
    2a_conv_block_bn2 (BatchNormali (None, 55, 55, 64)   256         2a_conv_block_conv2[0][0]        
    __________________________________________________________________________________________________
    2a_conv_block_relu2 (Activation (None, 55, 55, 64)   0           2a_conv_block_bn2[0][0]          
    __________________________________________________________________________________________________
    2a_conv_block_conv3 (Conv2D)    (None, 55, 55, 256)  16640       2a_conv_block_relu2[0][0]        
    __________________________________________________________________________________________________
    2a_conv_block_res_conv (Conv2D) (None, 55, 55, 256)  16640       max_pooling2d[0][0]              
    __________________________________________________________________________________________________
    2a_conv_block_bn3 (BatchNormali (None, 55, 55, 256)  1024        2a_conv_block_conv3[0][0]        
    __________________________________________________________________________________________________
    2a_conv_block_res_bn (BatchNorm (None, 55, 55, 256)  1024        2a_conv_block_res_conv[0][0]     
    __________________________________________________________________________________________________
    2a_conv_block_add (Add)         (None, 55, 55, 256)  0           2a_conv_block_bn3[0][0]          
                                                                     2a_conv_block_res_bn[0][0]       
    __________________________________________________________________________________________________
    2a_conv_block_relu4 (Activation (None, 55, 55, 256)  0           2a_conv_block_add[0][0]          
    __________________________________________________________________________________________________
    2b_identity_block_conv1 (Conv2D (None, 55, 55, 64)   16448       2a_conv_block_relu4[0][0]        
    __________________________________________________________________________________________________
    2b_identity_block_bn1 (BatchNor (None, 55, 55, 64)   256         2b_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    2b_identity_block_relu1 (Activa (None, 55, 55, 64)   0           2b_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    2b_identity_block_conv2 (Conv2D (None, 55, 55, 64)   36928       2b_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    2b_identity_block_bn2 (BatchNor (None, 55, 55, 64)   256         2b_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    2b_identity_block_relu2 (Activa (None, 55, 55, 64)   0           2b_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    2b_identity_block_conv3 (Conv2D (None, 55, 55, 256)  16640       2b_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    2b_identity_block_bn3 (BatchNor (None, 55, 55, 256)  1024        2b_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    2b_identity_block_add (Add)     (None, 55, 55, 256)  0           2b_identity_block_bn3[0][0]      
                                                                     2a_conv_block_relu4[0][0]        
    __________________________________________________________________________________________________
    2b_identity_block_relu4 (Activa (None, 55, 55, 256)  0           2b_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    2c_identity_block_conv1 (Conv2D (None, 55, 55, 64)   16448       2b_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    2c_identity_block_bn1 (BatchNor (None, 55, 55, 64)   256         2c_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    2c_identity_block_relu1 (Activa (None, 55, 55, 64)   0           2c_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    2c_identity_block_conv2 (Conv2D (None, 55, 55, 64)   36928       2c_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    2c_identity_block_bn2 (BatchNor (None, 55, 55, 64)   256         2c_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    2c_identity_block_relu2 (Activa (None, 55, 55, 64)   0           2c_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    2c_identity_block_conv3 (Conv2D (None, 55, 55, 256)  16640       2c_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    2c_identity_block_bn3 (BatchNor (None, 55, 55, 256)  1024        2c_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    2c_identity_block_add (Add)     (None, 55, 55, 256)  0           2c_identity_block_bn3[0][0]      
                                                                     2b_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    2c_identity_block_relu4 (Activa (None, 55, 55, 256)  0           2c_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    3a_conv_block_conv1 (Conv2D)    (None, 28, 28, 128)  32896       2c_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    3a_conv_block_bn1 (BatchNormali (None, 28, 28, 128)  512         3a_conv_block_conv1[0][0]        
    __________________________________________________________________________________________________
    3a_conv_block_relu1 (Activation (None, 28, 28, 128)  0           3a_conv_block_bn1[0][0]          
    __________________________________________________________________________________________________
    3a_conv_block_conv2 (Conv2D)    (None, 28, 28, 128)  147584      3a_conv_block_relu1[0][0]        
    __________________________________________________________________________________________________
    3a_conv_block_bn2 (BatchNormali (None, 28, 28, 128)  512         3a_conv_block_conv2[0][0]        
    __________________________________________________________________________________________________
    3a_conv_block_relu2 (Activation (None, 28, 28, 128)  0           3a_conv_block_bn2[0][0]          
    __________________________________________________________________________________________________
    3a_conv_block_conv3 (Conv2D)    (None, 28, 28, 512)  66048       3a_conv_block_relu2[0][0]        
    __________________________________________________________________________________________________
    3a_conv_block_res_conv (Conv2D) (None, 28, 28, 512)  131584      2c_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    3a_conv_block_bn3 (BatchNormali (None, 28, 28, 512)  2048        3a_conv_block_conv3[0][0]        
    __________________________________________________________________________________________________
    3a_conv_block_res_bn (BatchNorm (None, 28, 28, 512)  2048        3a_conv_block_res_conv[0][0]     
    __________________________________________________________________________________________________
    3a_conv_block_add (Add)         (None, 28, 28, 512)  0           3a_conv_block_bn3[0][0]          
                                                                     3a_conv_block_res_bn[0][0]       
    __________________________________________________________________________________________________
    3a_conv_block_relu4 (Activation (None, 28, 28, 512)  0           3a_conv_block_add[0][0]          
    __________________________________________________________________________________________________
    3b_identity_block_conv1 (Conv2D (None, 28, 28, 128)  65664       3a_conv_block_relu4[0][0]        
    __________________________________________________________________________________________________
    3b_identity_block_bn1 (BatchNor (None, 28, 28, 128)  512         3b_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    3b_identity_block_relu1 (Activa (None, 28, 28, 128)  0           3b_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    3b_identity_block_conv2 (Conv2D (None, 28, 28, 128)  147584      3b_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    3b_identity_block_bn2 (BatchNor (None, 28, 28, 128)  512         3b_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    3b_identity_block_relu2 (Activa (None, 28, 28, 128)  0           3b_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    3b_identity_block_conv3 (Conv2D (None, 28, 28, 512)  66048       3b_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    3b_identity_block_bn3 (BatchNor (None, 28, 28, 512)  2048        3b_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    3b_identity_block_add (Add)     (None, 28, 28, 512)  0           3b_identity_block_bn3[0][0]      
                                                                     3a_conv_block_relu4[0][0]        
    __________________________________________________________________________________________________
    3b_identity_block_relu4 (Activa (None, 28, 28, 512)  0           3b_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    3c_identity_block_conv1 (Conv2D (None, 28, 28, 128)  65664       3b_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    3c_identity_block_bn1 (BatchNor (None, 28, 28, 128)  512         3c_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    3c_identity_block_relu1 (Activa (None, 28, 28, 128)  0           3c_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    3c_identity_block_conv2 (Conv2D (None, 28, 28, 128)  147584      3c_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    3c_identity_block_bn2 (BatchNor (None, 28, 28, 128)  512         3c_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    3c_identity_block_relu2 (Activa (None, 28, 28, 128)  0           3c_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    3c_identity_block_conv3 (Conv2D (None, 28, 28, 512)  66048       3c_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    3c_identity_block_bn3 (BatchNor (None, 28, 28, 512)  2048        3c_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    3c_identity_block_add (Add)     (None, 28, 28, 512)  0           3c_identity_block_bn3[0][0]      
                                                                     3b_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    3c_identity_block_relu4 (Activa (None, 28, 28, 512)  0           3c_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    3d_identity_block_conv1 (Conv2D (None, 28, 28, 128)  65664       3c_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    3d_identity_block_bn1 (BatchNor (None, 28, 28, 128)  512         3d_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    3d_identity_block_relu1 (Activa (None, 28, 28, 128)  0           3d_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    3d_identity_block_conv2 (Conv2D (None, 28, 28, 128)  147584      3d_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    3d_identity_block_bn2 (BatchNor (None, 28, 28, 128)  512         3d_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    3d_identity_block_relu2 (Activa (None, 28, 28, 128)  0           3d_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    3d_identity_block_conv3 (Conv2D (None, 28, 28, 512)  66048       3d_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    3d_identity_block_bn3 (BatchNor (None, 28, 28, 512)  2048        3d_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    3d_identity_block_add (Add)     (None, 28, 28, 512)  0           3d_identity_block_bn3[0][0]      
                                                                     3c_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    3d_identity_block_relu4 (Activa (None, 28, 28, 512)  0           3d_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    4a_conv_block_conv1 (Conv2D)    (None, 14, 14, 256)  131328      3d_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4a_conv_block_bn1 (BatchNormali (None, 14, 14, 256)  1024        4a_conv_block_conv1[0][0]        
    __________________________________________________________________________________________________
    4a_conv_block_relu1 (Activation (None, 14, 14, 256)  0           4a_conv_block_bn1[0][0]          
    __________________________________________________________________________________________________
    4a_conv_block_conv2 (Conv2D)    (None, 14, 14, 256)  590080      4a_conv_block_relu1[0][0]        
    __________________________________________________________________________________________________
    4a_conv_block_bn2 (BatchNormali (None, 14, 14, 256)  1024        4a_conv_block_conv2[0][0]        
    __________________________________________________________________________________________________
    4a_conv_block_relu2 (Activation (None, 14, 14, 256)  0           4a_conv_block_bn2[0][0]          
    __________________________________________________________________________________________________
    4a_conv_block_conv3 (Conv2D)    (None, 14, 14, 1024) 263168      4a_conv_block_relu2[0][0]        
    __________________________________________________________________________________________________
    4a_conv_block_res_conv (Conv2D) (None, 14, 14, 1024) 525312      3d_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4a_conv_block_bn3 (BatchNormali (None, 14, 14, 1024) 4096        4a_conv_block_conv3[0][0]        
    __________________________________________________________________________________________________
    4a_conv_block_res_bn (BatchNorm (None, 14, 14, 1024) 4096        4a_conv_block_res_conv[0][0]     
    __________________________________________________________________________________________________
    4a_conv_block_add (Add)         (None, 14, 14, 1024) 0           4a_conv_block_bn3[0][0]          
                                                                     4a_conv_block_res_bn[0][0]       
    __________________________________________________________________________________________________
    4a_conv_block_relu4 (Activation (None, 14, 14, 1024) 0           4a_conv_block_add[0][0]          
    __________________________________________________________________________________________________
    4b_identity_block_conv1 (Conv2D (None, 14, 14, 256)  262400      4a_conv_block_relu4[0][0]        
    __________________________________________________________________________________________________
    4b_identity_block_bn1 (BatchNor (None, 14, 14, 256)  1024        4b_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    4b_identity_block_relu1 (Activa (None, 14, 14, 256)  0           4b_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    4b_identity_block_conv2 (Conv2D (None, 14, 14, 256)  590080      4b_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    4b_identity_block_bn2 (BatchNor (None, 14, 14, 256)  1024        4b_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    4b_identity_block_relu2 (Activa (None, 14, 14, 256)  0           4b_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    4b_identity_block_conv3 (Conv2D (None, 14, 14, 1024) 263168      4b_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    4b_identity_block_bn3 (BatchNor (None, 14, 14, 1024) 4096        4b_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    4b_identity_block_add (Add)     (None, 14, 14, 1024) 0           4b_identity_block_bn3[0][0]      
                                                                     4a_conv_block_relu4[0][0]        
    __________________________________________________________________________________________________
    4b_identity_block_relu4 (Activa (None, 14, 14, 1024) 0           4b_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    4c_identity_block_conv1 (Conv2D (None, 14, 14, 256)  262400      4b_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4c_identity_block_bn1 (BatchNor (None, 14, 14, 256)  1024        4c_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    4c_identity_block_relu1 (Activa (None, 14, 14, 256)  0           4c_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    4c_identity_block_conv2 (Conv2D (None, 14, 14, 256)  590080      4c_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    4c_identity_block_bn2 (BatchNor (None, 14, 14, 256)  1024        4c_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    4c_identity_block_relu2 (Activa (None, 14, 14, 256)  0           4c_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    4c_identity_block_conv3 (Conv2D (None, 14, 14, 1024) 263168      4c_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    4c_identity_block_bn3 (BatchNor (None, 14, 14, 1024) 4096        4c_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    4c_identity_block_add (Add)     (None, 14, 14, 1024) 0           4c_identity_block_bn3[0][0]      
                                                                     4b_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4c_identity_block_relu4 (Activa (None, 14, 14, 1024) 0           4c_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    4d_identity_block_conv1 (Conv2D (None, 14, 14, 256)  262400      4c_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4d_identity_block_bn1 (BatchNor (None, 14, 14, 256)  1024        4d_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    4d_identity_block_relu1 (Activa (None, 14, 14, 256)  0           4d_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    4d_identity_block_conv2 (Conv2D (None, 14, 14, 256)  590080      4d_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    4d_identity_block_bn2 (BatchNor (None, 14, 14, 256)  1024        4d_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    4d_identity_block_relu2 (Activa (None, 14, 14, 256)  0           4d_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    4d_identity_block_conv3 (Conv2D (None, 14, 14, 1024) 263168      4d_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    4d_identity_block_bn3 (BatchNor (None, 14, 14, 1024) 4096        4d_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    4d_identity_block_add (Add)     (None, 14, 14, 1024) 0           4d_identity_block_bn3[0][0]      
                                                                     4c_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4d_identity_block_relu4 (Activa (None, 14, 14, 1024) 0           4d_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    4e_identity_block_conv1 (Conv2D (None, 14, 14, 256)  262400      4d_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4e_identity_block_bn1 (BatchNor (None, 14, 14, 256)  1024        4e_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    4e_identity_block_relu1 (Activa (None, 14, 14, 256)  0           4e_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    4e_identity_block_conv2 (Conv2D (None, 14, 14, 256)  590080      4e_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    4e_identity_block_bn2 (BatchNor (None, 14, 14, 256)  1024        4e_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    4e_identity_block_relu2 (Activa (None, 14, 14, 256)  0           4e_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    4e_identity_block_conv3 (Conv2D (None, 14, 14, 1024) 263168      4e_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    4e_identity_block_bn3 (BatchNor (None, 14, 14, 1024) 4096        4e_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    4e_identity_block_add (Add)     (None, 14, 14, 1024) 0           4e_identity_block_bn3[0][0]      
                                                                     4d_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4e_identity_block_relu4 (Activa (None, 14, 14, 1024) 0           4e_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    4f_identity_block_conv1 (Conv2D (None, 14, 14, 256)  262400      4e_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4f_identity_block_bn1 (BatchNor (None, 14, 14, 256)  1024        4f_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    4f_identity_block_relu1 (Activa (None, 14, 14, 256)  0           4f_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    4f_identity_block_conv2 (Conv2D (None, 14, 14, 256)  590080      4f_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    4f_identity_block_bn2 (BatchNor (None, 14, 14, 256)  1024        4f_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    4f_identity_block_relu2 (Activa (None, 14, 14, 256)  0           4f_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    4f_identity_block_conv3 (Conv2D (None, 14, 14, 1024) 263168      4f_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    4f_identity_block_bn3 (BatchNor (None, 14, 14, 1024) 4096        4f_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    4f_identity_block_add (Add)     (None, 14, 14, 1024) 0           4f_identity_block_bn3[0][0]      
                                                                     4e_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    4f_identity_block_relu4 (Activa (None, 14, 14, 1024) 0           4f_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    5a_conv_block_conv1 (Conv2D)    (None, 7, 7, 512)    524800      4f_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    5a_conv_block_bn1 (BatchNormali (None, 7, 7, 512)    2048        5a_conv_block_conv1[0][0]        
    __________________________________________________________________________________________________
    5a_conv_block_relu1 (Activation (None, 7, 7, 512)    0           5a_conv_block_bn1[0][0]          
    __________________________________________________________________________________________________
    5a_conv_block_conv2 (Conv2D)    (None, 7, 7, 512)    2359808     5a_conv_block_relu1[0][0]        
    __________________________________________________________________________________________________
    5a_conv_block_bn2 (BatchNormali (None, 7, 7, 512)    2048        5a_conv_block_conv2[0][0]        
    __________________________________________________________________________________________________
    5a_conv_block_relu2 (Activation (None, 7, 7, 512)    0           5a_conv_block_bn2[0][0]          
    __________________________________________________________________________________________________
    5a_conv_block_conv3 (Conv2D)    (None, 7, 7, 2048)   1050624     5a_conv_block_relu2[0][0]        
    __________________________________________________________________________________________________
    5a_conv_block_res_conv (Conv2D) (None, 7, 7, 2048)   2099200     4f_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    5a_conv_block_bn3 (BatchNormali (None, 7, 7, 2048)   8192        5a_conv_block_conv3[0][0]        
    __________________________________________________________________________________________________
    5a_conv_block_res_bn (BatchNorm (None, 7, 7, 2048)   8192        5a_conv_block_res_conv[0][0]     
    __________________________________________________________________________________________________
    5a_conv_block_add (Add)         (None, 7, 7, 2048)   0           5a_conv_block_bn3[0][0]          
                                                                     5a_conv_block_res_bn[0][0]       
    __________________________________________________________________________________________________
    5a_conv_block_relu4 (Activation (None, 7, 7, 2048)   0           5a_conv_block_add[0][0]          
    __________________________________________________________________________________________________
    5b_identity_block_conv1 (Conv2D (None, 7, 7, 512)    1049088     5a_conv_block_relu4[0][0]        
    __________________________________________________________________________________________________
    5b_identity_block_bn1 (BatchNor (None, 7, 7, 512)    2048        5b_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    5b_identity_block_relu1 (Activa (None, 7, 7, 512)    0           5b_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    5b_identity_block_conv2 (Conv2D (None, 7, 7, 512)    2359808     5b_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    5b_identity_block_bn2 (BatchNor (None, 7, 7, 512)    2048        5b_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    5b_identity_block_relu2 (Activa (None, 7, 7, 512)    0           5b_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    5b_identity_block_conv3 (Conv2D (None, 7, 7, 2048)   1050624     5b_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    5b_identity_block_bn3 (BatchNor (None, 7, 7, 2048)   8192        5b_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    5b_identity_block_add (Add)     (None, 7, 7, 2048)   0           5b_identity_block_bn3[0][0]      
                                                                     5a_conv_block_relu4[0][0]        
    __________________________________________________________________________________________________
    5b_identity_block_relu4 (Activa (None, 7, 7, 2048)   0           5b_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    5c_identity_block_conv1 (Conv2D (None, 7, 7, 512)    1049088     5b_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    5c_identity_block_bn1 (BatchNor (None, 7, 7, 512)    2048        5c_identity_block_conv1[0][0]    
    __________________________________________________________________________________________________
    5c_identity_block_relu1 (Activa (None, 7, 7, 512)    0           5c_identity_block_bn1[0][0]      
    __________________________________________________________________________________________________
    5c_identity_block_conv2 (Conv2D (None, 7, 7, 512)    2359808     5c_identity_block_relu1[0][0]    
    __________________________________________________________________________________________________
    5c_identity_block_bn2 (BatchNor (None, 7, 7, 512)    2048        5c_identity_block_conv2[0][0]    
    __________________________________________________________________________________________________
    5c_identity_block_relu2 (Activa (None, 7, 7, 512)    0           5c_identity_block_bn2[0][0]      
    __________________________________________________________________________________________________
    5c_identity_block_conv3 (Conv2D (None, 7, 7, 2048)   1050624     5c_identity_block_relu2[0][0]    
    __________________________________________________________________________________________________
    5c_identity_block_bn3 (BatchNor (None, 7, 7, 2048)   8192        5c_identity_block_conv3[0][0]    
    __________________________________________________________________________________________________
    5c_identity_block_add (Add)     (None, 7, 7, 2048)   0           5c_identity_block_bn3[0][0]      
                                                                     5b_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    5c_identity_block_relu4 (Activa (None, 7, 7, 2048)   0           5c_identity_block_add[0][0]      
    __________________________________________________________________________________________________
    avg_pool (AveragePooling2D)     (None, 1, 1, 2048)   0           5c_identity_block_relu4[0][0]    
    __________________________________________________________________________________________________
    flatten (Flatten)               (None, 2048)         0           avg_pool[0][0]                   
    __________________________________________________________________________________________________
    fc1000 (Dense)                  (None, 1000)         2049000     flatten[0][0]                    
    ==================================================================================================
    Total params: 25,636,712
    Trainable params: 25,583,592
    Non-trainable params: 53,120
    __________________________________________________________________________________________________
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253
    • 254
    • 255
    • 256
    • 257
    • 258
    • 259
    • 260
    • 261
    • 262
    • 263
    • 264
    • 265
    • 266
    • 267
    • 268
    • 269
    • 270
    • 271
    • 272
    • 273
    • 274
    • 275
    • 276
    • 277
    • 278
    • 279
    • 280
    • 281
    • 282
    • 283
    • 284
    • 285
    • 286
    • 287
    • 288
    • 289
    • 290
    • 291
    • 292
    • 293
    • 294
    • 295
    • 296
    • 297
    • 298
    • 299
    • 300
    • 301
    • 302
    • 303
    • 304
    • 305
    • 306
    • 307
    • 308
    • 309
    • 310
    • 311
    • 312
    • 313
    • 314
    • 315
    • 316
    • 317
    • 318
    • 319
    • 320
    • 321
    • 322
    • 323
    • 324
    • 325
    • 326
    • 327
    • 328
    • 329
    • 330
    • 331
    • 332
    • 333
    • 334
    • 335
    • 336
    • 337
    • 338
    • 339
    • 340
    • 341
    • 342
    • 343
    • 344
    • 345
    • 346
    • 347
    • 348
    • 349
    • 350
    • 351
    • 352
    • 353
    • 354
    • 355
    • 356
    • 357
    • 358
    • 359
    • 360
    • 361
    • 362
    • 363
    • 364
    • 365
    • 366
    • 367
    • 368
    • 369
    • 370
    • 371
    • 372
    • 373
    • 374
    • 375
    • 376
    • 377
    • 378

    五、编译

    在准备对模型进行训练之前,还需要再对其进行一些设置。以下内容是在模型的编译步骤中添加的:

    • 损失函数(loss):用于衡量模型在训练期间的准确率。
    • 优化器(optimizer):决定模型如何根据其看到的数据和自身的损失函数进行更新。
    • 指标(metrics):用于监控训练和测试步骤。以下示例使用了准确率,即被正确分类的图像的比率。

    # 设置优化器,我这里改变了学习率。
    opt = tf.keras.optimizers.Adam(learning_rate=1e-7)
    
    model.compile(optimizer="adam",
                  loss='sparse_categorical_crossentropy',
                  metrics=['accuracy'])
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    六、训练模型

    epochs = 10
    
    history = model.fit(
        train_ds,
        validation_data=val_ds,
        epochs=epochs
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    Epoch 1/10
    57/57 [==============================] - 12s 87ms/step - loss: 2.4394 - accuracy: 0.6620 - val_loss: 484.4415 - val_accuracy: 0.1858
    Epoch 2/10
    57/57 [==============================] - 3s 55ms/step - loss: 0.3268 - accuracy: 0.8904 - val_loss: 5.5874 - val_accuracy: 0.4513
    Epoch 3/10
    57/57 [==============================] - 3s 52ms/step - loss: 0.1593 - accuracy: 0.9558 - val_loss: 2.0023 - val_accuracy: 0.6726
    Epoch 4/10
    57/57 [==============================] - 3s 52ms/step - loss: 0.0546 - accuracy: 0.9869 - val_loss: 1.4410 - val_accuracy: 0.7788
    Epoch 5/10
    57/57 [==============================] - 3s 51ms/step - loss: 0.1656 - accuracy: 0.9567 - val_loss: 2.1653 - val_accuracy: 0.5487
    Epoch 6/10
    57/57 [==============================] - 3s 51ms/step - loss: 0.2403 - accuracy: 0.9221 - val_loss: 1.0641 - val_accuracy: 0.7257
    Epoch 7/10
    57/57 [==============================] - 3s 52ms/step - loss: 0.1774 - accuracy: 0.9377 - val_loss: 0.4922 - val_accuracy: 0.8673
    Epoch 8/10
    57/57 [==============================] - 3s 51ms/step - loss: 0.0733 - accuracy: 0.9760 - val_loss: 0.2036 - val_accuracy: 0.9381
    Epoch 9/10
    57/57 [==============================] - 3s 51ms/step - loss: 0.0185 - accuracy: 0.9992 - val_loss: 0.1091 - val_accuracy: 0.9735
    Epoch 10/10
    57/57 [==============================] - 3s 51ms/step - loss: 0.0086 - accuracy: 1.0000 - val_loss: 0.1246 - val_accuracy: 0.9735
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    六、模型评估

    acc = history.history['accuracy']
    val_acc = history.history['val_accuracy']
    
    loss = history.history['loss']
    val_loss = history.history['val_loss']
    
    epochs_range = range(epochs)
    
    plt.figure(figsize=(12, 4))
    plt.subplot(1, 2, 1)
    plt.plot(epochs_range, acc, label='Training Accuracy')
    plt.plot(epochs_range, val_acc, label='Validation Accuracy')
    plt.legend(loc='lower right')
    plt.title('Training and Validation Accuracy')
    
    plt.subplot(1, 2, 2)
    plt.plot(epochs_range, loss, label='Training Loss')
    plt.plot(epochs_range, val_loss, label='Validation Loss')
    plt.legend(loc='upper right')
    plt.title('Training and Validation Loss')
    plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    八、保存and加载模型

    # 保存模型
    model.save('model/my_model.h5')
    # 加载模型
    new_model = keras.models.load_model('model/my_model.h5')
    
    • 1
    • 2
    • 3
    • 4

    九、预测

    # 采用加载的模型(new_model)来看预测结果
    
    plt.figure(figsize=(10, 5))  # 图形的宽为10高为5
    
    for images, labels in val_ds.take(1):
        for i in range(8):
            ax = plt.subplot(2, 4, i + 1)  
            
            # 显示图片
            plt.imshow(images[i])
            
            # 需要给图片增加一个维度
            img_array = tf.expand_dims(images[i], 0) 
            
            # 使用模型预测图片中的人物
            predictions = new_model.predict(img_array)
            plt.title(class_names[np.argmax(predictions)])
    
            plt.axis("off")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在这里插入图片描述

  • 相关阅读:
    新手向:如何考虑将数据库技术和大数据框架结合使用?
    【洛谷】P5662 纪念品
    【java学习—十五】创建多线程的两种方式(2)
    elasticsearch7.17开发笔记
    Netty
    03 Vue脚手架
    History、Location
    c# winform 多线程
    JS 之 事件Event对象详解(属性、方法、自定义事件)
    c#实现单例模式的两种方法(饿汉式、懒汉式)
  • 原文地址:https://blog.csdn.net/weixin_45822638/article/details/134542465