2D网络模型总结3:Resnet和DenseNet

ResNet原文链接:https://blog.csdn.net/u013181595/article/details/80990930ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比...
摘要由CSDN通过智能技术生成

ResNet

原文链接:https://blog.csdn.net/u013181595/article/details/80990930
ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNet Unit成功训练出了152层的神经网络,并在ILSVRC2015比赛中取得冠军,在top5上的错误率为3.57%,同时参数量比VGGNet低,效果非常突出。ResNet的结构可以极快的加速神经网络的训练,模型的准确率也有比较大的提升。同时ResNet的推广性非常好,甚至可以直接用到InceptionNet网络中。ResNet的主要思想是在网络中增加了直连通道,即Highway Network的思想。

创新点

提出残差学习的思想。
传统的卷积网络或者全连接网络在信息传递的时候或多或少会存在信息丢失,损耗等问题,同时还有导致梯度消失或者梯度爆炸,导致很深的网络无法训练。ResNet在一定程度上解决了这个问题,通过直接将输入信息绕道传到输出,保护信息的完整性,整个网络只需要学习输入、输出差别的那一部分,简化学习目标和难度。ResNet最大的区别在于有很多的旁路将输入直接连接到后面的层,这种结构也被称为shortcut或者skip connections。

网络结构

在ResNet网络结构中会用到两种残差模块,一种是以两个33的卷积网络串接在一起作为一个残差模块,另外一种是11、33、11的3个卷积网络串接在一起作为一个残差模块。他们如下图所示。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您提供针对fer2013表情数据库的人脸表情识别的Python代码,并尝试不同的卷积神经网络以及超参数的选择,最后使用预训练模型进行训练和测试。 首先,我们需要导入必要的Python库,包括numpy、matplotlib、pandas、sklearn、keras等。代码如下: ```python import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix from keras.utils import to_categorical from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D from keras.preprocessing.image import ImageDataGenerator from keras.applications.vgg16 import VGG16 from keras.applications.resnet50 import ResNet50 from keras.applications.densenet import DenseNet121 ``` 接下来,我们需要加载数据集并进行一些必要的预处理。代码如下: ```python data = pd.read_csv('fer2013.csv') X = [] Y = [] for i in range(len(data)): pixels = data['pixels'][i].split() x = np.array(pixels, dtype='float32').reshape(48, 48) y = data['emotion'][i] X.append(x) Y.append(y) X = np.array(X) Y = np.array(Y) X = np.expand_dims(X, axis=-1) X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=42) Y_train = to_categorical(Y_train, num_classes=7) Y_test = to_categorical(Y_test, num_classes=7) X_train /= 255 X_test /= 255 ``` 在这里,我们将数据集中的像素值转换为numpy数组,并将其转换为48x48的图像。然后,我们将其转换为3D张量,以便将其输入卷积神经网络中。我们还将数据集分成训练和测试集,并将目标变量转换为分类变量。最后,我们归一化了像素值,以在训练时加速收敛。 接下来,我们将使用VGG16、ResNet50和DenseNet121中的每一个来构建我们的卷积神经网络,并尝试不同的超参数。代码如下: ```python def train_model(model, batch_size, epochs, lr): model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) datagen = ImageDataGenerator( rotation_range=10, zoom_range=0.1, width_shift_range=0.1, height_shift_range=0.1, horizontal_flip=True) history = model.fit_generator(datagen.flow(X_train, Y_train, batch_size=batch_size), steps_per_epoch=len(X_train) / batch_size, epochs=epochs, validation_data=(X_test, Y_test)) return history vgg_model = Sequential([ VGG16(include_top=False, input_shape=(48, 48, 3)), Flatten(), Dense(256, activation='relu'), Dropout(0.5), Dense(7, activation='softmax') ]) resnet_model = Sequential([ ResNet50(include_top=False, input_shape=(48, 48, 3)), Flatten(), Dense(256, activation='relu'), Dropout(0.5), Dense(7, activation='softmax') ]) densenet_model = Sequential([ DenseNet121(include_top=False, input_shape=(48, 48, 3)), Flatten(), Dense(256, activation='relu'), Dropout(0.5), Dense(7, activation='softmax') ]) batch_size = 32 epochs = 50 lrs = [0.001, 0.0001, 0.00001] filters = [32, 64, 128] for lr in lrs: for filter in filters: vgg_model.layers[0].trainable = False vgg_model.layers[0].input_shape = (48, 48, 1) vgg_model.add(Conv2D(filter, kernel_size=(3, 3), activation='relu')) vgg_model.add(MaxPooling2D(pool_size=(2, 2))) vgg_history = train_model(vgg_model, batch_size, epochs, lr) resnet_model.layers[0].trainable = False resnet_model.layers[0].input_shape = (48, 48, 1) resnet_model.add(Conv2D(filter, kernel_size=(3, 3), activation='relu')) resnet_model.add(MaxPooling2D(pool_size=(2, 2))) resnet_history = train_model(resnet_model, batch_size, epochs, lr) densenet_model.layers[0].trainable = False densenet_model.layers[0].input_shape = (48, 48, 1) densenet_model.add(Conv2D(filter, kernel_size=(3, 3), activation='relu')) densenet_model.add(MaxPooling2D(pool_size=(2, 2))) densenet_history = train_model(densenet_model, batch_size, epochs, lr) ``` 在这里,我们定义了一个函数train_model,该函数接受一个模型、批次大小、时期和学习率作为参数,并使用ImageDataGenerator来生成增强的图像,以在训练时增加模型的泛化能力。然后,我们使用VGG16、ResNet50和DenseNet121中的每一个来构建我们的卷积神经网络,并尝试不同的超参数。我们将学习率设置为0.001、0.0001和0.00001,并将过滤器的数量设置为32、64和128。然后,我们使用train_model函数在每个模型上进行训练,并记录训练历史记录。 最后,我们将使用预训练的VGG16模型来进行训练和测试,以便比较它与我们手动构建的模型的性能。代码如下: ```python vgg_model = Sequential([ VGG16(include_top=False, input_shape=(48, 48, 3)), Flatten(), Dense(256, activation='relu'), Dropout(0.5), Dense(7, activation='softmax') ]) vgg_model.layers[0].trainable = False vgg_model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) vgg_history = vgg_model.fit_generator(datagen.flow(X_train, Y_train, batch_size=batch_size), steps_per_epoch=len(X_train) / batch_size, epochs=epochs, validation_data=(X_test, Y_test)) y_pred = vgg_model.predict(X_test) cm = confusion_matrix(np.argmax(Y_test, axis=1), np.argmax(y_pred, axis=1)) plt.matshow(cm, cmap='coolwarm') plt.colorbar() plt.xlabel('Predicted label') plt.ylabel('True label') plt.show() ``` 在这里,我们定义了一个VGG16模型,并将其冻结以便使用预训练的权重。然后,我们使用与前面相同的ImageDataGenerator来生成增强的图像,并使用fit_generator函数在模型上进行训练。最后,我们使用预测值和真实值生成混淆矩阵,并将其可视化以便更好地了解模型的性能。 这就是我们的代码和运行结果。希望这可以帮助您在fer2013表情数据库上开展人脸表情识别任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值