diff --git a/.gitignore b/.gitignore index 6445d7b13d34bfddf2e971be8d6fb2f32e21d5f6..8a4cf4a7288a95dc2153005ca5e98d26d0e1c448 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ /图像识别/花朵识别/ResNet50.h5 /经典网络/data/ /经典网络/ShuffleNet/checkpoint/ +/经典网络/ShuffleNet/checkpoint_v2/ diff --git "a/\347\273\217\345\205\270\347\275\221\347\273\234/ShuffleNet/ShuffleNetV2\350\212\261\346\234\265\350\257\206\345\210\253.ipynb" "b/\347\273\217\345\205\270\347\275\221\347\273\234/ShuffleNet/ShuffleNetV2\350\212\261\346\234\265\350\257\206\345\210\253.ipynb" new file mode 100644 index 0000000000000000000000000000000000000000..77cbc55ebbeb02ccc2aa10fda4f5824644f0c524 --- /dev/null +++ "b/\347\273\217\345\205\270\347\275\221\347\273\234/ShuffleNet/ShuffleNetV2\350\212\261\346\234\265\350\257\206\345\210\253.ipynb" @@ -0,0 +1,1635 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 17, + "id": "d197d3cb", + "metadata": {}, + "outputs": [], + "source": [ + "import tensorflow as tf\n", + "import os\n", + "import numpy as np\n", + "from tensorflow.keras.layers import concatenate, Conv2D, Activation, BatchNormalization, DepthwiseConv2D\n", + "from tensorflow.keras.layers import add, AvgPool2D, MaxPooling2D, GlobalAveragePooling2D, Dense\n", + "from tensorflow.keras.layers import ReLU, Concatenate,Input\n", + "from tensorflow.keras.models import Model\n", + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "from tensorflow.keras.optimizers import Adam\n", + "import matplotlib.pyplot as plt\n", + "from tensorflow.keras.callbacks import LearningRateScheduler\n", + "# from plot_model import plot_model" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "cb65a38e", + "metadata": {}, + "outputs": [], + "source": [ + "# 标准卷积快:卷积+批标准化+ReLU\n", + "# 普通卷积:卷积+批标准化+ReLU激活\n", + "def conv_block(inputs, filters, kernel_size, stride=1):\n", + " x = Conv2D(filters, kernel_size, stride, padding='same', use_bias=False)(inputs)\n", + " x = BatchNormalization()(x)\n", + " x = ReLU()(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "a3aa674d", + "metadata": {}, + "outputs": [], + "source": [ + "# 深度可分离卷积模块\n", + "# 论文中DWconv的kernel_size都是3*3,只是下采样模块中的stride=2\n", + "def depthwise_conv_block(inputs, kernel_size, stride=1):\n", + " x = DepthwiseConv2D(kernel_size,\n", + " strides=stride,\n", + " padding='same',\n", + " use_bias=False # 有BN就不要用偏置\n", + " )(inputs)\n", + " x = BatchNormalization()(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "193268d2", + "metadata": {}, + "outputs": [], + "source": [ + "# Channel Shuffle模块\n", + "# 通道重排,跨组信息交互\n", + "# num_groups=2:论文中默认就是2组特征,对应左分支的shortcut和右边经过卷积之后的\n", + "def channel_shuffle(inputs, num_groups=2):\n", + " # 先得到输入特征图的shape,b:batch size,h,w:一张图的size,c:通道数\n", + " b, h, w, c = inputs.shape\n", + "\n", + " # 确定shape = [b, h, w, num_groups, c//num_groups]。通道维度原来是一个长为c的一维tensor,变成num_groups行n列的矩阵\n", + " # 在通道维度上将特征图reshape为num_groups行n列的矩阵\n", + " x_reshaped = tf.reshape(inputs, [-1, h, w, num_groups, c // num_groups])\n", + "\n", + " # 确定转置的矩形的shape = [b, h, w, c//num_groups, num_groups]\n", + " # 矩阵转置,最后两个维度从num_groups行n列变成n行num_groups列\n", + " x_transposed = tf.transpose(x_reshaped, [0, 1, 2, 4, 3])\n", + "\n", + " # 重新排列,shotcut和x的通道像素交叉排列,通道维度重新变成一维tensor\n", + " output = tf.reshape(x_transposed, [-1, h, w, c])\n", + " # 返回通道维度交叉排序后的tensor\n", + " return output" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "e5d97e51", + "metadata": {}, + "outputs": [], + "source": [ + "# Channel Split操作\n", + "def channel_split(inputs, num_splits=2):\n", + " b1, b2 = tf.split(inputs, num_splits, axis=-1)\n", + " return b1, b2" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "09af735b", + "metadata": {}, + "outputs": [], + "source": [ + "# ShuffleNetV2基本模块\n", + "# 长宽不变,通道数不变\n", + "def shuffle_block_s1(inputs, out_channels):\n", + " # 论文中直接将特征图在通道维度分成两半,分别经过左右分支\n", + " x1, x2 = channel_split(inputs) # 此时左右分支的通道数都只有原来的一半\n", + " # 右分支:1*1Conv+3*3DWConv+1*1Conv\n", + " x2 = conv_block(x2, filters=out_channels // 2, kernel_size=(1, 1), stride=1)\n", + " x2 = depthwise_conv_block(x2, kernel_size=(3, 3), stride=1)\n", + " x2 = conv_block(x2, filters=out_channels // 2, kernel_size=(1, 1), stride=1)\n", + "\n", + " # 左右分支在通道方向上堆叠(concat)\n", + " x = Concatenate(axis=-1)([x1, x2])\n", + " # Channel Shuffle\n", + " x = channel_shuffle(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "8ded8b26", + "metadata": {}, + "outputs": [], + "source": [ + "# ShuffleNetV2下采样模块\n", + "# 下采样模块没有进行Channel Split操作,最后还是用了Concat\n", + "# 所以长宽减半,通道数加倍\n", + "# 左分支输出特征图数量+右分支输出特征图数量=下采样模块输出特征图数量\n", + "def shuffle_block_s2(inputs, out_channels):\n", + " shortcut=inputs\n", + " in_channels = inputs.shape[-1]\n", + "\n", + " # 左分支:3*3 DWConv(stride=2)+1*1Conv\n", + " shortcut = depthwise_conv_block(shortcut, kernel_size=(3, 3), stride=2) # 特征图size减半\n", + " shortcut = conv_block(shortcut,in_channels, kernel_size=(1, 1), stride=1)\n", + "\n", + " # 右分支:1*1Conv+3*3DWConv(stride=2)+1*1Conv\n", + " x=conv_block(inputs,in_channels//2,kernel_size=(1,1),stride=1)\n", + " x=depthwise_conv_block(x,kernel_size=(3,3),stride=2)\n", + " # 右分支的通道数和左分支的通道数叠加 == 输出特征图的通道数out_channel\n", + " x=conv_block(x,out_channels-in_channels,kernel_size=(1,1),stride=1)\n", + " # 左右分支的特征在通道维度上堆叠,out.shape[-1]==out_channel\n", + " out=Concatenate(axis=-1)([shortcut,x])\n", + " out=channel_shuffle(out,2)\n", + " return out" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "832f6eaa", + "metadata": {}, + "outputs": [], + "source": [ + "# stage模块\n", + "def stage(inputs,out_channels,n):\n", + " # 每个stage中的第一个block的stride = 2(即下采样模块),其他block的stride = 1(即基本模块)\n", + " # 都是按照论文搭建的,要去看论文原文,要不你绝对不理解为什么这样搭建,嘿嘿。\n", + "\n", + " # 下采样单元\n", + " x=shuffle_block_s2(inputs,out_channels)\n", + " for _ in range(n):\n", + " x=shuffle_block_s1(x,out_channels)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0901b3fd", + "metadata": {}, + "outputs": [], + "source": [ + "# 完整网络搭建\n", + "def ShuffleNet(input_shape,num_classes):\n", + " # 构建输入Tensor\n", + " inputs=Input(shape=input_shape)\n", + "\n", + " x=Conv2D(filters=24,kernel_size=(3,3),strides=2,padding='same')(inputs)\n", + " x=MaxPooling2D(pool_size=(3,3),strides=2,padding='same')(x)\n", + "\n", + " x=stage(x,out_channels=116,n=3)\n", + " x=stage(x,out_channels=232,n=7)\n", + " x=stage(x,out_channels=464,n=3)\n", + "\n", + " x=Conv2D(filters=1024,kernel_size=(1,1),strides=1,padding='same')(x)\n", + " x=GlobalAveragePooling2D()(x)\n", + " x=Dense(num_classes,activation='softmax')(x)\n", + "\n", + " model=Model(inputs,x)\n", + " return model" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "82ed9e4c", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"functional_1\"\n", + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3) 0 \n", + "__________________________________________________________________________________________________\n", + "conv2d (Conv2D) (None, 112, 112, 24) 672 input_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 56, 56, 24) 0 conv2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_2 (Conv2D) (None, 56, 56, 12) 288 max_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_2 (BatchNor (None, 56, 56, 12) 48 conv2d_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_1 (ReLU) (None, 56, 56, 12) 0 batch_normalization_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d (DepthwiseConv (None, 28, 28, 24) 216 max_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_1 (DepthwiseCo (None, 28, 28, 12) 108 re_lu_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization (BatchNorma (None, 28, 28, 24) 96 depthwise_conv2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_3 (BatchNor (None, 28, 28, 12) 48 depthwise_conv2d_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_1 (Conv2D) (None, 28, 28, 24) 576 batch_normalization[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_3 (Conv2D) (None, 28, 28, 92) 1104 batch_normalization_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_1 (BatchNor (None, 28, 28, 24) 96 conv2d_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_4 (BatchNor (None, 28, 28, 92) 368 conv2d_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu (ReLU) (None, 28, 28, 24) 0 batch_normalization_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_2 (ReLU) (None, 28, 28, 92) 0 batch_normalization_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate (Concatenate) (None, 28, 28, 116) 0 re_lu[0][0] \n", + " re_lu_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape (TensorFlow [(None, 28, 28, 2, 5 0 concatenate[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose (TensorFl [(None, 28, 28, 58, 0 tf_op_layer_Reshape[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_1 (TensorFl [(None, 28, 28, 116) 0 tf_op_layer_Transpose[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split (TensorFlowOp [(None, 28, 28, 58), 0 tf_op_layer_Reshape_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_4 (Conv2D) (None, 28, 28, 58) 3364 tf_op_layer_split[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_5 (BatchNor (None, 28, 28, 58) 232 conv2d_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_3 (ReLU) (None, 28, 28, 58) 0 batch_normalization_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_2 (DepthwiseCo (None, 28, 28, 58) 522 re_lu_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_6 (BatchNor (None, 28, 28, 58) 232 depthwise_conv2d_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_5 (Conv2D) (None, 28, 28, 58) 3364 batch_normalization_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_7 (BatchNor (None, 28, 28, 58) 232 conv2d_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_4 (ReLU) (None, 28, 28, 58) 0 batch_normalization_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_1 (Concatenate) (None, 28, 28, 116) 0 tf_op_layer_split[0][0] \n", + " re_lu_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_2 (TensorFl [(None, 28, 28, 2, 5 0 concatenate_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_1 (Tensor [(None, 28, 28, 58, 0 tf_op_layer_Reshape_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_3 (TensorFl [(None, 28, 28, 116) 0 tf_op_layer_Transpose_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_1 (TensorFlow [(None, 28, 28, 58), 0 tf_op_layer_Reshape_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_6 (Conv2D) (None, 28, 28, 58) 3364 tf_op_layer_split_1[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_8 (BatchNor (None, 28, 28, 58) 232 conv2d_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_5 (ReLU) (None, 28, 28, 58) 0 batch_normalization_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_3 (DepthwiseCo (None, 28, 28, 58) 522 re_lu_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_9 (BatchNor (None, 28, 28, 58) 232 depthwise_conv2d_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_7 (Conv2D) (None, 28, 28, 58) 3364 batch_normalization_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_10 (BatchNo (None, 28, 28, 58) 232 conv2d_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_6 (ReLU) (None, 28, 28, 58) 0 batch_normalization_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_2 (Concatenate) (None, 28, 28, 116) 0 tf_op_layer_split_1[0][0] \n", + " re_lu_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_4 (TensorFl [(None, 28, 28, 2, 5 0 concatenate_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_2 (Tensor [(None, 28, 28, 58, 0 tf_op_layer_Reshape_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_5 (TensorFl [(None, 28, 28, 116) 0 tf_op_layer_Transpose_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_2 (TensorFlow [(None, 28, 28, 58), 0 tf_op_layer_Reshape_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_8 (Conv2D) (None, 28, 28, 58) 3364 tf_op_layer_split_2[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_11 (BatchNo (None, 28, 28, 58) 232 conv2d_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_7 (ReLU) (None, 28, 28, 58) 0 batch_normalization_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_4 (DepthwiseCo (None, 28, 28, 58) 522 re_lu_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_12 (BatchNo (None, 28, 28, 58) 232 depthwise_conv2d_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_9 (Conv2D) (None, 28, 28, 58) 3364 batch_normalization_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_13 (BatchNo (None, 28, 28, 58) 232 conv2d_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_8 (ReLU) (None, 28, 28, 58) 0 batch_normalization_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_3 (Concatenate) (None, 28, 28, 116) 0 tf_op_layer_split_2[0][0] \n", + " re_lu_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_6 (TensorFl [(None, 28, 28, 2, 5 0 concatenate_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_3 (Tensor [(None, 28, 28, 58, 0 tf_op_layer_Reshape_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_7 (TensorFl [(None, 28, 28, 116) 0 tf_op_layer_Transpose_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_11 (Conv2D) (None, 28, 28, 58) 6728 tf_op_layer_Reshape_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_16 (BatchNo (None, 28, 28, 58) 232 conv2d_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_10 (ReLU) (None, 28, 28, 58) 0 batch_normalization_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_5 (DepthwiseCo (None, 14, 14, 116) 1044 tf_op_layer_Reshape_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_6 (DepthwiseCo (None, 14, 14, 58) 522 re_lu_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_14 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_17 (BatchNo (None, 14, 14, 58) 232 depthwise_conv2d_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_10 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_12 (Conv2D) (None, 14, 14, 116) 6728 batch_normalization_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_15 (BatchNo (None, 14, 14, 116) 464 conv2d_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_18 (BatchNo (None, 14, 14, 116) 464 conv2d_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_9 (ReLU) (None, 14, 14, 116) 0 batch_normalization_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_11 (ReLU) (None, 14, 14, 116) 0 batch_normalization_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_4 (Concatenate) (None, 14, 14, 232) 0 re_lu_9[0][0] \n", + " re_lu_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_8 (TensorFl [(None, 14, 14, 2, 1 0 concatenate_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_4 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_9 (TensorFl [(None, 14, 14, 232) 0 tf_op_layer_Transpose_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_3 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_13 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_3[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_19 (BatchNo (None, 14, 14, 116) 464 conv2d_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_12 (ReLU) (None, 14, 14, 116) 0 batch_normalization_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_7 (DepthwiseCo (None, 14, 14, 116) 1044 re_lu_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_20 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_14 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_21 (BatchNo (None, 14, 14, 116) 464 conv2d_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_13 (ReLU) (None, 14, 14, 116) 0 batch_normalization_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_5 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_3[0][0] \n", + " re_lu_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_10 (TensorF [(None, 14, 14, 2, 1 0 concatenate_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_5 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_11 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_4 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_15 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_4[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_22 (BatchNo (None, 14, 14, 116) 464 conv2d_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_14 (ReLU) (None, 14, 14, 116) 0 batch_normalization_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_8 (DepthwiseCo (None, 14, 14, 116) 1044 re_lu_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_23 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_16 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_24 (BatchNo (None, 14, 14, 116) 464 conv2d_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_15 (ReLU) (None, 14, 14, 116) 0 batch_normalization_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_6 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_4[0][0] \n", + " re_lu_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_12 (TensorF [(None, 14, 14, 2, 1 0 concatenate_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_6 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_13 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_5 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_17 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_5[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_25 (BatchNo (None, 14, 14, 116) 464 conv2d_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_16 (ReLU) (None, 14, 14, 116) 0 batch_normalization_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_9 (DepthwiseCo (None, 14, 14, 116) 1044 re_lu_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_26 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_18 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_27 (BatchNo (None, 14, 14, 116) 464 conv2d_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_17 (ReLU) (None, 14, 14, 116) 0 batch_normalization_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_7 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_5[0][0] \n", + " re_lu_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_14 (TensorF [(None, 14, 14, 2, 1 0 concatenate_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_7 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_15 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_6 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_19 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_6[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_28 (BatchNo (None, 14, 14, 116) 464 conv2d_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_18 (ReLU) (None, 14, 14, 116) 0 batch_normalization_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_10 (DepthwiseC (None, 14, 14, 116) 1044 re_lu_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_29 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_20 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_30 (BatchNo (None, 14, 14, 116) 464 conv2d_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_19 (ReLU) (None, 14, 14, 116) 0 batch_normalization_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_8 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_6[0][0] \n", + " re_lu_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_16 (TensorF [(None, 14, 14, 2, 1 0 concatenate_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_8 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_17 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_7 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_21 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_7[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_31 (BatchNo (None, 14, 14, 116) 464 conv2d_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_20 (ReLU) (None, 14, 14, 116) 0 batch_normalization_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_11 (DepthwiseC (None, 14, 14, 116) 1044 re_lu_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_32 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_22 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_33 (BatchNo (None, 14, 14, 116) 464 conv2d_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_21 (ReLU) (None, 14, 14, 116) 0 batch_normalization_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_9 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_7[0][0] \n", + " re_lu_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_18 (TensorF [(None, 14, 14, 2, 1 0 concatenate_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_9 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_19 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_8 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_23 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_8[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_34 (BatchNo (None, 14, 14, 116) 464 conv2d_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_22 (ReLU) (None, 14, 14, 116) 0 batch_normalization_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_12 (DepthwiseC (None, 14, 14, 116) 1044 re_lu_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_35 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_24 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_35[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_36 (BatchNo (None, 14, 14, 116) 464 conv2d_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_23 (ReLU) (None, 14, 14, 116) 0 batch_normalization_36[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_10 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_8[0][0] \n", + " re_lu_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_20 (TensorF [(None, 14, 14, 2, 1 0 concatenate_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_10 (Tenso [(None, 14, 14, 116, 0 tf_op_layer_Reshape_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_21 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_9 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_25 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_9[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_37 (BatchNo (None, 14, 14, 116) 464 conv2d_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_24 (ReLU) (None, 14, 14, 116) 0 batch_normalization_37[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_13 (DepthwiseC (None, 14, 14, 116) 1044 re_lu_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_38 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_26 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_38[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_39 (BatchNo (None, 14, 14, 116) 464 conv2d_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_25 (ReLU) (None, 14, 14, 116) 0 batch_normalization_39[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_11 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_9[0][0] \n", + " re_lu_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_22 (TensorF [(None, 14, 14, 2, 1 0 concatenate_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_11 (Tenso [(None, 14, 14, 116, 0 tf_op_layer_Reshape_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_23 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_28 (Conv2D) (None, 14, 14, 116) 26912 tf_op_layer_Reshape_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_42 (BatchNo (None, 14, 14, 116) 464 conv2d_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_27 (ReLU) (None, 14, 14, 116) 0 batch_normalization_42[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_14 (DepthwiseC (None, 7, 7, 232) 2088 tf_op_layer_Reshape_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_15 (DepthwiseC (None, 7, 7, 116) 1044 re_lu_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_40 (BatchNo (None, 7, 7, 232) 928 depthwise_conv2d_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_43 (BatchNo (None, 7, 7, 116) 464 depthwise_conv2d_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_27 (Conv2D) (None, 7, 7, 232) 53824 batch_normalization_40[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_29 (Conv2D) (None, 7, 7, 232) 26912 batch_normalization_43[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_41 (BatchNo (None, 7, 7, 232) 928 conv2d_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_44 (BatchNo (None, 7, 7, 232) 928 conv2d_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_26 (ReLU) (None, 7, 7, 232) 0 batch_normalization_41[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_28 (ReLU) (None, 7, 7, 232) 0 batch_normalization_44[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_12 (Concatenate) (None, 7, 7, 464) 0 re_lu_26[0][0] \n", + " re_lu_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_24 (TensorF [(None, 7, 7, 2, 232 0 concatenate_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_12 (Tenso [(None, 7, 7, 232, 2 0 tf_op_layer_Reshape_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_25 (TensorF [(None, 7, 7, 464)] 0 tf_op_layer_Transpose_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_10 (TensorFlo [(None, 7, 7, 232), 0 tf_op_layer_Reshape_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_30 (Conv2D) (None, 7, 7, 232) 53824 tf_op_layer_split_10[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_45 (BatchNo (None, 7, 7, 232) 928 conv2d_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_29 (ReLU) (None, 7, 7, 232) 0 batch_normalization_45[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_16 (DepthwiseC (None, 7, 7, 232) 2088 re_lu_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_46 (BatchNo (None, 7, 7, 232) 928 depthwise_conv2d_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_31 (Conv2D) (None, 7, 7, 232) 53824 batch_normalization_46[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_47 (BatchNo (None, 7, 7, 232) 928 conv2d_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_30 (ReLU) (None, 7, 7, 232) 0 batch_normalization_47[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_13 (Concatenate) (None, 7, 7, 464) 0 tf_op_layer_split_10[0][0] \n", + " re_lu_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_26 (TensorF [(None, 7, 7, 2, 232 0 concatenate_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_13 (Tenso [(None, 7, 7, 232, 2 0 tf_op_layer_Reshape_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_27 (TensorF [(None, 7, 7, 464)] 0 tf_op_layer_Transpose_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_11 (TensorFlo [(None, 7, 7, 232), 0 tf_op_layer_Reshape_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_32 (Conv2D) (None, 7, 7, 232) 53824 tf_op_layer_split_11[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_48 (BatchNo (None, 7, 7, 232) 928 conv2d_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_31 (ReLU) (None, 7, 7, 232) 0 batch_normalization_48[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_17 (DepthwiseC (None, 7, 7, 232) 2088 re_lu_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_49 (BatchNo (None, 7, 7, 232) 928 depthwise_conv2d_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_33 (Conv2D) (None, 7, 7, 232) 53824 batch_normalization_49[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_50 (BatchNo (None, 7, 7, 232) 928 conv2d_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_32 (ReLU) (None, 7, 7, 232) 0 batch_normalization_50[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_14 (Concatenate) (None, 7, 7, 464) 0 tf_op_layer_split_11[0][0] \n", + " re_lu_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_28 (TensorF [(None, 7, 7, 2, 232 0 concatenate_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_14 (Tenso [(None, 7, 7, 232, 2 0 tf_op_layer_Reshape_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_29 (TensorF [(None, 7, 7, 464)] 0 tf_op_layer_Transpose_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_12 (TensorFlo [(None, 7, 7, 232), 0 tf_op_layer_Reshape_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_34 (Conv2D) (None, 7, 7, 232) 53824 tf_op_layer_split_12[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_51 (BatchNo (None, 7, 7, 232) 928 conv2d_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_33 (ReLU) (None, 7, 7, 232) 0 batch_normalization_51[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_18 (DepthwiseC (None, 7, 7, 232) 2088 re_lu_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_52 (BatchNo (None, 7, 7, 232) 928 depthwise_conv2d_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_35 (Conv2D) (None, 7, 7, 232) 53824 batch_normalization_52[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_53 (BatchNo (None, 7, 7, 232) 928 conv2d_35[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_34 (ReLU) (None, 7, 7, 232) 0 batch_normalization_53[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_15 (Concatenate) (None, 7, 7, 464) 0 tf_op_layer_split_12[0][0] \n", + " re_lu_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_30 (TensorF [(None, 7, 7, 2, 232 0 concatenate_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_15 (Tenso [(None, 7, 7, 232, 2 0 tf_op_layer_Reshape_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_31 (TensorF [(None, 7, 7, 464)] 0 tf_op_layer_Transpose_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_36 (Conv2D) (None, 7, 7, 1024) 476160 tf_op_layer_Reshape_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d (Globa (None, 1024) 0 conv2d_36[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense (Dense) (None, 1000) 1025000 global_average_pooling2d[0][0] \n", + "==================================================================================================\n", + "Total params: 2,216,440\n", + "Trainable params: 2,203,236\n", + "Non-trainable params: 13,204\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "model=ShuffleNet(input_shape=(224,224,3),num_classes=1000)\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "cfed8b9f", + "metadata": {}, + "outputs": [], + "source": [ + "# 类别数\n", + "num_classes = 17\n", + "# 批次大小\n", + "batch_size = 32\n", + "# 周期数\n", + "epochs = 100\n", + "# 图片大小\n", + "image_size = 224" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "6a3ae9a7", + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Model: \"functional_1\"\n", + "__________________________________________________________________________________________________\n", + "Layer (type) Output Shape Param # Connected to \n", + "==================================================================================================\n", + "input_1 (InputLayer) [(None, 224, 224, 3) 0 \n", + "__________________________________________________________________________________________________\n", + "conv2d (Conv2D) (None, 112, 112, 24) 672 input_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 56, 56, 24) 0 conv2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_2 (Conv2D) (None, 56, 56, 12) 288 max_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_2 (BatchNor (None, 56, 56, 12) 48 conv2d_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_1 (ReLU) (None, 56, 56, 12) 0 batch_normalization_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d (DepthwiseConv (None, 28, 28, 24) 216 max_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_1 (DepthwiseCo (None, 28, 28, 12) 108 re_lu_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization (BatchNorma (None, 28, 28, 24) 96 depthwise_conv2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_3 (BatchNor (None, 28, 28, 12) 48 depthwise_conv2d_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_1 (Conv2D) (None, 28, 28, 24) 576 batch_normalization[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_3 (Conv2D) (None, 28, 28, 92) 1104 batch_normalization_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_1 (BatchNor (None, 28, 28, 24) 96 conv2d_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_4 (BatchNor (None, 28, 28, 92) 368 conv2d_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu (ReLU) (None, 28, 28, 24) 0 batch_normalization_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_2 (ReLU) (None, 28, 28, 92) 0 batch_normalization_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate (Concatenate) (None, 28, 28, 116) 0 re_lu[0][0] \n", + " re_lu_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape (TensorFlow [(None, 28, 28, 2, 5 0 concatenate[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose (TensorFl [(None, 28, 28, 58, 0 tf_op_layer_Reshape[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_1 (TensorFl [(None, 28, 28, 116) 0 tf_op_layer_Transpose[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split (TensorFlowOp [(None, 28, 28, 58), 0 tf_op_layer_Reshape_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_4 (Conv2D) (None, 28, 28, 58) 3364 tf_op_layer_split[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_5 (BatchNor (None, 28, 28, 58) 232 conv2d_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_3 (ReLU) (None, 28, 28, 58) 0 batch_normalization_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_2 (DepthwiseCo (None, 28, 28, 58) 522 re_lu_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_6 (BatchNor (None, 28, 28, 58) 232 depthwise_conv2d_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_5 (Conv2D) (None, 28, 28, 58) 3364 batch_normalization_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_7 (BatchNor (None, 28, 28, 58) 232 conv2d_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_4 (ReLU) (None, 28, 28, 58) 0 batch_normalization_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_1 (Concatenate) (None, 28, 28, 116) 0 tf_op_layer_split[0][0] \n", + " re_lu_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_2 (TensorFl [(None, 28, 28, 2, 5 0 concatenate_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_1 (Tensor [(None, 28, 28, 58, 0 tf_op_layer_Reshape_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_3 (TensorFl [(None, 28, 28, 116) 0 tf_op_layer_Transpose_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_1 (TensorFlow [(None, 28, 28, 58), 0 tf_op_layer_Reshape_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_6 (Conv2D) (None, 28, 28, 58) 3364 tf_op_layer_split_1[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_8 (BatchNor (None, 28, 28, 58) 232 conv2d_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_5 (ReLU) (None, 28, 28, 58) 0 batch_normalization_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_3 (DepthwiseCo (None, 28, 28, 58) 522 re_lu_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_9 (BatchNor (None, 28, 28, 58) 232 depthwise_conv2d_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_7 (Conv2D) (None, 28, 28, 58) 3364 batch_normalization_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_10 (BatchNo (None, 28, 28, 58) 232 conv2d_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_6 (ReLU) (None, 28, 28, 58) 0 batch_normalization_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_2 (Concatenate) (None, 28, 28, 116) 0 tf_op_layer_split_1[0][0] \n", + " re_lu_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_4 (TensorFl [(None, 28, 28, 2, 5 0 concatenate_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_2 (Tensor [(None, 28, 28, 58, 0 tf_op_layer_Reshape_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_5 (TensorFl [(None, 28, 28, 116) 0 tf_op_layer_Transpose_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_2 (TensorFlow [(None, 28, 28, 58), 0 tf_op_layer_Reshape_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_8 (Conv2D) (None, 28, 28, 58) 3364 tf_op_layer_split_2[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_11 (BatchNo (None, 28, 28, 58) 232 conv2d_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_7 (ReLU) (None, 28, 28, 58) 0 batch_normalization_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_4 (DepthwiseCo (None, 28, 28, 58) 522 re_lu_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_12 (BatchNo (None, 28, 28, 58) 232 depthwise_conv2d_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_9 (Conv2D) (None, 28, 28, 58) 3364 batch_normalization_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_13 (BatchNo (None, 28, 28, 58) 232 conv2d_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_8 (ReLU) (None, 28, 28, 58) 0 batch_normalization_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_3 (Concatenate) (None, 28, 28, 116) 0 tf_op_layer_split_2[0][0] \n", + " re_lu_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_6 (TensorFl [(None, 28, 28, 2, 5 0 concatenate_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_3 (Tensor [(None, 28, 28, 58, 0 tf_op_layer_Reshape_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_7 (TensorFl [(None, 28, 28, 116) 0 tf_op_layer_Transpose_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_11 (Conv2D) (None, 28, 28, 58) 6728 tf_op_layer_Reshape_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_16 (BatchNo (None, 28, 28, 58) 232 conv2d_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_10 (ReLU) (None, 28, 28, 58) 0 batch_normalization_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_5 (DepthwiseCo (None, 14, 14, 116) 1044 tf_op_layer_Reshape_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_6 (DepthwiseCo (None, 14, 14, 58) 522 re_lu_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_14 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_17 (BatchNo (None, 14, 14, 58) 232 depthwise_conv2d_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_10 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_12 (Conv2D) (None, 14, 14, 116) 6728 batch_normalization_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_15 (BatchNo (None, 14, 14, 116) 464 conv2d_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_18 (BatchNo (None, 14, 14, 116) 464 conv2d_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_9 (ReLU) (None, 14, 14, 116) 0 batch_normalization_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_11 (ReLU) (None, 14, 14, 116) 0 batch_normalization_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_4 (Concatenate) (None, 14, 14, 232) 0 re_lu_9[0][0] \n", + " re_lu_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_8 (TensorFl [(None, 14, 14, 2, 1 0 concatenate_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_4 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_9 (TensorFl [(None, 14, 14, 232) 0 tf_op_layer_Transpose_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_3 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_13 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_3[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_19 (BatchNo (None, 14, 14, 116) 464 conv2d_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_12 (ReLU) (None, 14, 14, 116) 0 batch_normalization_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_7 (DepthwiseCo (None, 14, 14, 116) 1044 re_lu_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_20 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_14 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_21 (BatchNo (None, 14, 14, 116) 464 conv2d_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_13 (ReLU) (None, 14, 14, 116) 0 batch_normalization_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_5 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_3[0][0] \n", + " re_lu_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_10 (TensorF [(None, 14, 14, 2, 1 0 concatenate_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_5 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_11 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_4 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_15 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_4[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_22 (BatchNo (None, 14, 14, 116) 464 conv2d_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_14 (ReLU) (None, 14, 14, 116) 0 batch_normalization_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_8 (DepthwiseCo (None, 14, 14, 116) 1044 re_lu_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_23 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_16 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_24 (BatchNo (None, 14, 14, 116) 464 conv2d_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_15 (ReLU) (None, 14, 14, 116) 0 batch_normalization_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_6 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_4[0][0] \n", + " re_lu_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_12 (TensorF [(None, 14, 14, 2, 1 0 concatenate_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_6 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_13 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_5 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_17 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_5[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_25 (BatchNo (None, 14, 14, 116) 464 conv2d_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_16 (ReLU) (None, 14, 14, 116) 0 batch_normalization_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_9 (DepthwiseCo (None, 14, 14, 116) 1044 re_lu_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_26 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_18 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_27 (BatchNo (None, 14, 14, 116) 464 conv2d_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_17 (ReLU) (None, 14, 14, 116) 0 batch_normalization_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_7 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_5[0][0] \n", + " re_lu_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_14 (TensorF [(None, 14, 14, 2, 1 0 concatenate_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_7 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_15 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_6 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_19 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_6[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_28 (BatchNo (None, 14, 14, 116) 464 conv2d_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_18 (ReLU) (None, 14, 14, 116) 0 batch_normalization_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_10 (DepthwiseC (None, 14, 14, 116) 1044 re_lu_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_29 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_20 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_30 (BatchNo (None, 14, 14, 116) 464 conv2d_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_19 (ReLU) (None, 14, 14, 116) 0 batch_normalization_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_8 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_6[0][0] \n", + " re_lu_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_16 (TensorF [(None, 14, 14, 2, 1 0 concatenate_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_8 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_17 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_7 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_21 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_7[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_31 (BatchNo (None, 14, 14, 116) 464 conv2d_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_20 (ReLU) (None, 14, 14, 116) 0 batch_normalization_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_11 (DepthwiseC (None, 14, 14, 116) 1044 re_lu_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_32 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_22 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_33 (BatchNo (None, 14, 14, 116) 464 conv2d_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_21 (ReLU) (None, 14, 14, 116) 0 batch_normalization_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_9 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_7[0][0] \n", + " re_lu_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_18 (TensorF [(None, 14, 14, 2, 1 0 concatenate_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_9 (Tensor [(None, 14, 14, 116, 0 tf_op_layer_Reshape_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_19 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_8 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_23 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_8[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_34 (BatchNo (None, 14, 14, 116) 464 conv2d_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_22 (ReLU) (None, 14, 14, 116) 0 batch_normalization_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_12 (DepthwiseC (None, 14, 14, 116) 1044 re_lu_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_35 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_24 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_35[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_36 (BatchNo (None, 14, 14, 116) 464 conv2d_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_23 (ReLU) (None, 14, 14, 116) 0 batch_normalization_36[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_10 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_8[0][0] \n", + " re_lu_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_20 (TensorF [(None, 14, 14, 2, 1 0 concatenate_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_10 (Tenso [(None, 14, 14, 116, 0 tf_op_layer_Reshape_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_21 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_9 (TensorFlow [(None, 14, 14, 116) 0 tf_op_layer_Reshape_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_25 (Conv2D) (None, 14, 14, 116) 13456 tf_op_layer_split_9[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_37 (BatchNo (None, 14, 14, 116) 464 conv2d_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_24 (ReLU) (None, 14, 14, 116) 0 batch_normalization_37[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_13 (DepthwiseC (None, 14, 14, 116) 1044 re_lu_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_38 (BatchNo (None, 14, 14, 116) 464 depthwise_conv2d_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_26 (Conv2D) (None, 14, 14, 116) 13456 batch_normalization_38[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_39 (BatchNo (None, 14, 14, 116) 464 conv2d_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_25 (ReLU) (None, 14, 14, 116) 0 batch_normalization_39[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_11 (Concatenate) (None, 14, 14, 232) 0 tf_op_layer_split_9[0][0] \n", + " re_lu_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_22 (TensorF [(None, 14, 14, 2, 1 0 concatenate_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_11 (Tenso [(None, 14, 14, 116, 0 tf_op_layer_Reshape_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_23 (TensorF [(None, 14, 14, 232) 0 tf_op_layer_Transpose_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_28 (Conv2D) (None, 14, 14, 116) 26912 tf_op_layer_Reshape_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_42 (BatchNo (None, 14, 14, 116) 464 conv2d_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_27 (ReLU) (None, 14, 14, 116) 0 batch_normalization_42[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_14 (DepthwiseC (None, 7, 7, 232) 2088 tf_op_layer_Reshape_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_15 (DepthwiseC (None, 7, 7, 116) 1044 re_lu_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_40 (BatchNo (None, 7, 7, 232) 928 depthwise_conv2d_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_43 (BatchNo (None, 7, 7, 116) 464 depthwise_conv2d_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_27 (Conv2D) (None, 7, 7, 232) 53824 batch_normalization_40[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_29 (Conv2D) (None, 7, 7, 232) 26912 batch_normalization_43[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_41 (BatchNo (None, 7, 7, 232) 928 conv2d_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_44 (BatchNo (None, 7, 7, 232) 928 conv2d_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_26 (ReLU) (None, 7, 7, 232) 0 batch_normalization_41[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_28 (ReLU) (None, 7, 7, 232) 0 batch_normalization_44[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_12 (Concatenate) (None, 7, 7, 464) 0 re_lu_26[0][0] \n", + " re_lu_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_24 (TensorF [(None, 7, 7, 2, 232 0 concatenate_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_12 (Tenso [(None, 7, 7, 232, 2 0 tf_op_layer_Reshape_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_25 (TensorF [(None, 7, 7, 464)] 0 tf_op_layer_Transpose_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_10 (TensorFlo [(None, 7, 7, 232), 0 tf_op_layer_Reshape_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_30 (Conv2D) (None, 7, 7, 232) 53824 tf_op_layer_split_10[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_45 (BatchNo (None, 7, 7, 232) 928 conv2d_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_29 (ReLU) (None, 7, 7, 232) 0 batch_normalization_45[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_16 (DepthwiseC (None, 7, 7, 232) 2088 re_lu_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_46 (BatchNo (None, 7, 7, 232) 928 depthwise_conv2d_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_31 (Conv2D) (None, 7, 7, 232) 53824 batch_normalization_46[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_47 (BatchNo (None, 7, 7, 232) 928 conv2d_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_30 (ReLU) (None, 7, 7, 232) 0 batch_normalization_47[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_13 (Concatenate) (None, 7, 7, 464) 0 tf_op_layer_split_10[0][0] \n", + " re_lu_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_26 (TensorF [(None, 7, 7, 2, 232 0 concatenate_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_13 (Tenso [(None, 7, 7, 232, 2 0 tf_op_layer_Reshape_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_27 (TensorF [(None, 7, 7, 464)] 0 tf_op_layer_Transpose_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_11 (TensorFlo [(None, 7, 7, 232), 0 tf_op_layer_Reshape_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_32 (Conv2D) (None, 7, 7, 232) 53824 tf_op_layer_split_11[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_48 (BatchNo (None, 7, 7, 232) 928 conv2d_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_31 (ReLU) (None, 7, 7, 232) 0 batch_normalization_48[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_17 (DepthwiseC (None, 7, 7, 232) 2088 re_lu_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_49 (BatchNo (None, 7, 7, 232) 928 depthwise_conv2d_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_33 (Conv2D) (None, 7, 7, 232) 53824 batch_normalization_49[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_50 (BatchNo (None, 7, 7, 232) 928 conv2d_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_32 (ReLU) (None, 7, 7, 232) 0 batch_normalization_50[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_14 (Concatenate) (None, 7, 7, 464) 0 tf_op_layer_split_11[0][0] \n", + " re_lu_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_28 (TensorF [(None, 7, 7, 2, 232 0 concatenate_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_14 (Tenso [(None, 7, 7, 232, 2 0 tf_op_layer_Reshape_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_29 (TensorF [(None, 7, 7, 464)] 0 tf_op_layer_Transpose_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_split_12 (TensorFlo [(None, 7, 7, 232), 0 tf_op_layer_Reshape_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_34 (Conv2D) (None, 7, 7, 232) 53824 tf_op_layer_split_12[0][1] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_51 (BatchNo (None, 7, 7, 232) 928 conv2d_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_33 (ReLU) (None, 7, 7, 232) 0 batch_normalization_51[0][0] \n", + "__________________________________________________________________________________________________\n", + "depthwise_conv2d_18 (DepthwiseC (None, 7, 7, 232) 2088 re_lu_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_52 (BatchNo (None, 7, 7, 232) 928 depthwise_conv2d_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_35 (Conv2D) (None, 7, 7, 232) 53824 batch_normalization_52[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_53 (BatchNo (None, 7, 7, 232) 928 conv2d_35[0][0] \n", + "__________________________________________________________________________________________________\n", + "re_lu_34 (ReLU) (None, 7, 7, 232) 0 batch_normalization_53[0][0] \n", + "__________________________________________________________________________________________________\n", + "concatenate_15 (Concatenate) (None, 7, 7, 464) 0 tf_op_layer_split_12[0][0] \n", + " re_lu_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_30 (TensorF [(None, 7, 7, 2, 232 0 concatenate_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Transpose_15 (Tenso [(None, 7, 7, 232, 2 0 tf_op_layer_Reshape_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "tf_op_layer_Reshape_31 (TensorF [(None, 7, 7, 464)] 0 tf_op_layer_Transpose_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_36 (Conv2D) (None, 7, 7, 1024) 476160 tf_op_layer_Reshape_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d (Globa (None, 1024) 0 conv2d_36[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense (Dense) (None, 17) 17425 global_average_pooling2d[0][0] \n", + "==================================================================================================\n", + "Total params: 1,208,865\n", + "Trainable params: 1,195,661\n", + "Non-trainable params: 13,204\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "model=ShuffleNet(input_shape=(image_size,image_size,3),num_classes=num_classes)\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "3fb24c9d", + "metadata": {}, + "outputs": [], + "source": [ + "# 训练集数据进行数据增强\n", + "train_datagen = ImageDataGenerator(\n", + " rotation_range=20, # 随机旋转度数\n", + " width_shift_range=0.1, # 随机水平平移\n", + " height_shift_range=0.1, # 随机竖直平移\n", + " rescale=1 / 255, # 数据归一化\n", + " shear_range=10, # 随机错切变换\n", + " zoom_range=0.1, # 随机放大\n", + " horizontal_flip=True, # 水平翻转\n", + " brightness_range=(0.7, 1.3), # 亮度变化\n", + " fill_mode='nearest', # 填充方式\n", + ")\n", + "# 测试集数据只需要归一化就可以\n", + "test_datagen = ImageDataGenerator(\n", + " rescale=1 / 255, # 数据归一化\n", + ")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "72eb0fff", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Found 1088 images belonging to 17 classes.\n", + "Found 272 images belonging to 17 classes.\n", + "{'flower0': 0, 'flower1': 1, 'flower10': 2, 'flower11': 3, 'flower12': 4, 'flower13': 5, 'flower14': 6, 'flower15': 7, 'flower16': 8, 'flower2': 9, 'flower3': 10, 'flower4': 11, 'flower5': 12, 'flower6': 13, 'flower7': 14, 'flower8': 15, 'flower9': 16}\n" + ] + } + ], + "source": [ + "# 训练集数据生成器,可以在训练时自动产生数据进行训练\n", + "# 从'data/train'获得训练集数据\n", + "# 获得数据后会把图片resize为image_size×image_size的大小\n", + "# generator每次会产生batch_size个数据\n", + "train_generator = train_datagen.flow_from_directory(\n", + " '../data/train',\n", + " target_size=(image_size, image_size),\n", + " batch_size=batch_size,\n", + ")\n", + "\n", + "# 测试集数据生成器\n", + "test_generator = test_datagen.flow_from_directory(\n", + " '../data/test',\n", + " target_size=(image_size, image_size),\n", + " batch_size=batch_size,\n", + ")\n", + "# 字典的键为17个文件夹的名字,值为对应的分类编号\n", + "print(train_generator.class_indices)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "c01b74db", + "metadata": {}, + "outputs": [], + "source": [ + "# 学习率调节函数,逐渐减小学习率\n", + "def adjust_learning_rate(epoch):\n", + " # 前40周期\n", + " if epoch<=40:\n", + " lr = 1e-4\n", + " # 前40到80周期\n", + " elif epoch>40 and epoch<=80:\n", + " lr = 1e-5\n", + " # 80到100周期\n", + " else:\n", + " lr = 1e-6\n", + " return lr\n", + "\n", + "# 定义优化器\n", + "adam = Adam(lr=1e-4)\n", + "\n", + "# 读取模型\n", + "checkpoint_save_path = \"./checkpoint_v2/ShuffleNetV2.ckpt\"\n", + "if os.path.exists(checkpoint_save_path + '.index'):\n", + " print('-------------load the model-----------------')\n", + " model.load_weights(checkpoint_save_path)\n", + "# 保存模型\n", + "cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,\n", + " save_weights_only=True,\n", + " save_best_only=True)\n", + "\n", + "# 定义学习率衰减策略\n", + "callbacks = []\n", + "callbacks.append(LearningRateScheduler(adjust_learning_rate))\n", + "callbacks.append(cp_callback)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "138b413c", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/100\n", + "34/34 [==============================] - 17s 513ms/step - loss: 2.8576 - accuracy: 0.0643 - val_loss: 2.8333 - val_accuracy: 0.0588\n", + "Epoch 2/100\n", + "34/34 [==============================] - 16s 485ms/step - loss: 2.7871 - accuracy: 0.0910 - val_loss: 2.8336 - val_accuracy: 0.0588\n", + "Epoch 3/100\n", + "34/34 [==============================] - 16s 482ms/step - loss: 2.7401 - accuracy: 0.1057 - val_loss: 2.8345 - val_accuracy: 0.0588\n", + "Epoch 4/100\n", + "34/34 [==============================] - 16s 475ms/step - loss: 2.6846 - accuracy: 0.1333 - val_loss: 2.8376 - val_accuracy: 0.0588\n", + "Epoch 5/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 2.5232 - accuracy: 0.1728 - val_loss: 2.8464 - val_accuracy: 0.0588\n", + "Epoch 6/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 2.4150 - accuracy: 0.1673 - val_loss: 2.8587 - val_accuracy: 0.0588\n", + "Epoch 7/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 2.3011 - accuracy: 0.2353 - val_loss: 2.8890 - val_accuracy: 0.0588\n", + "Epoch 8/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 2.2051 - accuracy: 0.2408 - val_loss: 2.9430 - val_accuracy: 0.0588\n", + "Epoch 9/100\n", + "34/34 [==============================] - 16s 478ms/step - loss: 2.1227 - accuracy: 0.2767 - val_loss: 3.0213 - val_accuracy: 0.0588\n", + "Epoch 10/100\n", + "34/34 [==============================] - 16s 481ms/step - loss: 2.0316 - accuracy: 0.3051 - val_loss: 3.1612 - val_accuracy: 0.0588\n", + "Epoch 11/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 2.0213 - accuracy: 0.3015 - val_loss: 3.2534 - val_accuracy: 0.0588\n", + "Epoch 12/100\n", + "34/34 [==============================] - 16s 482ms/step - loss: 1.9376 - accuracy: 0.3493 - val_loss: 3.3918 - val_accuracy: 0.0588\n", + "Epoch 13/100\n", + "34/34 [==============================] - 16s 478ms/step - loss: 1.8580 - accuracy: 0.3511 - val_loss: 3.6385 - val_accuracy: 0.0588\n", + "Epoch 14/100\n", + "34/34 [==============================] - 16s 475ms/step - loss: 1.8003 - accuracy: 0.3842 - val_loss: 3.8913 - val_accuracy: 0.0588\n", + "Epoch 15/100\n", + "34/34 [==============================] - 16s 482ms/step - loss: 1.7191 - accuracy: 0.4246 - val_loss: 4.0015 - val_accuracy: 0.0772\n", + "Epoch 16/100\n", + "34/34 [==============================] - 16s 478ms/step - loss: 1.7495 - accuracy: 0.4035 - val_loss: 4.0658 - val_accuracy: 0.0919\n", + "Epoch 17/100\n", + "34/34 [==============================] - 16s 478ms/step - loss: 1.6860 - accuracy: 0.4182 - val_loss: 4.0172 - val_accuracy: 0.0846\n", + "Epoch 18/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 1.6341 - accuracy: 0.4403 - val_loss: 3.8245 - val_accuracy: 0.1103\n", + "Epoch 19/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 1.5863 - accuracy: 0.4669 - val_loss: 3.7036 - val_accuracy: 0.1250\n", + "Epoch 20/100\n", + "34/34 [==============================] - 17s 489ms/step - loss: 1.5251 - accuracy: 0.4770 - val_loss: 2.8111 - val_accuracy: 0.2243\n", + "Epoch 21/100\n", + "34/34 [==============================] - 17s 487ms/step - loss: 1.4829 - accuracy: 0.4816 - val_loss: 2.4900 - val_accuracy: 0.2868\n", + "Epoch 22/100\n", + "34/34 [==============================] - 17s 493ms/step - loss: 1.4525 - accuracy: 0.5165 - val_loss: 1.8953 - val_accuracy: 0.3934\n", + "Epoch 23/100\n", + "34/34 [==============================] - 17s 486ms/step - loss: 1.4117 - accuracy: 0.5331 - val_loss: 1.6463 - val_accuracy: 0.5000\n", + "Epoch 24/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 1.4319 - accuracy: 0.5119 - val_loss: 1.6599 - val_accuracy: 0.5221\n", + "Epoch 25/100\n", + "34/34 [==============================] - 16s 482ms/step - loss: 1.3910 - accuracy: 0.5165 - val_loss: 1.6561 - val_accuracy: 0.5331\n", + "Epoch 26/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 1.3864 - accuracy: 0.5202 - val_loss: 1.7234 - val_accuracy: 0.5257\n", + "Epoch 27/100\n", + "34/34 [==============================] - 17s 486ms/step - loss: 1.3404 - accuracy: 0.5607 - val_loss: 1.5703 - val_accuracy: 0.5110\n", + "Epoch 28/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 1.2627 - accuracy: 0.5827 - val_loss: 1.6298 - val_accuracy: 0.5037\n", + "Epoch 29/100\n", + "34/34 [==============================] - 16s 478ms/step - loss: 1.2643 - accuracy: 0.5744 - val_loss: 1.6072 - val_accuracy: 0.5368\n", + "Epoch 30/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 1.2339 - accuracy: 0.5919 - val_loss: 1.6592 - val_accuracy: 0.5294\n", + "Epoch 31/100\n", + "34/34 [==============================] - 16s 472ms/step - loss: 1.2156 - accuracy: 0.5974 - val_loss: 1.7535 - val_accuracy: 0.5000\n", + "Epoch 32/100\n", + "34/34 [==============================] - 17s 496ms/step - loss: 1.2151 - accuracy: 0.6039 - val_loss: 1.4662 - val_accuracy: 0.5478\n", + "Epoch 33/100\n", + "34/34 [==============================] - 16s 480ms/step - loss: 1.1842 - accuracy: 0.5919 - val_loss: 1.6804 - val_accuracy: 0.4816\n", + "Epoch 34/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 1.1130 - accuracy: 0.6140 - val_loss: 1.5267 - val_accuracy: 0.5257\n", + "Epoch 35/100\n", + "34/34 [==============================] - 17s 486ms/step - loss: 1.1683 - accuracy: 0.6176 - val_loss: 1.6141 - val_accuracy: 0.5037\n", + "Epoch 36/100\n", + "34/34 [==============================] - 16s 471ms/step - loss: 1.1274 - accuracy: 0.6048 - val_loss: 1.6158 - val_accuracy: 0.4963\n", + "Epoch 37/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 1.1229 - accuracy: 0.6121 - val_loss: 1.5604 - val_accuracy: 0.5368\n", + "Epoch 38/100\n", + "34/34 [==============================] - 17s 487ms/step - loss: 1.1070 - accuracy: 0.6287 - val_loss: 1.4040 - val_accuracy: 0.5478\n", + "Epoch 39/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 1.0911 - accuracy: 0.6342 - val_loss: 1.4712 - val_accuracy: 0.5699\n", + "Epoch 40/100\n", + "34/34 [==============================] - 16s 484ms/step - loss: 1.0771 - accuracy: 0.6305 - val_loss: 1.3228 - val_accuracy: 0.6287\n", + "Epoch 41/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 1.0376 - accuracy: 0.6379 - val_loss: 1.4993 - val_accuracy: 0.5625\n", + "Epoch 42/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 0.9473 - accuracy: 0.6783 - val_loss: 1.3586 - val_accuracy: 0.5919\n", + "Epoch 43/100\n", + "34/34 [==============================] - 16s 484ms/step - loss: 0.9322 - accuracy: 0.6857 - val_loss: 1.2771 - val_accuracy: 0.6140\n", + "Epoch 44/100\n", + "34/34 [==============================] - 17s 489ms/step - loss: 0.9407 - accuracy: 0.6710 - val_loss: 1.2309 - val_accuracy: 0.6213\n", + "Epoch 45/100\n", + "34/34 [==============================] - 17s 492ms/step - loss: 0.9515 - accuracy: 0.6765 - val_loss: 1.2072 - val_accuracy: 0.6140\n", + "Epoch 46/100\n", + "34/34 [==============================] - 16s 484ms/step - loss: 0.9131 - accuracy: 0.6921 - val_loss: 1.2051 - val_accuracy: 0.6213\n", + "Epoch 47/100\n", + "34/34 [==============================] - 17s 486ms/step - loss: 0.9474 - accuracy: 0.6811 - val_loss: 1.1985 - val_accuracy: 0.6250\n", + "Epoch 48/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 0.9445 - accuracy: 0.6847 - val_loss: 1.2035 - val_accuracy: 0.6250\n", + "Epoch 49/100\n", + "34/34 [==============================] - 16s 480ms/step - loss: 0.9226 - accuracy: 0.6912 - val_loss: 1.2036 - val_accuracy: 0.6360\n", + "Epoch 50/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 0.9393 - accuracy: 0.6792 - val_loss: 1.2000 - val_accuracy: 0.6324\n", + "Epoch 51/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 0.9190 - accuracy: 0.6792 - val_loss: 1.2006 - val_accuracy: 0.6324\n", + "Epoch 52/100\n", + "34/34 [==============================] - 17s 494ms/step - loss: 0.9181 - accuracy: 0.6949 - val_loss: 1.1835 - val_accuracy: 0.6287\n", + "Epoch 53/100\n", + "34/34 [==============================] - 17s 487ms/step - loss: 0.8703 - accuracy: 0.6967 - val_loss: 1.1782 - val_accuracy: 0.6434\n", + "Epoch 54/100\n", + "34/34 [==============================] - 17s 489ms/step - loss: 0.9628 - accuracy: 0.6746 - val_loss: 1.1737 - val_accuracy: 0.6397\n", + "Epoch 55/100\n", + "34/34 [==============================] - 16s 481ms/step - loss: 0.9480 - accuracy: 0.6783 - val_loss: 1.1779 - val_accuracy: 0.6360\n", + "Epoch 56/100\n", + "34/34 [==============================] - 16s 475ms/step - loss: 0.8566 - accuracy: 0.7114 - val_loss: 1.1741 - val_accuracy: 0.6324\n", + "Epoch 57/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "34/34 [==============================] - 16s 483ms/step - loss: 0.9350 - accuracy: 0.6801 - val_loss: 1.1728 - val_accuracy: 0.6434\n", + "Epoch 58/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 0.9145 - accuracy: 0.6930 - val_loss: 1.1798 - val_accuracy: 0.6324\n", + "Epoch 59/100\n", + "34/34 [==============================] - 17s 490ms/step - loss: 0.8957 - accuracy: 0.7004 - val_loss: 1.1689 - val_accuracy: 0.6324\n", + "Epoch 60/100\n", + "34/34 [==============================] - 17s 488ms/step - loss: 0.9006 - accuracy: 0.7022 - val_loss: 1.1570 - val_accuracy: 0.6434\n", + "Epoch 61/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 0.8768 - accuracy: 0.7059 - val_loss: 1.1836 - val_accuracy: 0.6397\n", + "Epoch 62/100\n", + "34/34 [==============================] - 16s 478ms/step - loss: 0.8985 - accuracy: 0.6976 - val_loss: 1.1992 - val_accuracy: 0.6324\n", + "Epoch 63/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 0.9385 - accuracy: 0.6737 - val_loss: 1.1728 - val_accuracy: 0.6434\n", + "Epoch 64/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 0.9185 - accuracy: 0.6884 - val_loss: 1.2008 - val_accuracy: 0.6471\n", + "Epoch 65/100\n", + "34/34 [==============================] - 16s 478ms/step - loss: 0.8666 - accuracy: 0.7123 - val_loss: 1.1848 - val_accuracy: 0.6654\n", + "Epoch 66/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 0.8914 - accuracy: 0.6921 - val_loss: 1.1926 - val_accuracy: 0.6397\n", + "Epoch 67/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 0.8796 - accuracy: 0.7096 - val_loss: 1.1994 - val_accuracy: 0.6397\n", + "Epoch 68/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 0.9022 - accuracy: 0.7013 - val_loss: 1.1709 - val_accuracy: 0.6471\n", + "Epoch 69/100\n", + "34/34 [==============================] - 16s 482ms/step - loss: 0.8803 - accuracy: 0.6847 - val_loss: 1.1615 - val_accuracy: 0.6434\n", + "Epoch 70/100\n", + "34/34 [==============================] - 16s 475ms/step - loss: 0.8934 - accuracy: 0.7013 - val_loss: 1.1674 - val_accuracy: 0.6360\n", + "Epoch 71/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 0.9022 - accuracy: 0.6949 - val_loss: 1.1609 - val_accuracy: 0.6434\n", + "Epoch 72/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 0.8579 - accuracy: 0.7059 - val_loss: 1.1596 - val_accuracy: 0.6287\n", + "Epoch 73/100\n", + "34/34 [==============================] - 16s 483ms/step - loss: 0.8824 - accuracy: 0.7086 - val_loss: 1.1563 - val_accuracy: 0.6397\n", + "Epoch 74/100\n", + "34/34 [==============================] - 16s 472ms/step - loss: 0.8857 - accuracy: 0.7031 - val_loss: 1.1630 - val_accuracy: 0.6544\n", + "Epoch 75/100\n", + "34/34 [==============================] - 16s 481ms/step - loss: 0.8864 - accuracy: 0.6994 - val_loss: 1.1658 - val_accuracy: 0.6544\n", + "Epoch 76/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 0.8722 - accuracy: 0.7096 - val_loss: 1.1595 - val_accuracy: 0.6471\n", + "Epoch 77/100\n", + "34/34 [==============================] - 16s 475ms/step - loss: 0.8493 - accuracy: 0.7123 - val_loss: 1.1757 - val_accuracy: 0.6507\n", + "Epoch 78/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 0.9181 - accuracy: 0.6884 - val_loss: 1.1625 - val_accuracy: 0.6618\n", + "Epoch 79/100\n", + "34/34 [==============================] - 17s 492ms/step - loss: 0.9212 - accuracy: 0.6820 - val_loss: 1.1473 - val_accuracy: 0.6360\n", + "Epoch 80/100\n", + "34/34 [==============================] - 17s 488ms/step - loss: 0.8319 - accuracy: 0.7206 - val_loss: 1.1379 - val_accuracy: 0.6654\n", + "Epoch 81/100\n", + "34/34 [==============================] - 17s 488ms/step - loss: 0.8654 - accuracy: 0.6985 - val_loss: 1.1330 - val_accuracy: 0.6544\n", + "Epoch 82/100\n", + "34/34 [==============================] - 17s 491ms/step - loss: 0.8807 - accuracy: 0.6976 - val_loss: 1.1306 - val_accuracy: 0.6618\n", + "Epoch 83/100\n", + "34/34 [==============================] - 16s 475ms/step - loss: 0.8668 - accuracy: 0.7031 - val_loss: 1.1333 - val_accuracy: 0.6691\n", + "Epoch 84/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 0.8696 - accuracy: 0.7013 - val_loss: 1.1337 - val_accuracy: 0.6654\n", + "Epoch 85/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 0.8583 - accuracy: 0.7142 - val_loss: 1.1372 - val_accuracy: 0.6654\n", + "Epoch 86/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 0.8653 - accuracy: 0.7031 - val_loss: 1.1381 - val_accuracy: 0.6654\n", + "Epoch 87/100\n", + "34/34 [==============================] - 16s 477ms/step - loss: 0.8759 - accuracy: 0.6949 - val_loss: 1.1339 - val_accuracy: 0.6654\n", + "Epoch 88/100\n", + "34/34 [==============================] - 16s 479ms/step - loss: 0.8455 - accuracy: 0.7031 - val_loss: 1.1361 - val_accuracy: 0.6691\n", + "Epoch 89/100\n", + "34/34 [==============================] - 16s 480ms/step - loss: 0.8695 - accuracy: 0.7013 - val_loss: 1.1378 - val_accuracy: 0.6691\n", + "Epoch 90/100\n", + "34/34 [==============================] - 16s 470ms/step - loss: 0.8474 - accuracy: 0.7132 - val_loss: 1.1405 - val_accuracy: 0.6691\n", + "Epoch 91/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 0.8533 - accuracy: 0.7114 - val_loss: 1.1390 - val_accuracy: 0.6691\n", + "Epoch 92/100\n", + "34/34 [==============================] - 16s 482ms/step - loss: 0.8388 - accuracy: 0.7279 - val_loss: 1.1375 - val_accuracy: 0.6691\n", + "Epoch 93/100\n", + "34/34 [==============================] - 16s 473ms/step - loss: 0.8697 - accuracy: 0.7022 - val_loss: 1.1378 - val_accuracy: 0.6618\n", + "Epoch 94/100\n", + "34/34 [==============================] - 16s 472ms/step - loss: 0.8432 - accuracy: 0.7160 - val_loss: 1.1366 - val_accuracy: 0.6618\n", + "Epoch 95/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 0.8271 - accuracy: 0.7252 - val_loss: 1.1397 - val_accuracy: 0.6728\n", + "Epoch 96/100\n", + "34/34 [==============================] - 16s 474ms/step - loss: 0.8396 - accuracy: 0.7160 - val_loss: 1.1382 - val_accuracy: 0.6691\n", + "Epoch 97/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 0.8287 - accuracy: 0.7233 - val_loss: 1.1398 - val_accuracy: 0.6618\n", + "Epoch 98/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 0.8753 - accuracy: 0.6994 - val_loss: 1.1391 - val_accuracy: 0.6691\n", + "Epoch 99/100\n", + "34/34 [==============================] - 17s 486ms/step - loss: 0.8348 - accuracy: 0.7224 - val_loss: 1.1364 - val_accuracy: 0.6654\n", + "Epoch 100/100\n", + "34/34 [==============================] - 16s 476ms/step - loss: 0.8629 - accuracy: 0.7123 - val_loss: 1.1375 - val_accuracy: 0.6654\n" + ] + } + ], + "source": [ + "# 定义优化器,loss function,训练过程中计算准确率\n", + "model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])\n", + "\n", + "# Tensorflow2.1版本(包括2.1)之后可以直接使用fit训练模型\n", + "history = model.fit(x=train_generator,epochs=epochs,validation_data=test_generator,callbacks=callbacks)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "1eb80276", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAABFOElEQVR4nO3dd3hUZfbA8e+bQkgjAQKhhiK9hBYQFRfEstgA3UUErCvruqtrX3WtrH3t+pN17QVBVNRdVKyAbRUlKFJCJ5QAISGkt0ky5/fHO+mZMIFMJsmcz/PkSe6dW86dgXvmvtWICEoppfxXgK8DUEop5VuaCJRSys9pIlBKKT+niUAppfycJgKllPJzQb4OoKFiYmKkd+/evg5DKaValDVr1hwSkU51vdbiEkHv3r1JTEz0dRhKKdWiGGN2u3tNi4aUUsrPaSJQSik/p4lAKaX8XIurI6hLSUkJKSkpFBUV+ToU5aG2bdvSo0cPgoODfR2KUn6vVSSClJQUIiMj6d27N8YYX4ejjkBEyMjIICUlhT59+vg6HKX8XqsoGioqKqJjx46aBFoIYwwdO3bUJzilmolWkQgATQItjH5eSjUfrSYRKKWUr/z4Iyxf7usojp4mAqWUOgaHDsE558DvfgcFBe63W74crr0WcnKqrxeB3FzvxngkmggaQVZWFv/6178avN9ZZ51FVlZW4wekVCuWkQFJSb6OotLf/maTQXY2vP123du89hpMmQL/939w8smwb59df/gwzJwJHTrAmjXV90lNhcmT4cMPvRo+oImgUbhLBKWlpfXut2zZMqKjo70U1bE7UvxK+cLNN8PYsZCe7utIYOVKe5O/9VYYPBief7766yJw//1w+eUwaRIsWQI7d8IJJ8Crr0J8PHzwAQQFwRNPVN/36aft8c8/3+7nVSLSon7GjBkjNSUlJVX8fd11IhMnNu7PddfVOmU1M2fOlLZt28qIESMkISFBJkyYIOeee670799fRESmTZsmo0ePliFDhsjzzz9fsV+vXr0kPT1dkpOTZdCgQTJ37lwZMmSInH766VJQUOD2fC+88IIkJCRIfHy8nH/++ZKfny8iIqmpqTJ9+nSJj4+X+Ph4+d///iciIq+//roMHz5c4uPj5aKLLhIRkUsvvVTefffdimOGh4eLiMjKlSs9jv+TTz6RUaNGSXx8vEyePFnKysqkX79+kpaWJiIiZWVlctxxx1Us11T1c1PKE06nSNeuIiBy110N39/hEHnvPRHXf5kGKywUOXSo8u8BA0T69hUpKBB56ikb1y+/VG5/55123SWXiBQX23W//FJ5DQMGiKxebe8xQUEi+/bZbXJyRKKjRc46S+TEE0UCA0UWLjy6mMsBieLmvurzG3tDf5pjIkhOTpahQ4eKiL2RhoWFyc6dOytez8jIEBGRgoICGTp0qBxy/UuqmggCAwPlF9e/oBkzZsiCBQvcnq98fxGRO+64Q5555hkREbngggvkySefFBGR0tJSycrKkg0bNkj//v0lPT29Wiz1JQJP4k9LS5MePXpUbFe+zbx58ypi+Oyzz+T88893ex2aCKrbv19k3jx7s2oK8+aJ/OlPtdc7nSKlpU0Tg4i9iX7+ucgtt4gkJNi43Fm/3t61oqLsjTInp2Hnuvpqu/8ZZ4gUFTVs3927RXr0sPt37SoyfLj9+/PP7euHD4u0bSty1VV2+eOP7et/+IN9T2se6+mnRfLy7PL27SLGiNxxh10uTyqrVonk5opMmmRff/PNhsVclc8SATAF2AJsB26r4/UngbWun61A1pGOeaRE4As1E8GkSZOqvX7PPfdUfEtv166d/PDDDyJSPRH069evYvuHH35Y7rvvPrfn++qrr2TChAkybNgw6d27t/zJ9b85JiZGimr8637mmWfk9ttvr3WM+hKBJ/EvXbpUZs+eXeu4e/bskVGjRomIfVL68MMP3V6Hrz+35ubvf7f/I+t5yxpNWppISIg9n+vBscItt4h06lR5g2uowkKRL78Uue02kcmTRR591N7s67J1q0hcnI0jOFikWzd7M3V9b6nliSfstkuW2N+PPup5XC+9ZPeZNMn+Pv98kZISz/bNyhIZNkykXTuR++4TufhikVGjRG64ofp2l14qEhEhkpQk0qGDyIgR7q+9pqlTRWJi7I2/Vy+RCRMqX8vPF5k1S2TDBs+OVZf6EoHX6giMMYHAfOBMYAgwyxgzpEax1A0iMlJERgL/B7zvrXiaUnh4eMXfX331FV9++SU//PADv/76K6NGjaqzI1VISEjF34GBgfWWz1922WU8++yzrF+/nnvuueeoOmYFBQXhdDoBcDqdOByOY4q/XM+ePYmNjWXFihX89NNPnHnmmQ2OzV/95z/297vver6P0wnffANXXQVx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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# 画出训练集准确率曲线图\n", + "plt.plot(np.arange(epochs),history.history['accuracy'],c='b',label='train_accuracy')\n", + "# 画出验证集准确率曲线图\n", + "plt.plot(np.arange(epochs),history.history['val_accuracy'],c='y',label='val_accuracy')\n", + "# 图例\n", + "plt.legend()\n", + "# x坐标描述\n", + "plt.xlabel('epochs')\n", + "# y坐标描述\n", + "plt.ylabel('accuracy')\n", + "# 显示图像\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "0f540580", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAEGCAYAAABo25JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAAsTAAALEwEAmpwYAAA7uElEQVR4nO3deXiU1dn48e89S/YVEhYJsiirbCoqrUtR3ypaFbUqtu719/q6L1Urte7VVtu+2lItltZdq+LO627drQsGBQFR9p1AyJ6QZDIz9++PMxCWBLLMZJLM/bmuuTIzz3Y/88Dcc855zjmiqhhjjElcnngHYIwxJr4sERhjTIKzRGCMMQnOEoExxiQ4SwTGGJPgfPEOoLXy8vJ04MCB8Q7DGGO6lDlz5mxW1fymlnW5RDBw4EAKCwvjHYYxxnQpIrKquWVWNWSMMQnOEoExxiQ4SwTGGJPgulwbgTGm+2loaGDt2rXU1dXFO5QuLyUlhYKCAvx+f4u3sURgjIm7tWvXkpmZycCBAxGReIfTZakqJSUlrF27lkGDBrV4O6saMsbEXV1dHT179rQk0E4iQs+ePVtdsrJEYIzpFCwJREdbPkdLBJ1cKFTL+vUzaGgoj3coxphuyhJBJ6aqLFlyKYsX/w/z5h1FILA53iEZY7qhmCcCEfGKyNci8moTy5JF5FkRWSoiX4jIwFjH05WsX/93iooeJT//dLZsWcTcuROpry+Kd1jGdDvl5eX87W9/a/V2xx9/POXl5a3e7vzzz+f5559v9Xax0hElgquARc0suxAoU9V9gfuAezogni6houJzli69kh49jmPkyGcYPfp16upWMnfuEQQCm+IdnjHdSnOJIBgM7na7119/nZycnBhF1XFievuoiBQAPwHuAn7ZxCqTgdsiz58H7hcR0QSfPzMQ2MzChaeRnFzAiBFPIuIhN/dIxox5k7lzD6eo6DH23vv6eIdpTExcfTXMnRvdfY4bB3/+c/PLp06dyrJlyxg3bhx+v5+UlBRyc3P57rvvWLx4MSeffDJr1qyhrq6Oq666iosuughoHPusurqa4447jsMOO4xPP/2Ufv368corr5CamrrH2N59912uu+46gsEgBx10ENOnTyc5OZmpU6cya9YsfD4fxxxzDH/605947rnnuP322/F6vWRnZ/PRRx9F5fOJdYngz8CvgHAzy/sBawBUNQhUAD13XklELhKRQhEpLC4ujlGoncfatfcRCKxnv/2ex+/vse39nJzDSEsbSVnZu3GMzpju5+6772afffZh7ty5/PGPf+Srr77iL3/5C4sXLwbg4YcfZs6cORQWFjJt2jRKSkp22ceSJUu47LLLWLhwITk5Obzwwgt7PG5dXR3nn38+zz77LPPnzycYDDJ9+nRKSkp46aWXWLhwId988w033XQTAHfccQdvvfUW8+bNY9asWVE7/5iVCETkBGCTqs4RkYnt2ZeqzgBmAIwfP75blxaCwWrWr59OXt4pZGYesMvy3Nyj2bDhIcLhAB5PUhwiNCa2dvfLvaMcfPDBO3TImjZtGi+99BIAa9asYcmSJfTsueNv1kGDBjFu3DgADjzwQFauXLnH43z//fcMGjSIoUOHAnDeeefxwAMPcPnll5OSksKFF17ICSecwAknnADAoYceyvnnn88ZZ5zBqaeeGoUzdWJZIjgUOElEVgLPAEeJyJM7rbMO6A8gIj4gG9g11SaQoqKHCAbL6N+/6aqf3NyjCYe3UFn5eQdHZkziSE9P3/b8gw8+4N///jefffYZ8+bNY//992+yw1ZycvK2516vd4/tC7vj8/mYPXs2p512Gq+++iqTJk0C4MEHH+TOO+9kzZo1HHjggU2WTNoiZolAVX+tqgWqOhA4E3hPVc/eabVZwHmR56dF1unWv/h3JxwOsmbNfWRnH0Z29oQm18nO/hHgseohY6IoMzOTqqqqJpdVVFSQm5tLWloa3333HZ9/Hr0fYcOGDWPlypUsXboUgCeeeIIf/ehHVFdXU1FRwfHHH899993HvHnzAFi2bBmHHHIId9xxB/n5+axZsyYqcXT4WEMicgdQqKqzgIeAJ0RkKVCKSxgJq7j4OerrVzFkyLRm1/H7c8jMHE9Z2bsMGnR7B0ZnTPfVs2dPDj30UEaNGkVqaiq9e/fetmzSpEk8+OCDjBgxgmHDhjFhQtM/0toiJSWFRx55hNNPP31bY/HFF19MaWkpkydPpq6uDlXl3nvvBeD6669nyZIlqCpHH300Y8eOjUoc0tV+gI8fP1674wxlqsqcOQcSDtdy0EELEWm+sLZ8+Y2sWfNHDj20DJ8vowOjNCY2Fi1axIgRI+IdRrfR1OcpInNUdXxT61vP4k6iouIjqqu/pqDg2t0mAXDtBKpBKiqic+uYMSaxWSLoJMrK3gM89Oq159qxrKwfIpJs7QTGdHKXXXYZ48aN2+HxyCOPxDusXdh8BJ1EVdUc0tKGt6iqx+tNJTv7h5YIjOnkHnjggXiH0CJWIugEVJXq6jlkZh7Y4m1yc4+mpmYegUD372BnjIktSwSdQCCwnkCgqFWJICfnaAArFRhj2s0SQSdQVTUHgIyMlieCzMzxJCX1Y+PGx2IVljEmQVgi6ARcIhAyMsa1eBuPx8dee11EaembbNmyNGaxGWO6P0sEnUBrGoq317fvfyPiY/366TGKzBjTnIyM5v+/rly5klGjRnVgNO1jiaATaG1D8VbJyX3JyzuVoqJHCIW2xCAyY0wisNtH46y+3jUUt6Z9YHv9+l1GcfFMNm16hr59fxHl6IzpeEuWXE119dyo7jMjYxxDhvx5t+tMnTqV/v37c9lllwFw22234fP5eP/99ykrK6OhoYE777yTyZMnt+rYdXV1XHLJJRQWFuLz+bj33ns58sgjWbhwIRdccAGBQIBwOMwLL7zAXnvtxRlnnMHatWsJhULcfPPNTJkypa2n3WKWCOJsa0NxW0oEANnZh5OWth/r1j1Anz4XICLRDM+YhDFlyhSuvvrqbYlg5syZvPXWW1x55ZVkZWWxefNmJkyYwEknndSq/2cPPPAAIsL8+fP57rvvOOaYY1i8eDEPPvggV111FWeddRaBQIBQKMTrr7/OXnvtxWuvvQa4Ae86giWCOGtsKN6/TduLCP36XcaSJZdSVTWbrKxDohugMR1sT7/cY2X//fdn06ZNrF+/nuLiYnJzc+nTpw/XXHMNH330ER6Ph3Xr1rFx40b69OnT4v1+8sknXHHFFQAMHz6cAQMGsHjxYn7wgx9w1113sXbtWk499VSGDBnC6NGjufbaa7nhhhs44YQTOPzww2N1ujuwNoI4q66eQ1rasHYNHte799mAh5KS16IXmDEJ6PTTT+f555/n2WefZcqUKTz11FMUFxczZ84c5s6dS+/evZuci6Atfv7znzNr1ixSU1M5/vjjee+99xg6dChfffUVo0eP5qabbuKOO+6IyrH2xEoEcVZVNYfc3KPbtQ+fLxOfL4tgsDw6QRmToKZMmcJ///d/s3nzZj788ENmzpxJr1698Pv9vP/++6xatarV+zz88MN56qmnOOqoo1i8eDGrV69m2LBhLF++nMGDB3PllVeyevVqvvnmG4YPH06PHj04++yzycnJ4Z///GcMznJXlgjiqL5+A4HAhjY3FG/P680mGKyMQlTGJK799tuPqqoq+vXrR9++fTnrrLM48cQTGT16NOPHj2f48OGt3uell17KJZdcwujRo/H5fDz66KMkJyczc+ZMnnjiCfx+P3369OHGG2/kyy+/5Prrr8fj8eD3+5k+vWNuDbf5COJo8+ZXWbDgRMaN+4icnPbVBX755RhSU/dh1KiXohSdMR3H5iOILpuPoAuprm59j+Lm+HxWIjDGtI1VDcVRVVVhpEdxZrv35fVmEQhsjEJUxpiWmj9/Puecc84O7yUnJ/PFF1/EKaK2sUQQJ6pKVVUhubnHRGV/Pl82tbVLorIvY+JBVbtcP5jRo0czd+7ceIexg7ZU91vVUJzU16+LDD3dZJVdq3m9WQSDHdP5xJhoS0lJoaSkpE1fYqaRqlJSUkJKSkqrtrMSQZxUVbkG72glAp8vm1DI2ghM11RQUMDatWspLraJltorJSWFgoKCVm1jiSBOXCLwkpExNir78/myCIfrCIcDeDxJUdmnMR3F7/czaNCgeIeRsGJWNSQiKSIyW0TmichCEbm9iXXOF5FiEZkbefy/WMXT2VRVFZKePgqvNy0q+/N6swDsziFjTKvFskRQDxylqtUi4gc+EZE3VPXzndZ7VlUvj2EcnY5rKP6SvLxTorZPny8bgFCoAsiL2n6NMd1fzBKBulaf6shLf+RhLUFAXd1KgsHSqLUPgJUIjDFtF9O7hkTEKyJzgU3AO6ra1M21PxWRb0TkeRHp38x+LhKRQhEp7A6NSdFuKIbtSwSWCIwxrRPTRKCqIVUdBxQAB4vIznO3/R8wUFXHAO8ATc7ErqozVHW8qo7Pz8+PZcgdoqqqEBE/GRmjo7ZPn29ricBuITXGtE6H9CNQ1XLgfWDSTu+XqGp95OU/gfaPvtYFVFV9SUbGWDye5Kjt0+t1JQKrGjLGtFYs7xrKF5GcyPNU4MfAdzut03e7lycBi2IVT2ehGqaqak5Uq4WgsUTgGouNMablYnnXUF/gMRHx4hLOTFV9VUTuAApVdRZwpYicBASBUuD8GMbTKdTWLiUUqoxBIrASgTGmbWJ519A3wC7zL6rqLds9/zXw61jF0BnFoqEYwONJRiTJ2giMMa1mYw11sLKy9/B6M0hL2y/q+/b5suyuIWNMq1ki6EChUC3Fxc+Rl3cqHk/0C2NuljIrERhjWscSQQcqKfk/QqFK+vQ5Nyb7txKBMaYtLBF0oKKix0lK6kdOzsSY7N/NUmYlAmNM61gi6CCBwCZKS9+kd++zcDdSRZ+bk8BKBMaY1rFE0EE2bXoGCNG79zl7XLet3JwEViIwxrSOJYIOsnHjE2RkjCMjY+dRNqLHSgTGmLawRNABamq+o6qqMKalAWicpcym+zPGtIYlgg5QVPQw4KFXr5/F9Dg+XxaqQcLh2pgexxjTvVgiiLH6+nWsW3c/vXpNITm57543aAebk8AY0xaWCGJsxYpbUQ0yaNBdMT/WjrOUGWNMy1giiKHq6gUUFT1Cv36Xk5oa+4m5rURgjGkLSwQxtHz5VLzeTAYM+E2HHK9xBFIrERhjWs4SQYyUlX1AaelrDBhwI35/zw45ZuOcBFYiMMa0nCWCGFm9+nckJfWjX78rOuyYjbOUWYnAGNNylghioL5+PWVl79K37y/welM77LhWIjDGtIUlghjYtOlpIEzv3md36HEbG4utRGCMaTlLBDGwceOTZGYeTFra0A49rsfjw+NJs7uGjDGtYokgyqqrF1BdPbfDSwNb2ZwExpjWskQQZRs3Pgl46dVrSlyOb7OUGWNayxJBFKmG2bTpKXr0OJakpF5xicFKBMaY1opZIhCRFBGZLSLzRGShiNzexDrJIvKsiCwVkS9EZGCs4ukI5eUfUV+/Nm7VQmCzlBljWi+WJYJ64ChVHQuMAyaJyISd1rkQKFPVfYH7gHtiGE/MFRU9gtebQV7e5LjFYHMSGGNaK2aJQJ3qyEt/5LHzQPmTgcciz58HjhYRiVVMsVRR8RkbNz5Bnz4X4vWmxS0Om6XMGNNaMW0jEBGviMwFNgHvqOoXO63SD1gDoKpBoALYZTwGEblIRApFpLC4uDiWIbdJOBzg++//H8nJ/Rg06LdxjcVKBMaY1oppIlDVkKqOAwqAg0WkTfM0quoMVR2vquPz8/OjGmM0rF79e7Zs+ZahQx/E58uMayyuRFCFajiucRhjuo4OuWtIVcuB94FJOy1aB/QHEBEfkA2UdERM0VJT8y2rVt1Fr14/o2fPn8Q7nMgwE0ooVL3HdY0xBmJ711C+iOREnqcCPwa+22m1WcB5keenAe9pF5pwNxisYtGic/B6M9l33z/HOxzAhpkwxrSeL4b77gs8JiJeXMKZqaqvisgdQKGqzgIeAp4QkaVAKXBmDOOJqlCojgULJlNdPY9Ro16OW7+BnTXOUmbtBMaYlolZIlDVb4D9m3j/lu2e1wGnxyqGWAmHg3z77ZmUl7/P8OFPkJd3QrxD2sZmKTPGtJb1LG6lhoZSFi36OSUlr7Dvvn+lT5/4dR5ris1SZoxprVhWDXU64TB42pj6VMMUFT3CsmU3EAyWM3jwPRQUXB7dAKPA5iQwxrRWwiSCDz6AK6+Ed96B3r1btk1DQzkVFZ9QUfERpaVvUFOzgOzswxgy5AEyMsbENN62slnKjDGtlTCJoEePDWRlzeXOO8PceqsCYVQbCIcbUA0QDFYSClXQ0FDKli3fUVOzgPr61QCIJJGVdTDDhz9O795n05k7P1uJwBjTWgmTCPr0+Zg773RDQy9Y0Px6Hk8qqalDyM4+jPT00WRlTSAr65AOnXKyPbzeDECsRGCMabGESQS5uUez//6f88tfCrNne3jiCWHfff2IuIfPl4XPl43HkxzvUNtFxIPXm0kwWB7vUIwxXUTCJAK/vyfZ2T35/e9h9Gg45xz44gtIi9/4cDGTkrI3dXUr4x2GMaaLSLjbR3v1gsceg2+/hWOPhfLyeEcUfWlpw9myZedO3MYY07SESwQAkybBM8+4EsGRR8KmTfGOKLrS0oZTW7uccLg+3qEYY7qAhEwEAKefDrNmwfffw+GHw7p18Y4oetLShgMhamuXxjsUY0wXkLCJAFzJ4J13YMMGV01UVhbviKIjLW0EgFUPGWNaJKETAcChh8LLL8OSJXDiiVBbG++I2i81dShgicAY0zIJnwgAjjoKnnwSPv0UzjwTgsF4R9Q+Pl8Gycn9LREYY1rEEkHE6afD/fe7doOHH453NO1ndw4ZY1rKEsF2LrkEhg6FF16IdyTttzURdKF5fowxcWKJYDsicPLJ8N57Xb9/QVracEKhaurru9HtUMaYmLBEsJOTT3ZtBG+8Ee9I2sfuHDLGtJQlgp0ccogbpvrll+MdSfu4vgSWCIwxe2aJYCceD0yeDK+/DvVduGNuUlIfvN4sSwTGmD2yRNCEk0+G6mrXVtBViYjdOWSMaRFLBE046ijIyOge1UOWCIwxe2KJoAnJyXDccfDKK26e464qLW04gcA6gkGbrcwY07wWJQIRuUpEssR5SES+EpFj9rBNfxF5X0S+FZGFInJVE+tMFJEKEZkbedzS1hOJtpNPho0b3QilXVVjg/H3cY7EGNOZtbRE8AtVrQSOAXKBc4C797BNELhWVUcCE4DLRGRkE+t9rKrjIo87Whp4rB1/PCQlwaOPxjuStrNbSI0xLdHSRLB1tvbjgSdUdeF27zVJVTeo6leR51XAIqBfWwPtaDk5cN55bhKboqJ4R9M2qan7IOKzRGCM2a2WJoI5IvI2LhG8JSKZQItrz0VkILA/0FRFyw9EZJ6IvCEi+zWz/UUiUigihcXFxS09bLtddx0EAjBtWocdMqo8Hj8pKYOorV0S71CMMZ1YSxPBhcBU4CBV3QL4gQtasqGIZAAvAFdHqpe29xUwQFXHAn8FXm5qH6o6Q1XHq+r4/Pz8FobcfkOHwqmnwt/+BpVdtL01KakPgUA3m4LNGBNVLU0EPwC+V9VyETkbuAmo2NNGIuLHJYGnVPXFnZeraqWqVkeevw74RSSvxdF3gBtugIoKmDEj3pG0jd+fT0ODJQJjTPNamgimA1tEZCxwLbAMeHx3G4iIAA8Bi1T13mbW6RNZDxE5OBJPSQtj6hAHHeT6Fdx7b9fsaZyU1IuGho6rTjPGdD0tTQRBdeMZTwbuV9UHgMw9bHMo7u6io7a7PfR4EblYRC6OrHMasEBE5gHTgDO1E46bfMMNbjrLJ5+MdySt5/f3oqGhhHC4i8+2Y4yJGV8L16sSkV/jvtgPFxEPrp2gWar6CXu+s+h+4P4WxhA3P/4xjB0L990Hv/iFG666q0hK6gUowWAJSUm94x2OMaYTammJYApQj+tPUAQUAH+MWVSdjAhccw0sXOgmu+9K/H7XuB4IWPWQMaZpLUoEkS//p4BsETkBqFPV3bYRdDdnnumGp77vvnhH0jp+fy8AazA2xjSrpUNMnAHMBk4HzgC+EJHTYhlYZ5OcDJddBm++CYsWxTualnNVQ9gtpMaYZrW0aug3uD4E56nqucDBwM2xC6tzuvhilxD+/Od4R9JyW6uG7M4hY0xzWpoIPKq6/U/KklZs223k58O558Ljj8PmzfGOpmX8/h6Ax6qGjDHNaumX+Zsi8paInC8i5wOvAa/HLqzO6+qroa4Opk+PdyQtI+LF78+zqiFjTLNa2lh8PTADGBN5zFDVG2IZWGc1ciSceKLrYFZWFu9oWsb1LraqIWNM01pcvaOqL6jqLyOPl2IZVGf3299CeTn86U/xjqRlkpJ6WYnAGNOs3SYCEakSkcomHlUi0kWHYWu/sWPhZz9zjcZdYYhq17vYEoExpmm7TQSqmqmqWU08MlU1q6OC7Ixuv92NPfS738U7kj2z8YaMMbuTcHf+RMuQIW64iQcfhJUr4x3N7vn9+QSD5YTDgXiHYozphCwRtMMtt4DHAzd38h4VWzuVWanAGNMUSwTtUFAA117rRiX98MN4R9O8rcNM2HhDxpimWCJop9/8BgYMgEsvhYaGeEfTtMbexdZgbIzZlSWCdkpLg7/+Fb79tvMOSGfjDRljdscSQRSceCJMnuzuJFq9Ot7R7KpxBFKrGjLG7MoSQZT85S/u7zXXxDeOpvh82Yj4rWrIGNMkSwRRMmAA/PrX8OKL8PHH8Y5mRyKC359vVUPGmCZZIoiiX/4S+vWD666DzjbzsnUqM8Y0xxJBFKWlwZ13wuzZMHNmvKPZkd9v4w0ZY5pmiSDKzjkHxoyBqVPdEBSdhRuB1BKBMWZXMUsEItJfRN4XkW9FZKGIXNXEOiIi00RkqYh8IyIHxCqejuL1ulFJV66E226D4k5SG2NVQ8aY5sSyRBAErlXVkcAE4DIRGbnTOscBQyKPi4AuMt3L7v34x+6W0rvvhl69XEPy1KnxbTfw+3sRClUTCm2JXxDGmE4pZolAVTeo6leR51XAIqDfTqtNBh5X53MgR0T6xiqmjvT88/D++/DHP8KIEXDPPfDyy/GLJynJ5i42xjStQ9oIRGQgsD/wxU6L+gFrtnu9ll2TBSJykYgUikhhcWepa9mDpCSYONHdQfTqqzB6NFx1FdTUxCceG2/IGNOcmCcCEckAXgCuVtU2TWajqjNUdbyqjs/Pz49ugB3A54MHHoA1a+Cuu+ITQ+MIpNZgbIzZUUwTgYj4cUngKVV9sYlV1gH9t3tdEHmv2zn8cDj3XNeQ/P33HX/8rQPP2S2kxpidxfKuIQEeAhap6r3NrDYLODdy99AEoEJVN8Qqpnj7wx9cX4PLL+/4hmMbb8gY05xYlggOBc4BjhKRuZHH8SJysYhcHFnndWA5sBT4B3BpDOOJu969XYezf/8bnn66Y4/t9abj8aRa1ZAxZhe+WO1YVT8BZA/rKHBZrGLojC65BJ54Aq6+Go49Fnr27Jjj2nhDxpjmWM/iDub1wj/+AWVlcP31HXvspKReBAJFHXtQY0ynZ4kgDsaMcUngkUfgvfc67rhpaSOpqfmm4w5ojOkSLBHEyc03wz77wEUXQUVFxxwzM3M8gUAR9fXrO+aAxpguwRJBnKSmwsMPw6pVcNppHTPfcWbmeACqqgpjfzBjTJdhiSCOjjjCtRf8+9+uZBDrW0ozMsYCHksExpgdxOyuIdMy55/vRiq9/XYYNAhuuSV2x/J600hP388SgTFmB1Yi6ARuvRXOO8/9fffd2B4rM3M8VVWFaGebQs0YEzeWCDoBEXjwQdd4fMklUFcXu2NlZo6noaGY+vo1e17ZGJMQLBF0EikpMH06LFnihqzeXlVV9I7T2GA8J3o7bUZZ2Qc2/4ExXYAlgk7kxz+Gn/0Mfvc7WLwYiorc1JfZ2a5RORrS08cg4ot5O0Fp6TvMm3ckRUWPxPQ4xpj2s0TQydx7r7u19JRTYNgwmDkThg+Hyy6Dzz9v//693hTS00e1KBHU1i5n/frWZyDVMMuXTwWgunpuq7c3xnQsSwSdTJ8+borLb7+FCRNg/nz45BMoKICf/tSVEtqrJQ3GwWA18+f/hMWLL6KmZlGr9l9c/BzV1V/h8aRRXT2/veEaY2LMEkEndPHFsGwZvPkmDB0KPXrASy+58YnOOKP9nc8yM8cTDJZSV7eyyeWqypIll7Jly/eAUFz8fIv3HQ43sGLFTaSnj6ZPnwuoqVmAarh9ARtjYsoSQSc1eLC7m2irsWPhn/+Ejz92t5qGQm3f9556GBcVPcrGjU8wYMAtZGcf2qpEsGHDQ9TWLmXQoN+RkTGWcLhmh4SjqsyffyJFRY+3/QSMMVFlHcq6kJ//3E13OXUqJCfDQw+Bpw2pPD19FCJ+Kis/xe/Po6zsberq1uD398Tny2bNmj+Rk3MkAwfezLp1uSxdejVbtiwmLW3obvfb0FDOqlW3k519GD17/oTKSjdFdU3NfFJTBwNQV7eCkpJXqa9fR58+57Y+eGNM1Fki6GJuuMH1M7jtNkhKcv0PZLezPuzK40kmPX0Ma9f+mbVr/4yIj6SkfgSDZYRClaSkDGTEiKcQ8ZKX91OWLr2a4uLnGTDgxmb3GQxW8c03k2hoKGHUqJcREdLT9wOguno+eXmTAaio+CTy3tfU1i7fliCMMfFjiaALuuUWqK+H3//evf7b39w8B60xcOAtlJW9R27u0eTkTMTnywQgHA4AHjwe908jJaWArKwf7JAIKio+Y8WKG8nPP40+fc4HYP7846munsN++z1PVtYhAPh8maSkDKKmprHBuKLiEzyeVMLhWoqLX2DvvTt4UgZjzC4sEXRBInDXXW6QurvvhupqePRR8Ptbvo+8vJPIyztpl/c9nqRd3svPP41ly66ltnYZICxYcBKhUA3l5R+wYsXNJCf3p6ZmASNHPr3tl/9W6emjd0kEOTlH0tCwieLi53dIBEuWXElx8YuEw3WEw7Xk5h7FyJHP4fWmtPzEjDGtZo3FXZSIKxH87nfwr3/B6ae7UkIs5Of/FIANGx5m/vwTUA0xfvw89t//P+TkHMmWLd8zfPij9Op1xi7bpqePZsuWxYTD9QQCm9myZRHZ2YeRn38aVVWzqatbBUBJyZusW/dX0tNH0avXmfTufTYlJa+yaNHPUW1Hy7gxZo+sRNDF/frXkJEBV17peiE/+2zr2wz2JCVlAJmZB7N69e8Q8TFmzDukpQ0BhpCd/UNUQ4g0XTeVkTEaCFFTs4j6+tUAZGcfTlJSH5Yvn0px8Yv063c5y5ZdQ0rKPowe/QoeTzIA6en7sXTpVSxefAlDh/4difaJGWMASwTdwhVXQG2ta0gePdrNfhZtvXqdSVXVbIYOfZDc3Ik7LGsuCYArEYC7c6imZj4iSWRmjsfrTSEjYxzFxc8j4mXLlu8YNaoxCQAUFFxJILCR1at/R3JyAQMHxnCMbmMSmCWCbuL662HBAteQvN9+cOqp0d1/QcFV9OhxLOnpI1u1XWrqEET81NQsoKLiYzIzD9pW55+ffxorVtxETc0CcnP/i549T9xl+0GD7qS2djGrV99D//7X4fWmReV8jDGNYtZGICIPi8gmEVnQzPKJIlIhInMjD/u51w4iMGMGHHKIqyL6+uto79/T6iQA4PH4SUsbQVXVbKqq5pCdfdi2ZXl5ru0hFKphn33ua7LqR0TYa6+LCYe3UFr6VttPwBjTrFg2Fj8KTNrDOh+r6rjI444YxpIQUlLcUBQ9esDEifDGG/GOyElPH015+QeoNpCTc/h27w+nR4/j2HvvqWRkjGp2++zsH+Hz9WDz5hc7IlxjEk7MEoGqfgSUxmr/pml9+8Knn7ppL084Af7yl9jPhbwnrsHYycr64Q7Lxox5ncGD79zt9h6Pj7y8yWze/H+Rfg67V1U1l7lzj6ShoaxtARuTYOJ9++gPRGSeiLwhIvs1t5KIXCQihSJSWFxc3JHxdUn9+7sRS088Ea6+Gs4+GzZujF88WxuM09NH4ffntmkfeXmnEgpVUFb23rb3VJVgsGKXdYuKHqG8/AM2bXq2bQEbk2DimQi+Agao6ljgr8DLza2oqjNUdbyqjs/Pz++o+Lq0jAx48UU3FMVzz7m5De6/v32D1bXV1kSwfftAa+Xm/hdeb+YO1UOLF1/E558PJhSq2WHd0lJXJ7Zx45NtPp4xiSRuiUBVK1W1OvL8dcAvInnxiqc78njg1lvdnAYHHeRuMz3iCNiwoWPjcLd+/pZ+/a5o8z683hR69vwJmze/jGqIoqLH2bDhnwSDpZSUvLptvdraZdTWLiElZR8qK/9Dbe2KaJyCMd1a3BKBiPSRyG0iInJwJJaSeMXTnQ0bBm+/DU88AXPnwvjxMHu2W/bdd3Ddde7205qa3e6mzUSEgQNvatNdR9vLyzuVhoZi1q//B4sXX0J29hEkJfXdoQqopMSVBoYNmwHApk3/atcxjUkEsbx99GngM2CYiKwVkQtF5GIRuTiyymnAAhGZB0wDztTdTZll2kXEtRV8+qkbtfSII+CHP4QRI2DaNPjf/4XDDoNVq+IdafN69DgOjyeFJUsuwetNZ+TIp8nPP42SktcJBisBVy2UmrovublHkZ19BBs3PrnbmdiMMbG9a+hnqtpXVf2qWqCqD6nqg6r6YGT5/aq6n6qOVdUJqvpprGIxjcaOhcJCOOYYqKiAe+6BtWvh9ddhxQpXWnjxRVi61A1m15n4fBnk5h4LCCNGPEly8l706jUF1Xo2b55FKFRHefn79OhxHAC9e5/Fli3fUV39VXwDN6aTs57FCahnT5g1a8f3Jk1y1UWTJ7u5kbcaOND1TRg3riMjbN6++95Lv36X0KPHMQBkZf2A5OQCioufJSkpn3C4dlsiyM8/nSVLrmDjxqfIzDwwnmEb06nF+/ZR04kMHepKC2++6Ya1vvtuCAbhRz+CDz+Md3ROaupgevQ4dttrEQ/5+WdQWvoWGzc+jceTQk7ORAD8/lx69vwJmzY9TTgcjFPExnR+lgjMDtLT4dhj3bzIN9wA//kP7LWXe++VV+IdXdNc9VADGzc+Rk7ORLze1G3Levc+h0CgiE2bnopjhMZ0bpYIzG7tvTd8/LFrW/jpT12JobPJzDyIlJRBANuqhbbKy5tMVtYEli27noYG6+huTFMsEZg9ysuDt96C3r3hF7+AwJ5HeehQIkKvXlOAXROBiIehQx+koaGU5ct/HY/wjOn0LBGYFsnJgenTXee0P/wh3tHsau+9b2TMmLcjE+bsKCNjLAUFV7FhwwwqKuzmNGN2ZonAtNhJJ8GUKfDb38K338Y7mh35fJn06PHjZpcPHHgbyckFLF58MeFwQwdGZkznJ12ts8348eO1sDNWVCeITZtcJ7SBA+HMM93MaF6vqzLq2zfe0e1ecfHLLFx4Cnl5pzJixFPbJsgxJhGIyBxVHd/kMksEprWefdb1Ug5ud0dmZibccQdcfjn4OnHvlLVr/8LSpVeTk3Mko0a9jM+XFe+QjOkQu0sEVjVkWm3KFCgrcz2PGxpgyRI3PMU118ABB8Ajj0BlZbyjbFpBwVWMGPEkFRUfM3fuRLZs+T7eIRkTd1YiMFGh6voZ3HADLF4MqaluPoQBA1zVkd/vbj8dOzbekTolJW+wcOHphMNbyMs7hb33nkpm5oGI2G8j0z1Z1ZDpMKrwxRdupNMXXnAlg1DIlRw8HrjySrj9dleVFG+BwCbWrp3GunX3Ewq5CW48nhQ8nnSSk/ciJWUwqamDUA1SX7+eQGADodCWbdt7PCn4/T3w+3vi8aSiGkQ1RFJSb/Lzf0pm5sFNzsMca7W1yykpeY2kpF7k55+GiBeAcLiBoqKHqa1dQc+ePyE7+4fbloVCNdTWLo0M470M1Qb22ut/8Pt7dnj8JjYsEZi4Ky2FG2+EGTNcT+Wnn4bDD9/zdh0hGKxk06ZnqK9fTzi8hVComvr6tdTVraC2dgUej5+kpL4kJfXF623MYOFwLQ0NJQSDpYTDtYAXES+BwAZUG0hJGUiPHseTkjKQ5OR+JCXtRVJSb5KSeuP1ZhIMlhIIFBMKVeD1ZuP398Tv74FIEiISmYGtlNraZdTVrSY1dRDp6WPwePxNnEMV69bdz6ZNT1NTM3/b++npoxg06E5AWLbsV9TWfo+rEQ7j9/ciPX0/amuXUl+/Zpd9+nw5DBhwC/36XYbHkxT9D74J4XAA1SBeb1qHHC+RWCIwncYXX7iG5qoq1ydh+wnn/vY3SEmBCy5ww2Z3VQ0N5Wze/DLFxc9SUfEJoVBrh3GVSDLwEg5v2WGJx5NCRsYBZGcfSnb24WRmjqe4eCarVt1FQ0Mx2dlHkJd3Mnl5J1FVNYcVK26mtnYxAKmpw9hnnz+Qk3MkpaVvsHnzS9TWLictbSipqcMif/clJWUwgcA6li69lrKyt0hOHkBOzkQyMsaRljaUhoZi6upWEwgUkZTUm5SUQaSkDMTrzcTjScLjScbrzcLny8Hj8RMKbaGubiW1tctpaNhMKFRJMFiJ15tOSspAUlIGUle3nOLiFygpeZVwuJbMzEPIzT2aHj2OIStrwraSi2k7SwSmU/nmGzdj2qRJ8PLL7kv/3nvh2mvd8l/8wiWF5OS4hhk1wWAl9fXrCATWEwhsIhDYSChUGSkB5OPzZRMMVmxXuqgnHK5HNUhycj9SU/chObk/tbVLqKz8gsrKz6mqKkS1sT9ETs7RDB78O7KyDt7h2OFwkE2bnkY1RO/eZzVZmtidkpI3Wbfur1RXf00gsOPUdj5fDsFg+W6393jSCYdbNuORz9eTvLyTSUrKp6zsPaqqCnEllzx69DieHj0mkZl5AKmp+1piaANLBKbTue8++OUv4e9/dw3L554Lp50Gw4fDnXfChAnw0EOuv0Ka1RLsIhSqparqSyorvyAz8wByc4+O+TEDgY3U1i7F7+9NcnIBXm8KoVAd9fWrqKtbRShUg2qAcLiOYLCSYLCcYLAcv78HKSmDSUkZRFJSb3y+LLzeTEKhKurqVlJXtxKfryfZ2Yfh8TTee9zQUE5Z2TuUlMyipOQ1gsEyADyeNNLTR0aq2vqSlNQLrzcLrzcDjyeFcLiGYLAqUhILoRpGNRiJp5SGhjLC4bpIm04Qny8Lvz8fv98VT8PhGkKhGkKhLYTDdYTDtZHXlZEJkEKIJEfakxr/iviBMKqKiCvVuSo12fZ5hMM1iPi3re+qwlzidyVBLyI+vN6MSKkqE1VFNYBqA717n02/fpe16fpZIjCdTjjsSgQff+wakn/0Izc5TnKya2Q+77zGqTMzMlyCmDwZTjkFRo7s2lVHpvXC4SA1NfOprp5HdfVctmxZRCBQRCCwgYaGzUBT32MeRHyRO8G8+HyuHcbny8XjSUHEj4g3UhorpqGhGBC83nQ8njS83jQ8nlQ8nlS83gx8vky83qxIlV195FEX+SJ3iQUk8lBUGwiHA0B4W1WZ15seeb8e1YZIskjB40mKzKQXIhxuiCSzSkKhSsCDx5OEiJ9evc6kb99ftOkztERgOqX1693tpHvvDe+/D1nb9e1atszNgbBxo3vMng2ffeaWDRniEsIpp8DBB7u7kUziUg0TCm0hFKoiHK6N/JrOjHzZ2y+GrSwRmE6rpMT94m9Je8CGDa6vwksvwXvvuZ7Nffq4aTePPdb9zcuLfczGdEWWCEy3U14Or70Gr74K77zjEkpKCjz4oKtWMsbsyIaYMN1OTg6cdZbrj7Bxo7st9Qc/gPPPh0sv7XxzJhjTmcUsEYjIwyKySUQWNLNcRGSaiCwVkW9E5IBYxWK6N6/XtRW8/Tb86ldu3oSJExsbm40xuxfLEsGjwKTdLD8OGBJ5XARMj2EsJgH4fHDPPa6U8Nln8L//G++IjOkaYpYIVPUjYHeTxE4GHlfncyBHRDr5iPamKzjzTDfA3R/+4BqYjTG7F882gn7A9gOcrI28twsRuUhECkWksLi4uEOCM13bPfe4doJbbol3JMZ0fl2isVhVZ6jqeFUdn7/94DTGNGOffdwkOQ8/7MY06myqquIdgTGN4pkI1gH9t3tdEHnPmKi46SbIzobrrnPDYzclGISvv4Ynn4Siol2Xl5TA0qVQXBy9O5FmzHCd58aNg9/8BuxuaBNv8UwEs4BzI3cPTQAqVNVqdE3U9OjhqobefhsKCuB//gdmzoT774eLL3azqmVluVnVzjnHfTG//77bNhx26/Xv73oy9+rlOr2NG+dmYKurc8nlyy9h6lS4/nr49ts9x1RZ6RLUqFEuSd1zjxuA79//3nG9cNgNtbFqVfs+A1WX5O66C1avbt++TPcVsw5lIvI0MBHIAzYCtwJ+AFV9UFzf7/txdxZtAS5Q1T3+NrIOZaY1wmH4179cb+S333bTawLk5sJ++8H48XDIIa6H8iWXuNnVfvMb+M9/XO/l445zjc+VlW5OheeegwUL3PDZ6emwcqW7W0nEjZl0+OFw0kmuc5vP58ZImjixMZ6bb3aD6s2e7RJAaSkceKBLCnPmuFthAR54wFVteTxw/PEucU2a1Li8JWpr3XaPP+5ei7jzue46OPLIaHy6sbVhg7tu5eVQUeGS+RVXxDuqrmt3HcoiI9t1nceBBx6oxrRFXZ3q7Nmq69aphsO7Lq+qUj3zTFVQzchQ/cc/dl0vHFZ9913Vn/5U9YQTVB95RLW0VHXTJtU//EF1333d9ts//vQnt+26dappaapTpuy4z3/9y6336KPu9erV7vhHHaV6002qffq45XvtpXrDDaoLF6quX686Z47qG2+45ztbsUL1gAPcdrfdprp8uerNN7t9eL2qzz/fss9szRrVZ59VLS9venlZmerHH6s+9ZR7Hi1VVarDhjV+hl6v+/vOO9E7RqIBCrWZ71UbYsKY7ai6UVBHjXLzLbdl+4oKVzoIBNxQ2zNnwq23ukH2Hn0UFi1yjdlbhcNu2O0NG+D77+GMM1wV1YIFMGiQ29f//Z/b9vXX3dSf20tKcsNq/OpXUFYGf/0rPPOMG977qafghBMa162uduMyzZ4NL77o5pWurHQlkM8/dyWkww5zpZ1p0+DZZ107Snq6mzDo7LNd/O+95wYF3L66aeRIF9/2n9uKFbB8uftVX17uqtSCQfcYNAiOPtqVhnZ2wQXw2GNuGJGtpZcRI1xV3ldfNV0yUnXn1xmmQe2MrERgTJwEg6oXXND4y/bKK5te78MP3fKJE93fe+9ter2iItXp01X/9jfVl15S/eAD1YsvVk1ObjxGRobqFVe4UkFTystVDzpINSlJ9fLLVXNz3XaDBqmK7Lifq692v8LPPVfV729clpenevrpqnffrfraa6qvvKKana3at6/q11+rfvWV6qmn7lo62vnh86kecYTqtGmuFKCq+uSTbtnNN+8Y98yZ7v1//KPxvVDIfXbXXqs6ZIhbPmyYO/8XXlB98UVX0po+3X1WNTWN2wYCqt9/r/r006rXXKN65JGqv/mNanV14zrhsOp776l+9FHTpcimLFvmPo9AoGXrb2/VKve5zZq167KKih1jay12UyKI+xd7ax+WCExXEwq5L5qBA10VUnNOOsn9jzzoIJdAWmPDBtU77nBfqBUVe16/tFR13Dh3vJNOUv3yy8b3X3tN9aGHdq3q2bBB9YknVL/5xp3TzhYsUO3fvzEpZWe7L/MPP1SdN0915Up3/qWlLhl99JHqjTc2xpGT4z6njAzVww5TbWjYcf/hsOoPf6jau7dqZaWr7jrySLdtUpLqpEmqt97q/qamNp14vF7VsWNVBw9urG4C1ZQU1TFj3PO993ZJ5LnnVPffv3GdMWNUH35YdckS1fffdwnm6adVi4tdfHV17hqkpLj1Bw92Sa2l1/Lbb1ULChqPd/vt7nMOBFQfeEA1P3/X5NgalgiM6QT29Ity8WLVH//YfaF2hKoqd8xoWrdO9ZRTVH/72+bbFZry2Weu3UXElVBWrWp6vS++cN9aRx+tmp6umpnpSkeVlTuuV1vr1v36a/cLfc0a1VdfdYln0iTXFnTTTa6N56uvGn+9f/SR6ujRjV/GQ4e6pPjQQzu+v/1DRHXCBLcuuJLSM8+4hAOqI0a4z2PhQvdvYPlyl1CuuUZ1xgyXJD//XLVnT5fkPvtM9Zxz3LaTJqkOH67bSouFhW24KBG7SwTWRmCM6TRWrHBfr4MHN7/O2We7to9jjoF//MNNbBRNwaC70yw9HU4+ubE9QtW1i6xc6Y65996uTeaNN1xbRn29ux342GPd+uGwax+aNq1xUqWcHNdWAuD3u/afrQYNckOq77OPO9a0aW4e7333hT/+0bX1tGeeHZuPwBjTbVRXu2HHjzqq60xZun69m1SpsND1W5k40TV+L1/uzmXFCrjwQujbd9ft8vNd0mgvSwTGGJPgbGIaY4wxzbJEYIwxCc4SgTHGJDhLBMYYk+AsERhjTIKzRGCMMQnOEoExxiQ4SwTGGJPgulyHMhEpBto6b1MesDmK4XQViXjeiXjOkJjnnYjnDK0/7wGq2uSk710uEbSHiBQ217OuO0vE807Ec4bEPO9EPGeI7nlb1ZAxxiQ4SwTGGJPgEi0RzIh3AHGSiOediOcMiXneiXjOEMXzTqg2AmOMMbtKtBKBMcaYnVgiMMaYBJcwiUBEJonI9yKyVESmxjueWBCR/iLyvoh8KyILReSqyPs9ROQdEVkS+Zsb71hjQUS8IvK1iLwaeT1IRL6IXPNnRSQp3jFGk4jkiMjzIvKdiCwSkR8kwrUWkWsi/74XiMjTIpLSHa+1iDwsIptEZMF27zV5fcWZFjn/b0TkgNYcKyESgYh4gQeA44CRwM9EZGR8o4qJIHCtqo4EJgCXRc5zKvCuqg4B3o287o6uAhZt9/oe4D5V3RcoAy6MS1Sx8xfgTVUdDozFnXu3vtYi0g+4EhivqqMAL3Am3fNaPwpM2um95q7vccCQyOMiYHprDpQQiQA4GFiqqstVNQA8A0yOc0xRp6obVPWryPMq3BdDP9y5PhZZ7THg5LgEGEMiUgD8BPhn5LUARwHPR1bpVuctItnAEcBDAKoaUNVyEuBaAz4gVUR8QBqwgW54rVX1I6B0p7ebu76TgcfV+RzIEZGdZkBuXqIkgn7Amu1er428122JyEBgf+ALoLeqbogsKgJ6xyuuGPoz8CsgHHndEyhX1WDkdXe75oOAYuCRSHXYP0UknW5+rVV1HfAnYDUuAVQAc+je13p7zV3fdn3HJUoiSCgikgG8AFytqpXbL1N3v3C3umdYRE4ANqnqnHjH0oF8wAHAdFXdH6hhp2qgbnqtc3G/fgcBewHp7Fp9khCieX0TJRGsA/pv97og8l63IyJ+XBJ4SlVfjLy9cWsxMfJ3U7zii5FDgZNEZCWu2u8oXP15TqT6ALrfNV8LrFXVLyKvn8clhu5+rf8LWKGqxaraALyIu/7d+Vpvr7nr267vuERJBF8CQyJ3FiThGpdmxTmmqIvUiz8ELFLVe7dbNAs4L/L8POCVjo4tllT116paoKoDcdf2PVU9C3gfOC2yWrc6b1UtAtaIyLDIW0cD39LNrzWuSmiCiKRF/r1vPe9ue6130tz1nQWcG7l7aAJQsV0V0p6pakI8gOOBxcAy4DfxjidG53gYrqj4DTA38jgeV1/+LrAE+DfQI96xxvAzmAi8Gnk+GJgNLAWeA5LjHV+Uz3UcUBi53i8DuYlwrYHbge+ABcATQHJ3vNbA07h2kAZcCfDC5q4vILg7I5cB83F3VbX4WDbEhDHGJLhEqRoyxhjTDEsExhiT4CwRGGNMgrNEYIwxCc4SgTHGJDhLBMbEmIhM3DoiqjGdkSUCY4xJcJYIjIkQkbNFZLaIzBWRv0fmN6gWkfsi49+/KyL5kXXHicjnkbHfX9puXPh9ReTfIjJPRL4SkX0iu8/Ybu6ApyK9YhGRuyPzR3wjIn+K06mbBGeJwBhAREYAU4BDVXUcEALOwg1qVqiq+wEfArdGNnkcuEFVx+B6cm59/yngAVUdC/wQ1zMU3EiwV+PmwxgMHCoiPYFTgP0i+7kzludoTHMsERjjHA0cCHwpInMjrwfjhrV+NrLOk8BhkbkAclT1w8j7jwFHiEgm0E9VXwJQ1TpV3RJZZ7aqrlXVMG7oj4G4IZTrgIdE5FRg67rGdChLBMY4AjymquMij2GqelsT67V1TJb67Z6HAJ+68fMPxo0cegLwZhv3bUy7WCIwxnkXOE1EesG2uWEH4P6PbB3V8ufAJ6paAZSJyOGR988BPlQ3K9xaETk5so9kEUlr7oCReSOyVfV14BrcdJPGdDjfnlcxpvtT1W9F5CbgbRHx4EZ8vAw34cvBkWWbcO0I4IYAfjDyRb8cuCDy/jnA30Xkjsg+Tt/NYTOBV0QkBVci+WWUT8uYFrHRR43ZDRGpVtWMeMdhTCxZ1ZAxxiQ4KxEYY0yCsxKBMcYkOEsExhiT4CwRGGNMgrNEYIwxCc4SgTHGJLj/D58y2CFbvEAOAAAAAElFTkSuQmCC\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# 画出训练集loss曲线图\n", + "plt.plot(np.arange(epochs),history.history['loss'],c='b',label='train_loss')\n", + "# 画出验证集loss曲线图\n", + "plt.plot(np.arange(epochs),history.history['val_loss'],c='y',label='val_loss')\n", + "# 图例\n", + "plt.legend()\n", + "# x坐标描述\n", + "plt.xlabel('epochs')\n", + "# y坐标描述\n", + "plt.ylabel('loss')\n", + "# 显示图像\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "39e93c3c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python [conda env:tf2.3]", + "language": "python", + "name": "conda-env-tf2.3-py" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.13" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +}