Keras学习之:keras 自带的经典模型加载和使用(vgg-16,resnet,mobilenet,densenet等)

  • 你还在为自己搭建网络结构而烦恼么
  • 你还在为自己找不到合适的网络做实验而苦闷么
  • 看完这篇文章,给你不一样的新世界

1. 模块导入

在这里插入图片描述
这里以 vgg-16 模块的导入和使用为例,给大家做简单的演示

from keras_applications import vgg16

2. 模型实例化

vgg_16 = vgg16.VGG16(input_shape=(224,224,3),
                     weights=None,
                     include_top=False,
                     backend=keras.backend,
                     layers=keras.layers,
                     models=keras.models,
                     utils=keras.utils)
  • 注意,在实例化网络的时候要以上面的方式添加参数,如果你按照下面的方式创建网络,会报错:AttributeError: ‘NoneType’ object has no attribute 'image_data_format’

在这里插入图片描述

  • 如果你的 weight 不设置为 None,那么系统会自动从网上给你下载 vgg-16的参数,巨巨巨巨大。所以建议 weight=None

  • include_top 又是个什么东西呢?其实就是包不包含 vgg-16 的全连接层部分,因为全连接层部分的参数众多,而且主要是用来分固定的类,所以如果你想自己设计全连接层的样式,并训练 vgg-16 让他来分特定的几类,就可以 include_top=False 下面给大家展示一下区别
    在这里插入图片描述
    在这里插入图片描述

  • 请注意,input_shapepooling参数只能在 include_topFalse 时指定。因为如果默认使用完整的 vgg-16网络,这个时候全连接层的参数是固定的,如果随便调了输入图片的尺寸或者 pooling 的参数,那么在最终特征图 feature map 到达 dense 层的时候,就不一定满足神经元个数匹配,因此只有在不包含全连接层(include_top=False)的时候才能指定修改 input_shape 以及 pooling 参数

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值