tensorflow学习笔记之mnist的卷积神经网络实例

TensorFlow学习笔记之MNIST的卷积神经网络实例

随着深度学习的普及,卷积神经网络已成为图像和视觉任务中最常用的模型之一。在这篇文章中,我们将介绍如何使用Tensorflow创建一个基本的卷积神经网络(CNN)模型来处理MNIST数据集。

1. MNIST数据集

手写数字识别数据集MNIST是一个广泛使用的数据集,它包含60,000个训练样本和10,000个测试样本,每个样本都是一张28×28像素的灰度图像。每个图像都代表一个0到9之间的数字,目标是将图像正确地识别为与之对应的数字。可以使用Tensorflow的tf.keras.datasets模块轻松地下载和导入MNIST数据集,如下所示:

import tensorflow as tf

# Load MNIST dataset
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

2. 卷积神经网络模型

卷积神经网络(Convolutional Neural Network, CNN)是一种广泛用于图像分类和计算机视觉任务的深度神经网络。它的主要思想是在图像上滑动一些小的卷积核(卷积滤波器)来提取图像中的特征,例如边缘、纹理、形状等等。该模型通常以堆叠多个卷积层和池化层的方式构建,然后传递到一个或多个完全连接的网络层来进行分类。

我们将使用Tensorflow中的Keras API创建一个简单的卷积神经网络模型来处理MNIST数字图像。此模型将具有2个卷积层,2个最大池化层和2个完全连接的网络层,其中ReLU激活函数将用于所有层的输出。输出层使用softmax激活函数实现多分类,如下所示:

from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.models import Model

def cnn_model(input_shape, num_classes):
    inputs = Input(shape=input_shape)

    x = Conv2D(32, (3,3), activation='relu', padding='same')(inputs)
    x = Conv2D(32, (3,3), activation='relu')(x)
    x = MaxPooling2D(pool_size=(2,2))(x)

    x = Conv2D(64, (3,3), activation='relu', padding='same')(x)
    x = Conv2D(64, (3,3), activation='relu')(x)
    x = MaxPooling2D(pool_size=(2,2))(x)

    x = Flatten()(x)
    x = Dense(512, activation='relu')(x)
    predictions = Dense(num_classes, activation='softmax')(x)

    model = Model(inputs=inputs, outputs=predictions)

    return model

3. 训练和评估模型

在模型构建之后,我们需要进行模型的训练和评估。我们使用交叉熵损失函数和Adam优化器来训练我们的模型,并使用准确度作为性能指标。以下是模型的训练和评估代码:

from tensorflow.keras.utils import to_categorical

# Normalize pixel values
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.

# Reshape images as 4D tensor
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)

# Convert labels to one-hot encoding
y_train = to_categorical(y_train, num_classes=10)
y_test = to_categorical(y_test, num_classes=10)

# Create and compile model
model = cnn_model(input_shape=(28,28,1), num_classes=10)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# Train model
model.fit(x_train, y_train, batch_size=64, epochs=10, validation_split=0.1)

# Evaluate model
score = model.evaluate(x_test, y_test, verbose=0)
print('Test accuracy:', score[1])

在该代码中,我们首先将像素值从0-255缩放到0-1之间,然后将图像更改为4D张量。我们还将标签转换为one-hot编码。之后,我们创建并编译模型,使用模型的fit()方法训练模型,并使用其evaluate()方法对测试集进行评估。训练周期数和批量大小可以根据需要进行调整。

示例1:基于不同的激活函数对比

在本示例中,我们使用不同的激活函数测试我们的CNN模型的性能。我们将使用ReLU、sigmoid和tanh激活函数替换所有层的输出,然后比较它们的精度和训练时间。以下是实现该示例的代码:

import time

def test_activation_function(activation_function):
    start_time = time.time()
    model = cnn_model(input_shape=(28,28,1), num_classes=10)
    for layer in model.layers:
        if hasattr(layer, 'activation'):
            layer.activation = activation_function
    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
    model.fit(x_train, y_train, batch_size=64, epochs=10, validation_split=0.1, verbose=0)
    val_accuracy = model.evaluate(x_test, y_test, verbose=0)[1]
    train_time = time.time() - start_time
    return val_accuracy, train_time

# Test ReLU activation function
relu_val_accuracy, relu_train_time = test_activation_function('relu')

# Test Sigmoid activation function
sigmoid_val_accuracy, sigmoid_train_time = test_activation_function('sigmoid')

# Test Tanh activation function
tanh_val_accuracy, tanh_train_time = test_activation_function('tanh')

# Print results
print('ReLU val_accuracy: {:.2f}, train_time: {:.2f}'.format(relu_val_accuracy, relu_train_time))
print('Sigmoid val_accuracy: {:.2f}, train_time: {:.2f}'.format(sigmoid_val_accuracy, sigmoid_train_time))
print('Tanh val_accuracy: {:.2f}, train_time: {:.2f}'.format(tanh_val_accuracy, tanh_train_time))

在这个代码中,我们使用了一个名为test_activation_function的函数来测试不同的激活函数的性能。对于每个激活函数,我们创建一个新模型,并将其设置为所有层的输出。然后我们编译并训练模型,并测量训练时间和验证精度。最后,我们打印所有结果的总结。

示例2:通过调整模型参数提高模型性能

在本示例中,我们将使用不同的卷积核数量、卷积核大小、池化大小和完全连接的网络层节点数来测试我们的CNN模型的性能。我们将更改这些模型参数,并比较它们的测试精度。以下是该示例所需的代码:

import itertools

# Test different hyperparameters
conv_layers = [2, 3]
filters = [32, 64]
kernel_sizes = [3, 5]
pool_sizes = [2, 3]
dense_layers = [1, 2]
dense_nodes = [256, 512]

best_accuracy = 0

for (num_conv_layers, num_filters, kernel_size, pool_size, num_dense_layers, num_dense_nodes) in itertools.product(conv_layers, filters, kernel_sizes, pool_sizes, dense_layers, dense_nodes):
    inputs = Input(shape=(28,28,1))
    x = inputs

    for i in range(num_conv_layers):
        x = Conv2D(num_filters, (kernel_size, kernel_size), activation='relu', padding='same')(x)
        x = Conv2D(num_filters, (kernel_size, kernel_size), activation='relu')(x)
        x = MaxPooling2D(pool_size=(pool_size,pool_size))(x)

    x = Flatten()(x)

    for i in range(num_dense_layers):
        x = Dense(num_dense_nodes, activation='relu')(x)

    x = Dense(10, activation='softmax')(x)

    model = Model(inputs=inputs, outputs=x)

    model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

    model.fit(x_train, y_train, batch_size=64, epochs=10, validation_split=0.1, verbose=0)

    val_accuracy = model.evaluate(x_test, y_test, verbose=0)[1]

    if val_accuracy > best_accuracy:
        best_accuracy = val_accuracy
        best_params = (num_conv_layers, num_filters, kernel_size, pool_size, num_dense_layers, num_dense_nodes)

print('Best accuracy:', best_accuracy)
print('Best parameters (num_conv_layers, num_filters, kernel_size, pool_size, num_dense_layers, num_dense_nodes):', best_params)

在这个代码中,我们使用itertools.product()函数,使用不同的参数值创建所有可能的模型组合。然后,我们创建每个模型并用其训练和验证,然后记录最佳模型及其相应的参数值。最后,我们打印结果。

以上两个示例展示了如何通过更改激活函数和调整模型参数来提高卷积神经网络的性能。这些方法可以用于优化任何CNN模型,并可用于许多其他机器学习任务。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:tensorflow学习笔记之mnist的卷积神经网络实例 - Python技术站

(0)
上一篇 2023年5月25日
下一篇 2023年5月25日

相关文章

  • Nginx 请求压缩的实现(动态压缩,静态压缩)

    实现 Nginx 请求压缩可以大大减少网络传输时间和带宽使用,提高网站性能。Nginx 支持动态压缩和静态压缩两种方式来实现请求压缩,下面是详细的实现攻略。 动态压缩 动态压缩指的是在 Nginx 服务器上动态生成页面时,将页面内容压缩后返回给客户端浏览器。常用的压缩方式包括 Gzip 和 Brotli。 第一步:安装压缩模块 首先需要在 Nginx 上安装…

    人工智能概览 2023年5月25日
    00
  • SpringCloud与Consul集成实现负载均衡功能

    这里是Spring Cloud与Consul集成实现负载均衡的完整攻略。 简介 Spring Cloud是一个用于开发分布式应用的框架,它基于Spring Boot构建,可以快速构建和部署微服务。Consul是一个开源的服务发现和配置管理系统,可以帮助我们在大规模分布式系统中管理服务。Spring Cloud与Consul集成可以实现服务发现和负载均衡的功能…

    人工智能概览 2023年5月25日
    00
  • Django Auth应用实现用户身份认证

    下面是详细讲解“Django Auth应用实现用户身份认证”的完整攻略。 1. 安装 Django Auth 首先,需要安装 Django Auth 库。可以使用 pip 命令进行安装: pip install django-auth 2. 创建用户模型 在 models.py 中定义一个 User 模型,用于保存用户的基本信息。这个模型需要继承 Djang…

    人工智能概览 2023年5月25日
    00
  • C++右值引用与move和forward函数的使用详解

    C++右值引用与move和forward函数的使用详解 什么是右值引用 C++11引入了右值引用,即将“&&”符号用于声明右值引用。 右值引用的本质是一个临时对象的引用,它的生命周期受到限制,在语句执行完毕后,其所引用的对象就会被销毁。 右值引用可以作为函数的参数,用于传入临时对象(即将被销毁的对象),从而避免了不必要的对象拷贝。 示例代码如…

    人工智能概览 2023年5月25日
    00
  • iGame RTX 3090Ti显卡首测 性能再提10%!

    iGame RTX 3090Ti显卡首测 iGame RTX 3090Ti是一款性能非常强劲的显卡,它配备有NVIDIA的最新GPU技术,采用更先进的制造工艺,能够提供更高的运行速度和更流畅的游戏体验。下面是针对iGame RTX 3090Ti显卡的完整攻略: 硬件准备 要进行iGame RTX 3090Ti显卡的测试,我们需要先准备好以下硬件设备: 一台配…

    人工智能概览 2023年5月25日
    00
  • pytorch固定BN层参数的操作

    关于PyTorch中如何固定BN层的参数,通常有两种方法: 冻结BN层 在PyTorch中,可以通过requires_grad属性来决定一个参数是否需要被训练。为了固定BN层的参数,我们可以将其requires_grad属性设置为False,这样就不会更新其参数了。具体步骤如下: import torch.nn as nn bn_layer = nn.Bat…

    人工智能概论 2023年5月25日
    00
  • VS2019配置OpenCV4.1.0详细教程与测试代码(推荐)

    下面是VS2019配置OpenCV4.1.0的详细教程以及测试代码示例: 前置条件 安装Visual Studio 2019,最好安装最新版本。 安装CMake,建议最新版本。 下载OpenCV4.1.0 从OpenCV官方网站 https://opencv.org/releases/ 下载OpenCV 4.1.0版本。下载后,将解压后的文件夹重命名为”op…

    人工智能概览 2023年5月25日
    00
  • C#版Tesseract库的使用技巧

    C#版Tesseract库的使用技巧 概述 Tesseract是一个OCR(Optical Character Recognition)引擎,它可以识别图片中的文字,并将其转换为文本。C#版Tesseract库是Tesseract的一个C#封装库,方便了C#开发者在自己的项目中使用OCR技术。本文将介绍如何使用C#版Tesseract库。 安装C#版Tess…

    人工智能概论 2023年5月25日
    00
合作推广
合作推广
分享本页
返回顶部