From ca843cc5c89aa1cc4e065c7d91185a12357f8a89 Mon Sep 17 00:00:00 2001 From: interface_xiongtete <1144722582@qq.com> Date: Sun, 21 Aug 2022 16:10:08 +0800 Subject: [PATCH] =?UTF-8?q?ECA-Net=E9=80=9A=E9=81=93=E6=B3=A8=E6=84=8F?= =?UTF-8?q?=E5=8A=9B=E6=9C=BA=E5=88=B6=E5=A4=8D=E7=8E=B0=20ECA-ResNet50?= =?UTF-8?q?=E8=8A=B1=E6=9C=B5=E8=AF=86=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + .../ECANet.py" | 15 +- ...346\234\265\350\257\206\345\210\253.ipynb" | 1170 +++++++++++++++++ .../ECANet/ECANet-block.py" | 37 + .../ECANet/img/ECANet-block.png" | Bin 0 -> 30489 bytes 5 files changed, 1216 insertions(+), 7 deletions(-) create mode 100644 "\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/ECA-ResNet50\350\212\261\346\234\265\350\257\206\345\210\253.ipynb" create mode 100644 "\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/ECANet-block.py" create mode 100644 "\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/img/ECANet-block.png" diff --git a/.gitignore b/.gitignore index 9666ffa..e319841 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,4 @@ /经典网络/ShuffleNet/checkpoint/ /经典网络/ShuffleNet/checkpoint_v2/ /经典网络/ResNext/checkpoint/ +/经典网络/ECANet/checkpoint/ diff --git "a/\345\276\252\347\216\257\347\245\236\347\273\217\347\275\221\347\273\234/Attention/\345\233\276\345\203\217\344\270\255\347\232\204\346\263\250\346\204\217\345\212\233\346\234\272\345\210\266/ECANet.py" "b/\345\276\252\347\216\257\347\245\236\347\273\217\347\275\221\347\273\234/Attention/\345\233\276\345\203\217\344\270\255\347\232\204\346\263\250\346\204\217\345\212\233\346\234\272\345\210\266/ECANet.py" index 1e52bc5..b895999 100644 --- "a/\345\276\252\347\216\257\347\245\236\347\273\217\347\275\221\347\273\234/Attention/\345\233\276\345\203\217\344\270\255\347\232\204\346\263\250\346\204\217\345\212\233\346\234\272\345\210\266/ECANet.py" +++ "b/\345\276\252\347\216\257\347\245\236\347\273\217\347\275\221\347\273\234/Attention/\345\233\276\345\203\217\344\270\255\347\232\204\346\263\250\346\204\217\345\212\233\346\234\272\345\210\266/ECANet.py" @@ -1,7 +1,6 @@ import math import tensorflow as tf -from keras import backend as K from keras.layers import (Activation, Add, Concatenate, Conv1D, Conv2D, Dense, GlobalAveragePooling2D, GlobalMaxPooling2D, Lambda, BatchNormalization, Reshape, multiply,Input) @@ -10,16 +9,18 @@ from keras.models import Model ECA模块的思想是非常简单的,它去除了原来SE模块中的全连接层, 直接在全局平均池化之后的特征上通过一个1D卷积进行学习。 ''' -def eca_block(input_feature, b=1, gamma=2, name=""): - channel = input_feature._keras_shape[-1] +def ECA_Block(input_feature, b=1, gamma=2, name=""): + channel = input_feature.shape[-1] + # 根据公式计算自适应卷积核大小 kernel_size = int(abs((math.log(channel, 2) + b) / gamma)) + # 如果是kernel_size是偶数,就使用,否则变成偶数 kernel_size = kernel_size if kernel_size % 2 else kernel_size + 1 # [c] - avg_pool = GlobalAveragePooling2D()(input_feature) + x = GlobalAveragePooling2D()(input_feature) # [c,1] - x = Reshape((-1, 1))(avg_pool) + x = Reshape((-1, 1))(x) # - x = Conv1D(1, kernel_size=kernel_size, padding="same", name="eca_layer_" + str(name), use_bias=False, )(x) + x = Conv1D(1, kernel_size=kernel_size, padding="same",use_bias=False,name="eca_layer_" + str(name))(x) x = Activation('sigmoid')(x) # [c,1]=>[1,1,c] x = Reshape((1, 1, -1))(x) @@ -29,6 +30,6 @@ def eca_block(input_feature, b=1, gamma=2, name=""): if __name__ == '__main__': inputs=Input([26,26,512]) - x=eca_block(inputs) + x=ECA_Block(inputs) model=Model(inputs,x) model.summary() \ No newline at end of file diff --git "a/\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/ECA-ResNet50\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/ECANet/ECA-ResNet50\350\212\261\346\234\265\350\257\206\345\210\253.ipynb" new file mode 100644 index 0000000..1edfc9a --- /dev/null +++ "b/\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/ECA-ResNet50\350\212\261\346\234\265\350\257\206\345\210\253.ipynb" @@ -0,0 +1,1170 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "c2bf30a5", + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import math\n", + "import os\n", + "import tensorflow as tf\n", + "from tensorflow.keras.preprocessing.image import ImageDataGenerator\n", + "from tensorflow.keras.utils import to_categorical\n", + "from tensorflow.keras.models import Sequential\n", + "from tensorflow.keras.layers import Input, Dense, Dropout, Conv2D, MaxPool2D, Flatten, GlobalAvgPool2D, \\\n", + " BatchNormalization, Activation, Add, ZeroPadding2D, Multiply,Conv1D,GlobalAveragePooling2D,Reshape,multiply\n", + "from tensorflow.keras.optimizers import Adam\n", + "import matplotlib.pyplot as plt\n", + "from tensorflow.keras.callbacks import LearningRateScheduler\n", + "from tensorflow.keras.models import Model" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "60cf917a", + "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": 3, + "id": "20fcbfe1", + "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", + "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", + "# 训练集数据生成器,可以在训练时自动产生数据进行训练\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)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "b3f28936", + "metadata": {}, + "outputs": [], + "source": [ + "'''\n", + "ECA模块的思想是非常简单的,它去除了原来SE模块中的全连接层,\n", + "直接在全局平均池化之后的特征上通过一个1D卷积进行学习。\n", + "'''\n", + "def eca_block(input_feature, b=1, gamma=2):\n", + " channel = input_feature.shape[-1]\n", + " # 根据公式计算自适应卷积核大小\n", + " kernel_size = int(abs((math.log(channel, 2) + b) / gamma))\n", + " # 如果是kernel_size是偶数,就使用,否则变成偶数\n", + " kernel_size = kernel_size if kernel_size % 2 else kernel_size + 1\n", + " # [c]\n", + " x = GlobalAveragePooling2D()(input_feature)\n", + " # [c,1]\n", + " x = Reshape((-1, 1))(x)\n", + " #\n", + " x = Conv1D(1, kernel_size=kernel_size, padding=\"same\",use_bias=False)(x)\n", + " x = Activation('sigmoid')(x)\n", + " # [c,1]=>[1,1,c]\n", + " x = Reshape((1, 1, -1))(x)\n", + "\n", + " output = multiply([input_feature, x])\n", + " return output" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "c6a1443f", + "metadata": {}, + "outputs": [], + "source": [ + "# 定义残差单元\n", + "def block(x, filters, strides=1, conv_shortcut=True):\n", + " # projection shortcut\n", + " if conv_shortcut == True:\n", + " shortcut = Conv2D(filters * 4, kernel_size=1, strides=strides, padding='valid')(x)\n", + " # epsilon为BN公式中防止分母为零的值\n", + " shortcut = BatchNormalization(epsilon=1.001e-5)(shortcut)\n", + " else:\n", + " # identity_shortcut\n", + " shortcut = x\n", + " # 3个卷积层\n", + " x = Conv2D(filters=filters, kernel_size=1, strides=strides, padding='valid')(x)\n", + " x = BatchNormalization(epsilon=1.001e-5)(x)\n", + " x = Activation('relu')(x)\n", + "\n", + " x = Conv2D(filters=filters, kernel_size=3, strides=1, padding='same')(x)\n", + " x = BatchNormalization(epsilon=1.001e-5)(x)\n", + " x = Activation('relu')(x)\n", + "\n", + " x = Conv2D(filters=filters * 4, kernel_size=1, strides=1, padding='valid')(x)\n", + " x = BatchNormalization(epsilon=1.001e-5)(x)\n", + "\n", + " # SE模块\n", + " x = eca_block(x)\n", + "\n", + " x = Add()([x, shortcut])\n", + " x = Activation('relu')(x)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "237f2539", + "metadata": {}, + "outputs": [], + "source": [ + "# 堆叠残差单元\n", + "def stack(x, filters, blocks, strides):\n", + " x = block(x, filters, strides=strides)\n", + " for i in range(blocks - 1):\n", + " x = block(x, filters, conv_shortcut=False)\n", + " return x" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "f3c610e1", + "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", + "zero_padding2d (ZeroPadding2D) (None, 230, 230, 3) 0 input_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d (Conv2D) (None, 112, 112, 64) 9472 zero_padding2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization (BatchNorma (None, 112, 112, 64) 256 conv2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation (Activation) (None, 112, 112, 64) 0 batch_normalization[0][0] \n", + "__________________________________________________________________________________________________\n", + "zero_padding2d_1 (ZeroPadding2D (None, 114, 114, 64) 0 activation[0][0] \n", + "__________________________________________________________________________________________________\n", + "max_pooling2d (MaxPooling2D) (None, 56, 56, 64) 0 zero_padding2d_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_2 (Conv2D) (None, 56, 56, 64) 4160 max_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_2 (BatchNor (None, 56, 56, 64) 256 conv2d_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_1 (Activation) (None, 56, 56, 64) 0 batch_normalization_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_3 (Conv2D) (None, 56, 56, 64) 36928 activation_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_3 (BatchNor (None, 56, 56, 64) 256 conv2d_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_2 (Activation) (None, 56, 56, 64) 0 batch_normalization_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_4 (Conv2D) (None, 56, 56, 256) 16640 activation_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_4 (BatchNor (None, 56, 56, 256) 1024 conv2d_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d (Globa (None, 256) 0 batch_normalization_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape (Reshape) (None, 256, 1) 0 global_average_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d (Conv1D) (None, 256, 1) 5 reshape[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_3 (Activation) (None, 256, 1) 0 conv1d[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_1 (Reshape) (None, 1, 1, 256) 0 activation_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_1 (Conv2D) (None, 56, 56, 256) 16640 max_pooling2d[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply (Multiply) (None, 56, 56, 256) 0 batch_normalization_4[0][0] \n", + " reshape_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_1 (BatchNor (None, 56, 56, 256) 1024 conv2d_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "add (Add) (None, 56, 56, 256) 0 multiply[0][0] \n", + " batch_normalization_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_4 (Activation) (None, 56, 56, 256) 0 add[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_5 (Conv2D) (None, 56, 56, 64) 16448 activation_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_5 (BatchNor (None, 56, 56, 64) 256 conv2d_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_5 (Activation) (None, 56, 56, 64) 0 batch_normalization_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_6 (Conv2D) (None, 56, 56, 64) 36928 activation_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_6 (BatchNor (None, 56, 56, 64) 256 conv2d_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_6 (Activation) (None, 56, 56, 64) 0 batch_normalization_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_7 (Conv2D) (None, 56, 56, 256) 16640 activation_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_7 (BatchNor (None, 56, 56, 256) 1024 conv2d_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_1 (Glo (None, 256) 0 batch_normalization_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_2 (Reshape) (None, 256, 1) 0 global_average_pooling2d_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_1 (Conv1D) (None, 256, 1) 5 reshape_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_7 (Activation) (None, 256, 1) 0 conv1d_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_3 (Reshape) (None, 1, 1, 256) 0 activation_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_1 (Multiply) (None, 56, 56, 256) 0 batch_normalization_7[0][0] \n", + " reshape_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_1 (Add) (None, 56, 56, 256) 0 multiply_1[0][0] \n", + " activation_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_8 (Activation) (None, 56, 56, 256) 0 add_1[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_8 (Conv2D) (None, 56, 56, 64) 16448 activation_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_8 (BatchNor (None, 56, 56, 64) 256 conv2d_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_9 (Activation) (None, 56, 56, 64) 0 batch_normalization_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_9 (Conv2D) (None, 56, 56, 64) 36928 activation_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_9 (BatchNor (None, 56, 56, 64) 256 conv2d_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_10 (Activation) (None, 56, 56, 64) 0 batch_normalization_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_10 (Conv2D) (None, 56, 56, 256) 16640 activation_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_10 (BatchNo (None, 56, 56, 256) 1024 conv2d_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_2 (Glo (None, 256) 0 batch_normalization_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_4 (Reshape) (None, 256, 1) 0 global_average_pooling2d_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_2 (Conv1D) (None, 256, 1) 5 reshape_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_11 (Activation) (None, 256, 1) 0 conv1d_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_5 (Reshape) (None, 1, 1, 256) 0 activation_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_2 (Multiply) (None, 56, 56, 256) 0 batch_normalization_10[0][0] \n", + " reshape_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_2 (Add) (None, 56, 56, 256) 0 multiply_2[0][0] \n", + " activation_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_12 (Activation) (None, 56, 56, 256) 0 add_2[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_12 (Conv2D) (None, 28, 28, 128) 32896 activation_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_12 (BatchNo (None, 28, 28, 128) 512 conv2d_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_13 (Activation) (None, 28, 28, 128) 0 batch_normalization_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_13 (Conv2D) (None, 28, 28, 128) 147584 activation_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_13 (BatchNo (None, 28, 28, 128) 512 conv2d_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_14 (Activation) (None, 28, 28, 128) 0 batch_normalization_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_14 (Conv2D) (None, 28, 28, 512) 66048 activation_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_14 (BatchNo (None, 28, 28, 512) 2048 conv2d_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_3 (Glo (None, 512) 0 batch_normalization_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_6 (Reshape) (None, 512, 1) 0 global_average_pooling2d_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_3 (Conv1D) (None, 512, 1) 5 reshape_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_15 (Activation) (None, 512, 1) 0 conv1d_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_7 (Reshape) (None, 1, 1, 512) 0 activation_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_11 (Conv2D) (None, 28, 28, 512) 131584 activation_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_3 (Multiply) (None, 28, 28, 512) 0 batch_normalization_14[0][0] \n", + " reshape_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_11 (BatchNo (None, 28, 28, 512) 2048 conv2d_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_3 (Add) (None, 28, 28, 512) 0 multiply_3[0][0] \n", + " batch_normalization_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_16 (Activation) (None, 28, 28, 512) 0 add_3[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_15 (Conv2D) (None, 28, 28, 128) 65664 activation_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_15 (BatchNo (None, 28, 28, 128) 512 conv2d_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_17 (Activation) (None, 28, 28, 128) 0 batch_normalization_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_16 (Conv2D) (None, 28, 28, 128) 147584 activation_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_16 (BatchNo (None, 28, 28, 128) 512 conv2d_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_18 (Activation) (None, 28, 28, 128) 0 batch_normalization_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_17 (Conv2D) (None, 28, 28, 512) 66048 activation_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_17 (BatchNo (None, 28, 28, 512) 2048 conv2d_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_4 (Glo (None, 512) 0 batch_normalization_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_8 (Reshape) (None, 512, 1) 0 global_average_pooling2d_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_4 (Conv1D) (None, 512, 1) 5 reshape_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_19 (Activation) (None, 512, 1) 0 conv1d_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_9 (Reshape) (None, 1, 1, 512) 0 activation_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_4 (Multiply) (None, 28, 28, 512) 0 batch_normalization_17[0][0] \n", + " reshape_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_4 (Add) (None, 28, 28, 512) 0 multiply_4[0][0] \n", + " activation_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_20 (Activation) (None, 28, 28, 512) 0 add_4[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_18 (Conv2D) (None, 28, 28, 128) 65664 activation_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_18 (BatchNo (None, 28, 28, 128) 512 conv2d_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_21 (Activation) (None, 28, 28, 128) 0 batch_normalization_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_19 (Conv2D) (None, 28, 28, 128) 147584 activation_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_19 (BatchNo (None, 28, 28, 128) 512 conv2d_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_22 (Activation) (None, 28, 28, 128) 0 batch_normalization_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_20 (Conv2D) (None, 28, 28, 512) 66048 activation_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_20 (BatchNo (None, 28, 28, 512) 2048 conv2d_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_5 (Glo (None, 512) 0 batch_normalization_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_10 (Reshape) (None, 512, 1) 0 global_average_pooling2d_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_5 (Conv1D) (None, 512, 1) 5 reshape_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_23 (Activation) (None, 512, 1) 0 conv1d_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_11 (Reshape) (None, 1, 1, 512) 0 activation_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_5 (Multiply) (None, 28, 28, 512) 0 batch_normalization_20[0][0] \n", + " reshape_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_5 (Add) (None, 28, 28, 512) 0 multiply_5[0][0] \n", + " activation_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_24 (Activation) (None, 28, 28, 512) 0 add_5[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_21 (Conv2D) (None, 28, 28, 128) 65664 activation_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_21 (BatchNo (None, 28, 28, 128) 512 conv2d_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_25 (Activation) (None, 28, 28, 128) 0 batch_normalization_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_22 (Conv2D) (None, 28, 28, 128) 147584 activation_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_22 (BatchNo (None, 28, 28, 128) 512 conv2d_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_26 (Activation) (None, 28, 28, 128) 0 batch_normalization_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_23 (Conv2D) (None, 28, 28, 512) 66048 activation_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_23 (BatchNo (None, 28, 28, 512) 2048 conv2d_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_6 (Glo (None, 512) 0 batch_normalization_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_12 (Reshape) (None, 512, 1) 0 global_average_pooling2d_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_6 (Conv1D) (None, 512, 1) 5 reshape_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_27 (Activation) (None, 512, 1) 0 conv1d_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_13 (Reshape) (None, 1, 1, 512) 0 activation_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_6 (Multiply) (None, 28, 28, 512) 0 batch_normalization_23[0][0] \n", + " reshape_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_6 (Add) (None, 28, 28, 512) 0 multiply_6[0][0] \n", + " activation_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_28 (Activation) (None, 28, 28, 512) 0 add_6[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_25 (Conv2D) (None, 14, 14, 256) 131328 activation_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_25 (BatchNo (None, 14, 14, 256) 1024 conv2d_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_29 (Activation) (None, 14, 14, 256) 0 batch_normalization_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_26 (Conv2D) (None, 14, 14, 256) 590080 activation_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_26 (BatchNo (None, 14, 14, 256) 1024 conv2d_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_30 (Activation) (None, 14, 14, 256) 0 batch_normalization_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_27 (Conv2D) (None, 14, 14, 1024) 263168 activation_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_27 (BatchNo (None, 14, 14, 1024) 4096 conv2d_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_7 (Glo (None, 1024) 0 batch_normalization_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_14 (Reshape) (None, 1024, 1) 0 global_average_pooling2d_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_7 (Conv1D) (None, 1024, 1) 5 reshape_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_31 (Activation) (None, 1024, 1) 0 conv1d_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_15 (Reshape) (None, 1, 1, 1024) 0 activation_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_24 (Conv2D) (None, 14, 14, 1024) 525312 activation_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_7 (Multiply) (None, 14, 14, 1024) 0 batch_normalization_27[0][0] \n", + " reshape_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_24 (BatchNo (None, 14, 14, 1024) 4096 conv2d_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_7 (Add) (None, 14, 14, 1024) 0 multiply_7[0][0] \n", + " batch_normalization_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_32 (Activation) (None, 14, 14, 1024) 0 add_7[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_28 (Conv2D) (None, 14, 14, 256) 262400 activation_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_28 (BatchNo (None, 14, 14, 256) 1024 conv2d_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_33 (Activation) (None, 14, 14, 256) 0 batch_normalization_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_29 (Conv2D) (None, 14, 14, 256) 590080 activation_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_29 (BatchNo (None, 14, 14, 256) 1024 conv2d_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_34 (Activation) (None, 14, 14, 256) 0 batch_normalization_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_30 (Conv2D) (None, 14, 14, 1024) 263168 activation_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_30 (BatchNo (None, 14, 14, 1024) 4096 conv2d_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_8 (Glo (None, 1024) 0 batch_normalization_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_16 (Reshape) (None, 1024, 1) 0 global_average_pooling2d_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_8 (Conv1D) (None, 1024, 1) 5 reshape_16[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_35 (Activation) (None, 1024, 1) 0 conv1d_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_17 (Reshape) (None, 1, 1, 1024) 0 activation_35[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_8 (Multiply) (None, 14, 14, 1024) 0 batch_normalization_30[0][0] \n", + " reshape_17[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_8 (Add) (None, 14, 14, 1024) 0 multiply_8[0][0] \n", + " activation_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_36 (Activation) (None, 14, 14, 1024) 0 add_8[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_31 (Conv2D) (None, 14, 14, 256) 262400 activation_36[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_31 (BatchNo (None, 14, 14, 256) 1024 conv2d_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_37 (Activation) (None, 14, 14, 256) 0 batch_normalization_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_32 (Conv2D) (None, 14, 14, 256) 590080 activation_37[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_32 (BatchNo (None, 14, 14, 256) 1024 conv2d_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_38 (Activation) (None, 14, 14, 256) 0 batch_normalization_32[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_33 (Conv2D) (None, 14, 14, 1024) 263168 activation_38[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_33 (BatchNo (None, 14, 14, 1024) 4096 conv2d_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_9 (Glo (None, 1024) 0 batch_normalization_33[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_18 (Reshape) (None, 1024, 1) 0 global_average_pooling2d_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv1d_9 (Conv1D) (None, 1024, 1) 5 reshape_18[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_39 (Activation) (None, 1024, 1) 0 conv1d_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_19 (Reshape) (None, 1, 1, 1024) 0 activation_39[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_9 (Multiply) (None, 14, 14, 1024) 0 batch_normalization_33[0][0] \n", + " reshape_19[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_9 (Add) (None, 14, 14, 1024) 0 multiply_9[0][0] \n", + " activation_36[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_40 (Activation) (None, 14, 14, 1024) 0 add_9[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_34 (Conv2D) (None, 14, 14, 256) 262400 activation_40[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_34 (BatchNo (None, 14, 14, 256) 1024 conv2d_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_41 (Activation) (None, 14, 14, 256) 0 batch_normalization_34[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_35 (Conv2D) (None, 14, 14, 256) 590080 activation_41[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_35 (BatchNo (None, 14, 14, 256) 1024 conv2d_35[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_42 (Activation) (None, 14, 14, 256) 0 batch_normalization_35[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_36 (Conv2D) (None, 14, 14, 1024) 263168 activation_42[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_36 (BatchNo (None, 14, 14, 1024) 4096 conv2d_36[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_10 (Gl (None, 1024) 0 batch_normalization_36[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_20 (Reshape) (None, 1024, 1) 0 global_average_pooling2d_10[0][0]\n", + "__________________________________________________________________________________________________\n", + "conv1d_10 (Conv1D) (None, 1024, 1) 5 reshape_20[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_43 (Activation) (None, 1024, 1) 0 conv1d_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_21 (Reshape) (None, 1, 1, 1024) 0 activation_43[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_10 (Multiply) (None, 14, 14, 1024) 0 batch_normalization_36[0][0] \n", + " reshape_21[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_10 (Add) (None, 14, 14, 1024) 0 multiply_10[0][0] \n", + " activation_40[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_44 (Activation) (None, 14, 14, 1024) 0 add_10[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_37 (Conv2D) (None, 14, 14, 256) 262400 activation_44[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_37 (BatchNo (None, 14, 14, 256) 1024 conv2d_37[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_45 (Activation) (None, 14, 14, 256) 0 batch_normalization_37[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_38 (Conv2D) (None, 14, 14, 256) 590080 activation_45[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_38 (BatchNo (None, 14, 14, 256) 1024 conv2d_38[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_46 (Activation) (None, 14, 14, 256) 0 batch_normalization_38[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_39 (Conv2D) (None, 14, 14, 1024) 263168 activation_46[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_39 (BatchNo (None, 14, 14, 1024) 4096 conv2d_39[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_11 (Gl (None, 1024) 0 batch_normalization_39[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_22 (Reshape) (None, 1024, 1) 0 global_average_pooling2d_11[0][0]\n", + "__________________________________________________________________________________________________\n", + "conv1d_11 (Conv1D) (None, 1024, 1) 5 reshape_22[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_47 (Activation) (None, 1024, 1) 0 conv1d_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_23 (Reshape) (None, 1, 1, 1024) 0 activation_47[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_11 (Multiply) (None, 14, 14, 1024) 0 batch_normalization_39[0][0] \n", + " reshape_23[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_11 (Add) (None, 14, 14, 1024) 0 multiply_11[0][0] \n", + " activation_44[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_48 (Activation) (None, 14, 14, 1024) 0 add_11[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_40 (Conv2D) (None, 14, 14, 256) 262400 activation_48[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_40 (BatchNo (None, 14, 14, 256) 1024 conv2d_40[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_49 (Activation) (None, 14, 14, 256) 0 batch_normalization_40[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_41 (Conv2D) (None, 14, 14, 256) 590080 activation_49[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_41 (BatchNo (None, 14, 14, 256) 1024 conv2d_41[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_50 (Activation) (None, 14, 14, 256) 0 batch_normalization_41[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_42 (Conv2D) (None, 14, 14, 1024) 263168 activation_50[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_42 (BatchNo (None, 14, 14, 1024) 4096 conv2d_42[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_12 (Gl (None, 1024) 0 batch_normalization_42[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_24 (Reshape) (None, 1024, 1) 0 global_average_pooling2d_12[0][0]\n", + "__________________________________________________________________________________________________\n", + "conv1d_12 (Conv1D) (None, 1024, 1) 5 reshape_24[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_51 (Activation) (None, 1024, 1) 0 conv1d_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_25 (Reshape) (None, 1, 1, 1024) 0 activation_51[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_12 (Multiply) (None, 14, 14, 1024) 0 batch_normalization_42[0][0] \n", + " reshape_25[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_12 (Add) (None, 14, 14, 1024) 0 multiply_12[0][0] \n", + " activation_48[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_52 (Activation) (None, 14, 14, 1024) 0 add_12[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_44 (Conv2D) (None, 7, 7, 512) 524800 activation_52[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_44 (BatchNo (None, 7, 7, 512) 2048 conv2d_44[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_53 (Activation) (None, 7, 7, 512) 0 batch_normalization_44[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_45 (Conv2D) (None, 7, 7, 512) 2359808 activation_53[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_45 (BatchNo (None, 7, 7, 512) 2048 conv2d_45[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_54 (Activation) (None, 7, 7, 512) 0 batch_normalization_45[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_46 (Conv2D) (None, 7, 7, 2048) 1050624 activation_54[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_46 (BatchNo (None, 7, 7, 2048) 8192 conv2d_46[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_13 (Gl (None, 2048) 0 batch_normalization_46[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_26 (Reshape) (None, 2048, 1) 0 global_average_pooling2d_13[0][0]\n", + "__________________________________________________________________________________________________\n", + "conv1d_13 (Conv1D) (None, 2048, 1) 7 reshape_26[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_55 (Activation) (None, 2048, 1) 0 conv1d_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_27 (Reshape) (None, 1, 1, 2048) 0 activation_55[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_43 (Conv2D) (None, 7, 7, 2048) 2099200 activation_52[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_13 (Multiply) (None, 7, 7, 2048) 0 batch_normalization_46[0][0] \n", + " reshape_27[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_43 (BatchNo (None, 7, 7, 2048) 8192 conv2d_43[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_13 (Add) (None, 7, 7, 2048) 0 multiply_13[0][0] \n", + " batch_normalization_43[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_56 (Activation) (None, 7, 7, 2048) 0 add_13[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_47 (Conv2D) (None, 7, 7, 512) 1049088 activation_56[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_47 (BatchNo (None, 7, 7, 512) 2048 conv2d_47[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_57 (Activation) (None, 7, 7, 512) 0 batch_normalization_47[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_48 (Conv2D) (None, 7, 7, 512) 2359808 activation_57[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_48 (BatchNo (None, 7, 7, 512) 2048 conv2d_48[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_58 (Activation) (None, 7, 7, 512) 0 batch_normalization_48[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_49 (Conv2D) (None, 7, 7, 2048) 1050624 activation_58[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_49 (BatchNo (None, 7, 7, 2048) 8192 conv2d_49[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_14 (Gl (None, 2048) 0 batch_normalization_49[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_28 (Reshape) (None, 2048, 1) 0 global_average_pooling2d_14[0][0]\n", + "__________________________________________________________________________________________________\n", + "conv1d_14 (Conv1D) (None, 2048, 1) 7 reshape_28[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_59 (Activation) (None, 2048, 1) 0 conv1d_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_29 (Reshape) (None, 1, 1, 2048) 0 activation_59[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_14 (Multiply) (None, 7, 7, 2048) 0 batch_normalization_49[0][0] \n", + " reshape_29[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_14 (Add) (None, 7, 7, 2048) 0 multiply_14[0][0] \n", + " activation_56[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_60 (Activation) (None, 7, 7, 2048) 0 add_14[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_50 (Conv2D) (None, 7, 7, 512) 1049088 activation_60[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_50 (BatchNo (None, 7, 7, 512) 2048 conv2d_50[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_61 (Activation) (None, 7, 7, 512) 0 batch_normalization_50[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_51 (Conv2D) (None, 7, 7, 512) 2359808 activation_61[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_51 (BatchNo (None, 7, 7, 512) 2048 conv2d_51[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_62 (Activation) (None, 7, 7, 512) 0 batch_normalization_51[0][0] \n", + "__________________________________________________________________________________________________\n", + "conv2d_52 (Conv2D) (None, 7, 7, 2048) 1050624 activation_62[0][0] \n", + "__________________________________________________________________________________________________\n", + "batch_normalization_52 (BatchNo (None, 7, 7, 2048) 8192 conv2d_52[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_15 (Gl (None, 2048) 0 batch_normalization_52[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_30 (Reshape) (None, 2048, 1) 0 global_average_pooling2d_15[0][0]\n", + "__________________________________________________________________________________________________\n", + "conv1d_15 (Conv1D) (None, 2048, 1) 7 reshape_30[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_63 (Activation) (None, 2048, 1) 0 conv1d_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "reshape_31 (Reshape) (None, 1, 1, 2048) 0 activation_63[0][0] \n", + "__________________________________________________________________________________________________\n", + "multiply_15 (Multiply) (None, 7, 7, 2048) 0 batch_normalization_52[0][0] \n", + " reshape_31[0][0] \n", + "__________________________________________________________________________________________________\n", + "add_15 (Add) (None, 7, 7, 2048) 0 multiply_15[0][0] \n", + " activation_60[0][0] \n", + "__________________________________________________________________________________________________\n", + "activation_64 (Activation) (None, 7, 7, 2048) 0 add_15[0][0] \n", + "__________________________________________________________________________________________________\n", + "global_average_pooling2d_16 (Gl (None, 2048) 0 activation_64[0][0] \n", + "__________________________________________________________________________________________________\n", + "dense (Dense) (None, 17) 34833 global_average_pooling2d_16[0][0]\n", + "==================================================================================================\n", + "Total params: 23,622,631\n", + "Trainable params: 23,569,511\n", + "Non-trainable params: 53,120\n", + "__________________________________________________________________________________________________\n" + ] + } + ], + "source": [ + "# 定义ECA-ResNet50\n", + "inputs = Input(shape=(image_size, image_size, 3))\n", + "# 填充3圈0,填充后图像从224×224变成230×230\n", + "x = ZeroPadding2D((3, 3))(inputs)\n", + "x = Conv2D(filters=64, kernel_size=7, strides=2, padding='valid')(x)\n", + "x = BatchNormalization(epsilon=1.001e-5)(x)\n", + "x = Activation('relu')(x)\n", + "# 填充1圈0\n", + "x = ZeroPadding2D((1, 1))(x)\n", + "x = MaxPool2D(pool_size=3, strides=2, padding='valid')(x)\n", + "# 堆叠残差结构\n", + "# blocks表示堆叠数量\n", + "x = stack(x, filters=64, blocks=3, strides=1)\n", + "x = stack(x, filters=128, blocks=4, strides=2)\n", + "x = stack(x, filters=256, blocks=6, strides=2)\n", + "x = stack(x, filters=512, blocks=3, strides=2)\n", + "# 根据特征图大小进行平均池化,池化后得到2维数据\n", + "x = GlobalAvgPool2D()(x)\n", + "x = Dense(num_classes, activation='softmax')(x)\n", + "# 定义模型\n", + "model = Model(inputs=inputs, outputs=x)\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "fcc8c8e4", + "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/ECA-ResNet-50.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": 9, + "id": "2742ab78", + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Epoch 1/100\n", + "34/34 [==============================] - 22s 636ms/step - loss: 2.5698 - accuracy: 0.1774 - val_loss: 2.8470 - val_accuracy: 0.0588\n", + "Epoch 2/100\n", + "34/34 [==============================] - 16s 483ms/step - loss: 1.9580 - accuracy: 0.3557 - val_loss: 2.9315 - val_accuracy: 0.0588\n", + "Epoch 3/100\n", + "34/34 [==============================] - 17s 498ms/step - loss: 1.6472 - accuracy: 0.4403 - val_loss: 3.0972 - val_accuracy: 0.0588\n", + "Epoch 4/100\n", + "34/34 [==============================] - 17s 495ms/step - loss: 1.4624 - accuracy: 0.5147 - val_loss: 3.3421 - val_accuracy: 0.0625\n", + "Epoch 5/100\n", + "34/34 [==============================] - 17s 503ms/step - loss: 1.2603 - accuracy: 0.5836 - val_loss: 3.6957 - val_accuracy: 0.0588\n", + "Epoch 6/100\n", + "34/34 [==============================] - 17s 491ms/step - loss: 1.1205 - accuracy: 0.6351 - val_loss: 3.9378 - val_accuracy: 0.0699\n", + "Epoch 7/100\n", + "34/34 [==============================] - 17s 506ms/step - loss: 0.9901 - accuracy: 0.6792 - val_loss: 4.2927 - val_accuracy: 0.0846\n", + "Epoch 8/100\n", + "34/34 [==============================] - 17s 503ms/step - loss: 0.9850 - accuracy: 0.6471 - val_loss: 4.1675 - val_accuracy: 0.1140\n", + "Epoch 9/100\n", + "34/34 [==============================] - 17s 504ms/step - loss: 0.9109 - accuracy: 0.6921 - val_loss: 4.2538 - val_accuracy: 0.1434\n", + "Epoch 10/100\n", + "34/34 [==============================] - 17s 492ms/step - loss: 0.8276 - accuracy: 0.7114 - val_loss: 3.9008 - val_accuracy: 0.1434\n", + "Epoch 11/100\n", + "34/34 [==============================] - 17s 492ms/step - loss: 0.7661 - accuracy: 0.7436 - val_loss: 3.9629 - val_accuracy: 0.1324\n", + "Epoch 12/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.6997 - accuracy: 0.7638 - val_loss: 4.0181 - val_accuracy: 0.1875\n", + "Epoch 13/100\n", + "34/34 [==============================] - 17s 500ms/step - loss: 0.7702 - accuracy: 0.7206 - val_loss: 3.7996 - val_accuracy: 0.2757\n", + "Epoch 14/100\n", + "34/34 [==============================] - 17s 504ms/step - loss: 0.6191 - accuracy: 0.7877 - val_loss: 3.3396 - val_accuracy: 0.3493\n", + "Epoch 15/100\n", + "34/34 [==============================] - 20s 592ms/step - loss: 0.5339 - accuracy: 0.8143 - val_loss: 2.4377 - val_accuracy: 0.4816\n", + "Epoch 16/100\n", + "34/34 [==============================] - 20s 599ms/step - loss: 0.5066 - accuracy: 0.8189 - val_loss: 2.1493 - val_accuracy: 0.5294\n", + "Epoch 17/100\n", + "34/34 [==============================] - 21s 608ms/step - loss: 0.4355 - accuracy: 0.8585 - val_loss: 1.5485 - val_accuracy: 0.6103\n", + "Epoch 18/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.4876 - accuracy: 0.8392 - val_loss: 1.7700 - val_accuracy: 0.5478\n", + "Epoch 19/100\n", + "34/34 [==============================] - 17s 498ms/step - loss: 0.4234 - accuracy: 0.8585 - val_loss: 1.6041 - val_accuracy: 0.5956\n", + "Epoch 20/100\n", + "34/34 [==============================] - 17s 499ms/step - loss: 0.3849 - accuracy: 0.8750 - val_loss: 1.7854 - val_accuracy: 0.6066\n", + "Epoch 21/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.3991 - accuracy: 0.8649 - val_loss: 2.2074 - val_accuracy: 0.5662\n", + "Epoch 22/100\n", + "34/34 [==============================] - 17s 498ms/step - loss: 0.3408 - accuracy: 0.8833 - val_loss: 2.3560 - val_accuracy: 0.5919\n", + "Epoch 23/100\n", + "34/34 [==============================] - 20s 600ms/step - loss: 0.3082 - accuracy: 0.8998 - val_loss: 1.2968 - val_accuracy: 0.6471\n", + "Epoch 24/100\n", + "34/34 [==============================] - 20s 583ms/step - loss: 0.3047 - accuracy: 0.8943 - val_loss: 1.2097 - val_accuracy: 0.7169\n", + "Epoch 25/100\n", + "34/34 [==============================] - 17s 492ms/step - loss: 0.3300 - accuracy: 0.8943 - val_loss: 1.7405 - val_accuracy: 0.6029\n", + "Epoch 26/100\n", + "34/34 [==============================] - 20s 595ms/step - loss: 0.2871 - accuracy: 0.9053 - val_loss: 0.9525 - val_accuracy: 0.7757\n", + "Epoch 27/100\n", + "34/34 [==============================] - 20s 580ms/step - loss: 0.2510 - accuracy: 0.9173 - val_loss: 0.9042 - val_accuracy: 0.7610\n", + "Epoch 28/100\n", + "34/34 [==============================] - 17s 499ms/step - loss: 0.2677 - accuracy: 0.9108 - val_loss: 1.2943 - val_accuracy: 0.6875\n", + "Epoch 29/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.2796 - accuracy: 0.9062 - val_loss: 1.2291 - val_accuracy: 0.6618\n", + "Epoch 30/100\n", + "34/34 [==============================] - 17s 494ms/step - loss: 0.2527 - accuracy: 0.9182 - val_loss: 1.2905 - val_accuracy: 0.7022\n", + "Epoch 31/100\n", + "34/34 [==============================] - 17s 495ms/step - loss: 0.2596 - accuracy: 0.9035 - val_loss: 1.9452 - val_accuracy: 0.5625\n", + "Epoch 32/100\n", + "34/34 [==============================] - 17s 506ms/step - loss: 0.2127 - accuracy: 0.9210 - val_loss: 1.5772 - val_accuracy: 0.6728\n", + "Epoch 33/100\n", + "34/34 [==============================] - 17s 498ms/step - loss: 0.2407 - accuracy: 0.9136 - val_loss: 1.1294 - val_accuracy: 0.7243\n", + "Epoch 34/100\n", + "34/34 [==============================] - 17s 502ms/step - loss: 0.2460 - accuracy: 0.9053 - val_loss: 1.4101 - val_accuracy: 0.6912\n", + "Epoch 35/100\n", + "34/34 [==============================] - 17s 500ms/step - loss: 0.2279 - accuracy: 0.9246 - val_loss: 1.4869 - val_accuracy: 0.6544\n", + "Epoch 36/100\n", + "34/34 [==============================] - 17s 502ms/step - loss: 0.2027 - accuracy: 0.9256 - val_loss: 1.0055 - val_accuracy: 0.7169\n", + "Epoch 37/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.2035 - accuracy: 0.9366 - val_loss: 1.2164 - val_accuracy: 0.6985\n", + "Epoch 38/100\n", + "34/34 [==============================] - 17s 501ms/step - loss: 0.1645 - accuracy: 0.9467 - val_loss: 1.7214 - val_accuracy: 0.6434\n", + "Epoch 39/100\n", + "34/34 [==============================] - 17s 499ms/step - loss: 0.2136 - accuracy: 0.9256 - val_loss: 1.8810 - val_accuracy: 0.5882\n", + "Epoch 40/100\n", + "34/34 [==============================] - 17s 493ms/step - loss: 0.1832 - accuracy: 0.9384 - val_loss: 1.5021 - val_accuracy: 0.7022\n", + "Epoch 41/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.1783 - accuracy: 0.9347 - val_loss: 1.3718 - val_accuracy: 0.6912\n", + "Epoch 42/100\n", + "34/34 [==============================] - 20s 592ms/step - loss: 0.1217 - accuracy: 0.9623 - val_loss: 0.8156 - val_accuracy: 0.7904\n", + "Epoch 43/100\n", + "34/34 [==============================] - 20s 588ms/step - loss: 0.0700 - accuracy: 0.9825 - val_loss: 0.7061 - val_accuracy: 0.8088\n", + "Epoch 44/100\n", + "34/34 [==============================] - 20s 592ms/step - loss: 0.0700 - accuracy: 0.9798 - val_loss: 0.6551 - val_accuracy: 0.8272\n", + "Epoch 45/100\n", + "34/34 [==============================] - 20s 595ms/step - loss: 0.0671 - accuracy: 0.9789 - val_loss: 0.6466 - val_accuracy: 0.8272\n", + "Epoch 46/100\n", + "34/34 [==============================] - 20s 593ms/step - loss: 0.0518 - accuracy: 0.9881 - val_loss: 0.6285 - val_accuracy: 0.8382\n", + "Epoch 47/100\n", + "34/34 [==============================] - 17s 500ms/step - loss: 0.0502 - accuracy: 0.9899 - val_loss: 0.6635 - val_accuracy: 0.8346\n", + "Epoch 48/100\n", + "34/34 [==============================] - 17s 504ms/step - loss: 0.0388 - accuracy: 0.9908 - val_loss: 0.6638 - val_accuracy: 0.8309\n", + "Epoch 49/100\n", + "34/34 [==============================] - 17s 495ms/step - loss: 0.0437 - accuracy: 0.9890 - val_loss: 0.6547 - val_accuracy: 0.8382\n", + "Epoch 50/100\n", + "34/34 [==============================] - 17s 503ms/step - loss: 0.0418 - accuracy: 0.9926 - val_loss: 0.6509 - val_accuracy: 0.8419\n", + "Epoch 51/100\n", + "34/34 [==============================] - 17s 498ms/step - loss: 0.0356 - accuracy: 0.9917 - val_loss: 0.6498 - val_accuracy: 0.8493\n", + "Epoch 52/100\n", + "34/34 [==============================] - 17s 499ms/step - loss: 0.0369 - accuracy: 0.9926 - val_loss: 0.6771 - val_accuracy: 0.8309\n", + "Epoch 53/100\n", + "34/34 [==============================] - 17s 493ms/step - loss: 0.0431 - accuracy: 0.9908 - val_loss: 0.6855 - val_accuracy: 0.8456\n", + "Epoch 54/100\n", + "34/34 [==============================] - 17s 500ms/step - loss: 0.0415 - accuracy: 0.9890 - val_loss: 0.6391 - val_accuracy: 0.8456\n", + "Epoch 55/100\n", + "34/34 [==============================] - 17s 496ms/step - loss: 0.0366 - accuracy: 0.9917 - val_loss: 0.6446 - val_accuracy: 0.8493\n", + "Epoch 56/100\n", + "34/34 [==============================] - 17s 502ms/step - loss: 0.0335 - accuracy: 0.9936 - val_loss: 0.6491 - val_accuracy: 0.8419\n", + "Epoch 57/100\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "34/34 [==============================] - 17s 499ms/step - loss: 0.0282 - accuracy: 0.9963 - val_loss: 0.6520 - val_accuracy: 0.8493\n", + "Epoch 58/100\n", + "34/34 [==============================] - 17s 505ms/step - loss: 0.0319 - accuracy: 0.9945 - val_loss: 0.6693 - val_accuracy: 0.8456\n", + "Epoch 59/100\n", + "34/34 [==============================] - 17s 500ms/step - loss: 0.0313 - accuracy: 0.9936 - val_loss: 0.6917 - val_accuracy: 0.8493\n", + "Epoch 60/100\n", + "34/34 [==============================] - 17s 502ms/step - loss: 0.0299 - accuracy: 0.9954 - val_loss: 0.6883 - val_accuracy: 0.8382\n", + "Epoch 61/100\n", + "34/34 [==============================] - 17s 503ms/step - loss: 0.0352 - accuracy: 0.9936 - val_loss: 0.6624 - val_accuracy: 0.8529\n", + "Epoch 62/100\n", + "34/34 [==============================] - 17s 500ms/step - loss: 0.0333 - accuracy: 0.9908 - val_loss: 0.6620 - val_accuracy: 0.8419\n", + "Epoch 63/100\n", + "34/34 [==============================] - 17s 507ms/step - loss: 0.0325 - accuracy: 0.9945 - val_loss: 0.6683 - val_accuracy: 0.8456\n", + "Epoch 64/100\n", + "34/34 [==============================] - 17s 498ms/step - loss: 0.0364 - accuracy: 0.9945 - val_loss: 0.6452 - val_accuracy: 0.8493\n", + "Epoch 65/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.0333 - accuracy: 0.9917 - val_loss: 0.6471 - val_accuracy: 0.8346\n", + "Epoch 66/100\n", + "34/34 [==============================] - 17s 501ms/step - loss: 0.0379 - accuracy: 0.9899 - val_loss: 0.6335 - val_accuracy: 0.8419\n", + "Epoch 67/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.0338 - accuracy: 0.9899 - val_loss: 0.6650 - val_accuracy: 0.8272\n", + "Epoch 68/100\n", + "34/34 [==============================] - 17s 507ms/step - loss: 0.0407 - accuracy: 0.9890 - val_loss: 0.6379 - val_accuracy: 0.8419\n", + "Epoch 69/100\n", + "34/34 [==============================] - 20s 586ms/step - loss: 0.0260 - accuracy: 0.9917 - val_loss: 0.6246 - val_accuracy: 0.8456\n", + "Epoch 70/100\n", + "34/34 [==============================] - 17s 503ms/step - loss: 0.0251 - accuracy: 0.9972 - val_loss: 0.6342 - val_accuracy: 0.8529\n", + "Epoch 71/100\n", + "34/34 [==============================] - 17s 510ms/step - loss: 0.0315 - accuracy: 0.9926 - val_loss: 0.7104 - val_accuracy: 0.8346\n", + "Epoch 72/100\n", + "34/34 [==============================] - 17s 501ms/step - loss: 0.0272 - accuracy: 0.9917 - val_loss: 0.6838 - val_accuracy: 0.8309\n", + "Epoch 73/100\n", + "34/34 [==============================] - 17s 495ms/step - loss: 0.0303 - accuracy: 0.9936 - val_loss: 0.6369 - val_accuracy: 0.8456\n", + "Epoch 74/100\n", + "34/34 [==============================] - 17s 499ms/step - loss: 0.0199 - accuracy: 0.9982 - val_loss: 0.6534 - val_accuracy: 0.8419\n", + "Epoch 75/100\n", + "34/34 [==============================] - 17s 503ms/step - loss: 0.0233 - accuracy: 0.9936 - val_loss: 0.6814 - val_accuracy: 0.8456\n", + "Epoch 76/100\n", + "34/34 [==============================] - 17s 496ms/step - loss: 0.0194 - accuracy: 0.9972 - val_loss: 0.6851 - val_accuracy: 0.8382\n", + "Epoch 77/100\n", + "34/34 [==============================] - 17s 493ms/step - loss: 0.0200 - accuracy: 0.9963 - val_loss: 0.6835 - val_accuracy: 0.8456\n", + "Epoch 78/100\n", + "34/34 [==============================] - 17s 505ms/step - loss: 0.0219 - accuracy: 0.9963 - val_loss: 0.7354 - val_accuracy: 0.8235\n", + "Epoch 79/100\n", + "34/34 [==============================] - 17s 494ms/step - loss: 0.0266 - accuracy: 0.9936 - val_loss: 0.7337 - val_accuracy: 0.8125\n", + "Epoch 80/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.0261 - accuracy: 0.9954 - val_loss: 0.6548 - val_accuracy: 0.8419\n", + "Epoch 81/100\n", + "34/34 [==============================] - 17s 498ms/step - loss: 0.0255 - accuracy: 0.9963 - val_loss: 0.7267 - val_accuracy: 0.8309\n", + "Epoch 82/100\n", + "34/34 [==============================] - 17s 499ms/step - loss: 0.0166 - accuracy: 0.9982 - val_loss: 0.7085 - val_accuracy: 0.8309\n", + "Epoch 83/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.0269 - accuracy: 0.9936 - val_loss: 0.6944 - val_accuracy: 0.8346\n", + "Epoch 84/100\n", + "34/34 [==============================] - 17s 495ms/step - loss: 0.0263 - accuracy: 0.9936 - val_loss: 0.6795 - val_accuracy: 0.8272\n", + "Epoch 85/100\n", + "34/34 [==============================] - 17s 502ms/step - loss: 0.0194 - accuracy: 0.9972 - val_loss: 0.6747 - val_accuracy: 0.8309\n", + "Epoch 86/100\n", + "34/34 [==============================] - 17s 496ms/step - loss: 0.0190 - accuracy: 0.9954 - val_loss: 0.6729 - val_accuracy: 0.8382\n", + "Epoch 87/100\n", + "34/34 [==============================] - 17s 495ms/step - loss: 0.0231 - accuracy: 0.9936 - val_loss: 0.6701 - val_accuracy: 0.8419\n", + "Epoch 88/100\n", + "34/34 [==============================] - 17s 514ms/step - loss: 0.0210 - accuracy: 0.9963 - val_loss: 0.6733 - val_accuracy: 0.8419\n", + "Epoch 89/100\n", + "34/34 [==============================] - 17s 500ms/step - loss: 0.0198 - accuracy: 0.9963 - val_loss: 0.6727 - val_accuracy: 0.8419\n", + "Epoch 90/100\n", + "34/34 [==============================] - 17s 500ms/step - loss: 0.0255 - accuracy: 0.9963 - val_loss: 0.6724 - val_accuracy: 0.8419\n", + "Epoch 91/100\n", + "34/34 [==============================] - 17s 501ms/step - loss: 0.0181 - accuracy: 0.9963 - val_loss: 0.6680 - val_accuracy: 0.8382\n", + "Epoch 92/100\n", + "34/34 [==============================] - 17s 495ms/step - loss: 0.0189 - accuracy: 0.9972 - val_loss: 0.6700 - val_accuracy: 0.8382\n", + "Epoch 93/100\n", + "34/34 [==============================] - 17s 501ms/step - loss: 0.0218 - accuracy: 0.9963 - val_loss: 0.6753 - val_accuracy: 0.8382\n", + "Epoch 94/100\n", + "34/34 [==============================] - 17s 513ms/step - loss: 0.0184 - accuracy: 0.9982 - val_loss: 0.6737 - val_accuracy: 0.8382\n", + "Epoch 95/100\n", + "34/34 [==============================] - 17s 498ms/step - loss: 0.0182 - accuracy: 0.9972 - val_loss: 0.6754 - val_accuracy: 0.8382\n", + "Epoch 96/100\n", + "34/34 [==============================] - 17s 497ms/step - loss: 0.0143 - accuracy: 1.0000 - val_loss: 0.6703 - val_accuracy: 0.8382\n", + "Epoch 97/100\n", + "34/34 [==============================] - 17s 499ms/step - loss: 0.0190 - accuracy: 0.9972 - val_loss: 0.6722 - val_accuracy: 0.8382\n", + "Epoch 98/100\n", + "34/34 [==============================] - 17s 505ms/step - loss: 0.0165 - accuracy: 0.9972 - val_loss: 0.6720 - val_accuracy: 0.8419\n", + "Epoch 99/100\n", + "34/34 [==============================] - 17s 495ms/step - loss: 0.0186 - accuracy: 0.9972 - val_loss: 0.6738 - val_accuracy: 0.8419\n", + "Epoch 100/100\n", + "34/34 [==============================] - 17s 499ms/step - loss: 0.0212 - accuracy: 0.9963 - val_loss: 0.6747 - val_accuracy: 0.8382\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": 10, + "id": "89b71112", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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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()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "dfb34900", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\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()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4b02cfa4", + "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 +} diff --git "a/\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/ECANet-block.py" "b/\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/ECANet-block.py" new file mode 100644 index 0000000..f3ff654 --- /dev/null +++ "b/\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/ECANet-block.py" @@ -0,0 +1,37 @@ +import tensorflow as tf +import math +from tensorflow.keras.layers import GlobalAveragePooling2D,Conv1D,Reshape,Activation,multiply +from tensorflow.keras.layers import Input +from tensorflow.keras.models import Model +from plot_model import plot_model + + +''' +ECA模块的思想是非常简单的,它去除了原来SE模块中的全连接层, +直接在全局平均池化之后的特征上通过一个1D卷积进行学习。 +''' +def eca_block(input_feature, b=1, gamma=2, name=""): + channel = input_feature.shape[-1] + # 根据公式计算自适应卷积核大小 + kernel_size = int(abs((math.log(channel, 2) + b) / gamma)) + # 如果是kernel_size是偶数,就使用,否则变成偶数 + kernel_size = kernel_size if kernel_size % 2 else kernel_size + 1 + # [c] + x = GlobalAveragePooling2D()(input_feature) + # [c,1] + x = Reshape((-1, 1))(x) + # + x = Conv1D(1, kernel_size=kernel_size, padding="same",use_bias=False,name="eca_layer_" + str(name))(x) + x = Activation('sigmoid')(x) + # [c,1]=>[1,1,c] + x = Reshape((1, 1, -1))(x) + + output = multiply([input_feature, x]) + return output + +if __name__ == '__main__': + inputs=Input([26,25,512]) + x=eca_block(inputs) + model=Model(inputs,x) + model.summary() + plot_model(model,to_file='img/ECANet-block.png') \ No newline at end of file diff --git "a/\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/img/ECANet-block.png" "b/\347\273\217\345\205\270\347\275\221\347\273\234/ECANet/img/ECANet-block.png" new file mode 100644 index 0000000000000000000000000000000000000000..35f4a62210e51cf171e890a49a11d3d5491e2cb2 GIT binary patch literal 30489 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 TW-{w literal 0 HcmV?d00001 -- GitLab