金融公司网站设计图,网站开发人员的要求,利用花生壳做网站,怎样通过阿里云建设网站#x1f368; 本文为#x1f517;365天深度学习训练营 中的学习记录博客#x1f356; 原作者#xff1a;K同学啊 文章目录 一、前言1、结构改进2、分组卷积 二、前期工作1.设置GPU2. 导入数据3. 查看数据 三、数据预处理1、加载数据2、配置数据集 四、构建网络1、导入包2、… 本文为365天深度学习训练营 中的学习记录博客 原作者K同学啊 文章目录 一、前言1、结构改进2、分组卷积 二、前期工作1.设置GPU2. 导入数据3. 查看数据 三、数据预处理1、加载数据2、配置数据集 四、构建网络1、导入包2、分组卷积模块3、残差单元4、堆叠残差单元5、搭建ResNeXt-50网络6、查看模型摘要 五、编译六、训练模型七、模型评估 电脑环境 语言环境Python 3.8.0 深度学习环境tensorflow 2.17.0
一、前言
本次使用的数据集是猴痘病毒数据集。
1、结构改进 上图是ResNet左与ResNeXt右block的差异。在ResNet中输入的具有256个通道的特征经过1×1卷积压缩4倍到64个通道之后3×3的卷积核用于处理特征经1×1卷积扩大通道数与原特征残差连接后输出。ResNeXt也是相同的处理策略但在ResNeXt中输入的具有256个通道的特征被分为32个组每组被压缩64倍到4个通道后进行处理。32个组相加后与原特征残差连接后输出。这里cardinatity指的是一个block中所具有的相同分支的数目。
2、分组卷积
ResNeXt中采用的分组卷积简单来说就是将特征图分为不同的组再对每组特征图分别进行卷积这个操作可以有效的降低计算量。 在分组卷积中每个卷积核只处理部分通道比如下图中红色卷积核只处理红色的通道绿色卷积核只处理绿色通道黄色卷积核只处理黄色通道。此时每个卷积核有2个通道每个卷积核生成一张特征图。
二、前期工作
1.设置GPU
from tensorflow import keras
from keras import layers, models
import os, PIL, pathlib
import matplotlib.pyplot as plt
import tensorflow as tfgpus tf.config.list_physical_devices(GPU)if gpus:gpu0 gpus[0] #如果有多个GPU仅使用第0个GPUtf.config.experimental.set_memory_growth(gpu0, True) #设置GPU显存用量按需使用tf.config.set_visible_devices([gpu0],GPU)2. 导入数据
data_dir ./data/
data_dir pathlib.Path(data_dir)3. 查看数据
image_count len(list(data_dir.glob(*/*.jpg)))
print(图片总数为,image_count)输出图片总数为 2142
三、数据预处理
1、加载数据
batch_size 8
img_height 224
img_width 224train_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.2,subsettraining,seed123,image_size(img_height, img_width),batch_sizebatch_size)val_ds tf.keras.preprocessing.image_dataset_from_directory(data_dir,validation_split0.2,subsetvalidation,seed123,image_size(img_height, img_width),batch_sizebatch_size)class_names train_ds.class_names2、配置数据集
AUTOTUNE tf.data.AUTOTUNE
train_ds train_ds.cache().shuffle(1000).prefetch(buffer_sizeAUTOTUNE)
val_ds val_ds.cache().prefetch(buffer_sizeAUTOTUNE)四、构建网络
1、导入包
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Dense, Dropout, Conv2D, MaxPool2D, Flatten, GlobalAvgPool2D, concatenate, \
BatchNormalization, Activation, Add, ZeroPadding2D, Lambda
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.layers import ReLU
import matplotlib.pyplot as plt
from tensorflow.keras.callbacks import LearningRateScheduler
from tensorflow.keras.models import Model2、分组卷积模块
# 定义分组卷积
def grouped_convolution_block(init_x, strides, groups, g_channels):group_list []# 分组进行卷积for c in range(groups):# 分组取出数据x Lambda(lambda x: x[:, :, :, c * g_channels:(c 1) * g_channels])(init_x)# 分组进行卷积x Conv2D(filtersg_channels, kernel_size(3, 3),stridesstrides, paddingsame, use_biasFalse)(x)# 存入listgroup_list.append(x)# 合并list中的数据group_merage concatenate(group_list, axis3)x BatchNormalization(epsilon1.001e-5)(group_merage)x ReLU()(x)return x3、残差单元 # 定义残差单元
def block(x, filters, strides1, groups32, conv_shortcutTrue):if conv_shortcut:shortcut Conv2D(filters * 2, kernel_size(1, 1), stridesstrides, paddingsame, use_biasFalse)(x)# epsilon为BN公式中防止分母为零的值shortcut BatchNormalization(epsilon1.001e-5)(shortcut)else:# identity_shortcutshortcut x# 三层卷积层x Conv2D(filtersfilters, kernel_size(1, 1), strides1, paddingsame, use_biasFalse)(x)x BatchNormalization(epsilon1.001e-5)(x)x ReLU()(x)# 计算每组的通道数g_channels int(filters / groups)# 进行分组卷积x grouped_convolution_block(x, strides, groups, g_channels)x Conv2D(filtersfilters * 2, kernel_size(1, 1), strides1, paddingsame, use_biasFalse)(x)x BatchNormalization(epsilon1.001e-5)(x)x Add()([x, shortcut])x ReLU()(x)return x4、堆叠残差单元
# 堆叠残差单元
def stack(x, filters, blocks, strides, groups32):# 每个stack的第一个block的残差连接都需要使用1*1卷积升维x block(x, filters, stridesstrides, groupsgroups)for i in range(blocks):x block(x, filters, groupsgroups, conv_shortcutFalse)return x5、搭建ResNeXt-50网络
# 定义ResNext50(32*4d)网络
def ResNext50(input_shape, num_classes):inputs Input(shapeinput_shape)# 填充3圈0[224,224,3]-[230,230,3]x ZeroPadding2D((3, 3))(inputs)x Conv2D(filters64, kernel_size(7, 7), strides2, paddingvalid)(x)x BatchNormalization(epsilon1.001e-5)(x)x ReLU()(x)# 填充1圈0x ZeroPadding2D((1, 1))(x)x MaxPool2D(pool_size(3, 3), strides2, paddingvalid)(x)# 堆叠残差结构x stack(x, filters128, blocks2, strides1)x stack(x, filters256, blocks3, strides2)x stack(x, filters512, blocks5, strides2)x stack(x, filters1024, blocks2, strides2)# 根据特征图大小进行全局平均池化x GlobalAvgPool2D()(x)x Dense(num_classes, activationsoftmax)(x)# 定义模型model Model(inputsinputs, outputsx)return model6、查看模型摘要
modelResNext50(input_shape(224,224,3),num_classes1000)
model.summary()五、编译
# 设置优化器
opt tf.keras.optimizers.Adam(learning_rate1e-4)
model.compile(optimizeropt,losstf.keras.losses.SparseCategoricalCrossentropy(from_logitsTrue),metrics[accuracy])六、训练模型
epochs 20history model.fit(train_ds,validation_dataval_ds,epochsepochs)Epoch 1/20
215/215 ━━━━━━━━━━━━━━━━━━━━ 292s 557ms/step - accuracy: 0.4838 - loss: 1.8304 - val_accuracy: 0.5701 - val_loss: 0.7159
..................................................................................
Epoch 18/20
215/215 ━━━━━━━━━━━━━━━━━━━━ 37s 173ms/step - accuracy: 0.9794 - loss: 0.0574 - val_accuracy: 0.8014 - val_loss: 0.6634
Epoch 19/20
215/215 ━━━━━━━━━━━━━━━━━━━━ 37s 173ms/step - accuracy: 0.9749 - loss: 0.0660 - val_accuracy: 0.7640 - val_loss: 0.7989
Epoch 20/20
215/215 ━━━━━━━━━━━━━━━━━━━━ 41s 175ms/step - accuracy: 0.9610 - loss: 0.1093 - val_accuracy: 0.7780 - val_loss: 0.6207七、模型评估
acc history.history[accuracy]
val_acc history.history[val_accuracy]loss history.history[loss]
val_loss history.history[val_loss]epochs_range range(epochs)plt.figure(figsize(12, 4))
plt.subplot(1, 2, 1)
plt.plot(epochs_range, acc, labelTraining Accuracy)
plt.plot(epochs_range, val_acc, labelValidation Accuracy)
plt.legend(loclower right)
plt.title(Training and Validation Accuracy)plt.subplot(1, 2, 2)
plt.plot(epochs_range, loss, labelTraining Loss)
plt.plot(epochs_range, val_loss, labelValidation Loss)
plt.legend(locupper right)
plt.title(Training and Validation Loss)
plt.show()