使用Keras构建深度学习模型(以Resnet50为例) 实现对Cifar10数据集的分类

使用Keras构建深度学习模型(以Resnet50为例) 实现对Cifar10数据集的分类

keras是目前流行的深度学习框架之一,目前已经整合到Tensorflow2.0版本中,用户通过安装Tensorflow包即可实现对Keras方便的调用。

Keras为用户提供了多种深度学习模型调用的接口,用户通过简单的编辑即可实现经典模型的调用和搭建。目前Keras提供的模型接口有如下几个:

from tensorflow.python.keras.applications.densenet import DenseNet121
from tensorflow.python.keras.applications.densenet import DenseNet169
from tensorflow.python.keras.applications.densenet import DenseNet201
from tensorflow.python.keras.applications.inception_resnet_v2 import InceptionResNetV2
from tensorflow.python.keras.applications.inception_v3 import InceptionV3
from tensorflow.python.keras.applications.mobilenet import MobileNet
from tensorflow.python.keras.applications.mobilenet_v2 import MobileNetV2
from tensorflow.python.keras.applications.nasnet import NASNetLarge
from tensorflow.python.keras.applications.nasnet import NASNetMobile
from tensorflow.python.keras.applications.resnet import ResNet101
from tensorflow.python.keras.applications.resnet import ResNet152
from tensorflow.python.keras.applications.resnet import ResNet50
from tensorflow.python.keras.applications.resnet_v2 import ResNet101V2
from tensorflow.python.keras.applications.resnet_v2 import ResNet152V2
from tensorflow.python.keras.applications.resnet_v2 import ResNet50V2
from tensorflow.python.keras.applications.vgg16 import VGG16
from tensorflow.python.keras.applications.vgg19 import VGG19
from tensorflow.python.keras.applications.xception import Xception

我们以Resnet50为例,从头搭建一个深度学习模型,实现对Cifar10数据集的分类:

导入构建模型需要的python包

import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.utils import to_categorical
import os

导入Cifar10数据集

运行此代码会自动下载Cifar10数据集

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data()  
x_train = x_train.astype('float32') / 255  #预处理
x_test = x_test.astype('float32') / 255 
y_train = to_categorical(y_train, 10)  #对数据集进行onehot编码
y_test = to_categorical(y_test, 10)

构建Resnet50模型

若想使用其他模型,只需要把下述代码中的tf.keras.applications.ResNet50改成tf.keras.applications.其他模型,即可。

def resnet50_model():
	#include_top为是否包括原始Resnet50模型的全连接层,如果不需要自己定义可以设为True
	#不需要预训练模型可以将weights设为None
    resnet50=tf.keras.applications.ResNet50(include_top=False,
                                            weights='imagenet',
                                            input_shape=(32,32,3),
                                            )
	#设置预训练模型冻结的层,可根据自己的需要自行设置                                                                                      
    for layer in resnet50.layers[:15]:
        layer.trainable = False  #

	#选择模型连接到全连接层的位置
    last=resnet50.get_layer(index=30).output
    #建立新的全连接层
    x=tf.keras.layers.Flatten(name='flatten')(last)
    x=tf.keras.layers.Dense(1024,activation='relu')(x)
    x=tf.keras.layers.Dropout(0.5)(x)
    x=tf.keras.layers.Dense(128,activation='relu',name='dense1')(x)
    x=tf.keras.layers.Dropout(0.5,name='dense_dropout')(x)
    x=tf.keras.layers.Dense(10,activation='softmax')(x)

    model = tf.keras.models.Model(inputs=resnet50.input, outputs=x)
    model.summary() #打印模型结构
    return model

由于Cifar10数据集的输入图像较小,为了防止采样过度,我们选取resnet50的前30层,连接全连接层构成新的模型。
也可对Resnet50前几层的池化层进行修改,但是这需要对keras提供的代码进行修改,具体操作如下:
进入resnet.py
找到其中的Resnet函数,找到其中的以下代码:

  x = layers.ZeroPadding2D(
      padding=((3, 3), (3, 3)), name='conv1_pad')(img_input)
  x = layers.Conv2D(64, 7, strides=2, use_bias=use_bias, name='conv1_conv')(x)

  if not preact:
    x = layers.BatchNormalization(
        axis=bn_axis, epsilon=1.001e-5, name='conv1_bn')(x)
    x = layers.Activation('relu', name='conv1_relu')(x)

  x = layers.ZeroPadding2D(padding=((1, 1), (1, 1)), name='pool1_pad')(x)
  x = layers.MaxPooling2D(3, strides=2, name='pool1_pool')(x)

依次为头层padding、卷积层、padding层、池化层,可以根据需要进行修改。

模型构建及断点续训

选用SGD梯度下降优化器进行训练过程的优化

model=resnet50_model()
model.compile(
	loss='categorical_crossentropy',
	optimizer=tf.keras.optimizers.SGD(lr=0.1, decay=1e-4, momentum=0.9, nesterov=True),
	metrics=['accuracy']) 

checkpoint_save_path = "./checkpoint/resnet50_cifar.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):
	print('-------------load the model-------------------')
	model.load_weights(checkpoint_save_path)

checkpointer = tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_save_path, verbose=1, save_best_only=True,save_weights_only = True)  

正式训练

运行200个epochs,batch_size设为64

model.fit(
	x=x_train,
	y=y_train,
	batch_size=64,
	epochs=200,
	verbose=1,
	#callbacks=[checkpointer],
	validation_split=0.1,
	shuffle=True)

至此,完整的训练流程就构建完了,如果想对训练好的模型进行预测的话,可通过以下代码执行:

preds=model.predict(x_test)

进一步改善模型

可以通过进行数据增强、优化学习率等来进一步的改善模型的性能,将model.fit替换为如下代码,可实现相关功能:

#设置学习率,从0.1开始,每5次准确率不上升,降低一半学习率,最小下降到1e-20
lr_reducer = ReduceLROnPlateau(monitor='val_accuracy', factor=0.5, patience=5,
                               mode='max', min_lr=1e-20)
#进行图像增强                              
aug = ImageDataGenerator(width_shift_range=0.2, height_shift_range=0.2,
                         horizontal_flip=True, zoom_range=0.2)
aug.fit(x_train)
gen = aug.flow(x_train, y_train, batch_size=32)
model.fit_generator(generator=gen, epochs=200, validation_data=(x_test, y_test),
                     verbose=1,callbacks=[lr_reducer,checkpointer])
  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
CIFAR-10数据集分类是一个典型的图像分类问题,需要经过数据预处理、模型选择、模型训练和测试等多个步骤。下面将详细介绍这些步骤。 一、数据预处理 CIFAR-10数据集的图像大小为32x32像素,每个像素由三个颜色通道(红、绿、蓝)组成。在预处理过程中,需要将图像像素值归一化到0到1之间,并将标签(类别)转换为独热编码。此外,还可以进行数据增强操作,如旋转、翻转、裁剪等,以扩充训练数据集。 二、模型选择 常用的图像分类模型包括传统机器学习模型深度学习模型。传统机器学习模型如支持向量机(SVM)、随机森林(Random Forest)等,需要手工提取图像特征,然后使用分类器进行分类深度学习模型如卷积神经网络(CNN)则可以自动学习图像特征,具有更好的性能。在CIFAR-10数据集上,常用的深度学习模型包括LeNet、AlexNet、VGG、ResNet、Inception等。 三、模型训练 模型训练包括优化器选择、超参数调节、损失函数选择等步骤。优化器选择常用的有随机梯度下降(SGD)、Adam、Adagrad等。超参数调节包括学习率、批量大小、迭代次数等。损失函数选择常用的有交叉熵、均方误差等。在模型训练过程中,通常需要将训练数据集分成训练集和验证集,以便进行模型选择和调节超参数。 四、模型测试 模型测试包括模型评估和预测。模型评估通常使用准确率、召回率、F1值等指标。预测则根据模型输出的概率分布进行分类。 下面是一个简单的CIFAR-10数据集分类代码示例: ``` import tensorflow as tf from tensorflow.keras import datasets, layers, models import matplotlib.pyplot as plt # 加载数据集 (train_images, train_labels), (test_images, test_labels) = datasets.cifar10.load_data() # 数据预处理 train_images, test_images = train_images / 255.0, test_images / 255.0 train_labels = tf.keras.utils.to_categorical(train_labels, num_classes=10) test_labels = tf.keras.utils.to_categorical(test_labels, num_classes=10) # 构建模型 model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10, activation='softmax')) # 编译模型 model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # 训练模型 history = model.fit(train_images, train_labels, epochs=10, validation_data=(test_images, test_labels)) # 评估模型 test_loss, test_acc = model.evaluate(test_images, test_labels) print('Test accuracy:', test_acc) # 预测结果 predictions = model.predict(test_images) ``` 以上代码使用了一个简单的卷积神经网络模型,进行了10个周期的训练,并使用测试集进行了模型评估和预测。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值