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

yizhihongxing

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日

相关文章

  • Python中if语句的使用方法及实例代码

    针对“Python中if语句的使用方法及实例代码”的完整攻略,我将按照以下几个方面进行讲解: if语句的概述:if语句是Python中最基本的流程控制语句,用于根据条件的真假执行不同的代码段。 if语句的语法:Python中if语句的语法格式如下: if 条件语句: 执行语句1 else: 执行语句2 其中,条件语句可以使用关系运算符、逻辑运算符或位运算符等…

    人工智能概论 2023年5月24日
    00
  • Python Celery动态添加定时任务生产实践指南

    Python Celery动态添加定时任务生产实践指南 什么是Celery Celery 是一个基于 Python 实现的分布式任务队列,用于处理大量的异步任务。Celery 可以让你的应用程序分布式地运行,而不必担心每个任务在哪台机器上运行。Celery 提供了简单易用的 API,可以让我们将代码实现成一个异步任务,并且能够在多个 worker 中执行,支…

    人工智能概览 2023年5月25日
    00
  • Python3+cgroupspy安装使用简介

    Python3+cgroupspy安装使用简介 什么是cgroup? cgroup 全称为 Control Group,中文翻译为“控制组”,它是一种 Linux 内核机制,用于限制、记录、隔离和管理系统资源(比如 CPU、内存、硬盘 I/O)。通过使用 cgroup,你可以对应用程序的资源使用进行限制,从而避免因为某个应用程序对某一资源的过度消耗而使其他应…

    人工智能概览 2023年5月25日
    00
  • centos7如何设置密码规则?centos7设置密码规则的方法

    下面是详细讲解“centos7如何设置密码规则?centos7设置密码规则的方法”的完整攻略。 设置密码规则 CentOS 7使用强密码来保护用户的帐户。在CentOS 7中,通过修改PAM(Pluggable Authentication Modules,可插入身份验证模块)配置文件,可以设置密码规则来确保用户密码的强度。下面是设置密码规则的步骤: 步骤1…

    人工智能概览 2023年5月25日
    00
  • Bootstrap框架建立树形菜单(Tree)的实例代码

    Bootstrap框架提供了用于创建平台可用的用户界面组件的组合工具。其中之一就是树形菜单(Tree)。通过使用Bootstrap,我们可以从头开始创建一个完整的树形菜单,并将其集成到我们的网站或应用程序中。 以下是建立树形菜单的步骤: 1. 引入Bootstrap库和jQuery库 在标签中引入Bootstrap库和jQuery库。 <head&gt…

    人工智能概论 2023年5月25日
    00
  • echarts动态获取Django数据的实现示例

    下面我会详细讲解“echarts动态获取Django数据的实现示例”的完整攻略。 1. 准备工作 第一步,需要安装ECharts和Django,可以使用以下命令: pip install django pip install echarts 第二步,创建一个Django项目: django-admin startproject myproject cd my…

    人工智能概论 2023年5月25日
    00
  • CentOS 6.5下安装Python 3.5.2(与Python2并存)

    下面是详细的攻略。 准备工作 由于我们需要安装Python3.5.2,所以我们需要先下载Python3.5.2的源文件。可以在Python官网(https://www.python.org/downloads/release/python-352/) 下载到Python3.5.2的源文件,并将其保存在CentOS服务器的某个目录下,例如/home/pytho…

    人工智能概览 2023年5月25日
    00
  • python和php学习哪个更有发展

    首先,需要明确python和php都是目前非常热门的编程语言,都具有广泛的应用场景。如果想要选择其中一种语言进行学习,需要考虑自己的兴趣、职业规划以及市场需求等多个因素。下面就为大家提供一些精准的攻略和示例说明: 1. Python 1.1 优点 Python语法简单易懂,容易上手; Python有广泛的应用场景,如人工智能、数据分析、网络爬虫等; Pyth…

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