从零使用TensorFlow搭建CNN(卷积)神经网络

这篇具有很好参考价值的文章主要介绍了从零使用TensorFlow搭建CNN(卷积)神经网络。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🍅 写在前面
👨‍🎓 博主介绍:大家好,这里是hyk写算法了吗,一枚致力于学习算法和人工智能领域的小菜鸟。
🔎个人主页:主页链接(欢迎各位大佬光临指导)
⭐️近期专栏:机器学习与深度学习
                       LeetCode算法实例

总览

本节内容主要向大家介绍如何使用TensorFlow快速搭建自己的卷积神经网络,并通过cifar数据集训练验证。文章最后会有相关内容知识点的补给。

数据集简介

Cifar-10 是由 Hinton 的学生 Alex Krizhevsky、Ilya Sutskever 收集的一个用于普适物体识别的计算机视觉数据集,它包含 60000 张 32 X 32 的 RGB 彩色图片,总共 10 个分类。其中,包括 50000 张用于训练集,10000 张用于测试集。

从零使用TensorFlow搭建CNN(卷积)神经网络

第三方库准备

import tensorflow as tf

import numpy as np
from matplotlib import pyplot as plt

该项目使用上述第三方库,大家提前下载需要提前下载好。

加载数据

cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

首次使用需要联网下载一段时间数据集,大家耐心等待下。

搭建cnn模型类以及相关方法

# 继承自tf.keras.Model
class Baseline(tf.keras.Model):
    def __init__(self):
        super(Baseline, self).__init__()
        # 第一层卷积
        self.c1 = tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='same')
        # 第一层BN
        self.b1 = tf.keras.layers.BatchNormalization()
        # 激活函数层
        self.a1 = tf.keras.layers.Activation('relu')
        # 池化层
        self.p1 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding='same')
        # Dropout层
        self.d1 = tf.keras.layers.Dropout(0.2)
        # 将卷积获得的网络拉平以便后序全连接层使用
        self.flatten = tf.keras.layers.Flatten()
        # 一层全连接
        self.f1 = tf.keras.layers.Dense(128, activation='relu')
        # 又一层dropout
        self.d2 = tf.keras.layers.Dropout(0.2)
        # 第二层全连接
        self.f2 = tf.keras.layers.Dense(10, activation='softmax')
		# 读入inputs数据,并进行操作返回
    def call(self, inputs):
        x = self.c1(inputs)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)
        x = self.d1(x)
        x = self.flatten(x)
        x = self.f1(x)
        x = self.d2(x)
        y = self.f2(x)
        return y

训练模型

# 创建模型对象
model = Baseline()
# 指明优化器、损失函数、准确率计算函数
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=[tf.keras.metrics.sparse_categorical_accuracy])
# 开始训练
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
# 展示训练的过程
model.summary()

画图展示结果

# show
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
print(acc)
print(val_loss)

plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(loss, label='Training loss')
plt.plot(val_loss, label='Validation loss')
plt.title('Training and Validation loss')
plt.legend()
plt.show()

分别展示了训练集和测试集上精确度、损失值的对比

项目整体代码

import tensorflow as tf

import numpy as np
from matplotlib import pyplot as plt

np.set_printoptions(threshold=np.inf)

cifar10 = tf.keras.datasets.cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0


class Baseline(tf.keras.Model):
    def __init__(self):
        super(Baseline, self).__init__()
        self.c1 = tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='same')
        self.b1 = tf.keras.layers.BatchNormalization()
        self.a1 = tf.keras.layers.Activation('relu')
        self.p1 = tf.keras.layers.MaxPool2D(pool_size=(2, 2), strides=2, padding='same')
        self.d1 = tf.keras.layers.Dropout(0.2)
        self.flatten = tf.keras.layers.Flatten()
        self.f1 = tf.keras.layers.Dense(128, activation='relu')
        self.d2 = tf.keras.layers.Dropout(0.2)
        self.f2 = tf.keras.layers.Dense(10, activation='softmax')

    def call(self, inputs):
        x = self.c1(inputs)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)
        x = self.d1(x)
        x = self.flatten(x)
        x = self.f1(x)
        x = self.d2(x)
        y = self.f2(x)
        return y


model = Baseline()
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=[tf.keras.metrics.sparse_categorical_accuracy])
history = model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()

# show
acc = history.history['sparse_categorical_accuracy']
val_acc = history.history['val_sparse_categorical_accuracy']
loss = history.history['loss']
val_loss = history.history['val_loss']
print(acc)
print(val_loss)

plt.figure(figsize=(8, 8))
plt.subplot(1, 2, 1)
plt.plot(acc, label='Training Accuracy')
plt.plot(val_acc, label='Validation Accuracy')
plt.title('Training and Validation Accuracy')
plt.legend()

plt.subplot(1, 2, 2)
plt.plot(loss, label='Training loss')
plt.plot(val_loss, label='Validation loss')
plt.title('Training and Validation loss')
plt.legend()
plt.show()

运行结果

从零使用TensorFlow搭建CNN(卷积)神经网络

从零使用TensorFlow搭建CNN(卷积)神经网络
从零使用TensorFlow搭建CNN(卷积)神经网络

部分知识点整理

模型建立

  • tf.keras.models.Sequential([网络结构]) # 描述各层网洛Sequentail()可以认为是个容器,这个容器里封装了一个神经网络结构。在Sequential中要描述从输入层到输出层每一层的网络结构。
    每一层的网络结构可以是
  • 拉直层: tf.keras.layers.Flatten() ,这一层不含计算,只是形状转换,把输入特征拉直,变成一维数组
  • 全连接层:
    tf.keras.layers.Dense(神经元个数,activation=“激活函数”,kernel_regularizer=哪种正则化),这一层告知神经元个数、使用什么激活函数、采用什么正则化方法 激活函数可以选择relu, softmax, sigmoid, tanh等
  • 正则化可以选择 tf.keras.regularizers.l1(), tf.keras.relularizers.l2()
  • 卷积神经网络层:tf.keras.layers.Conv2D(filters=卷积核个数,kernel_size=卷积核尺寸,strides=卷积步长, padding=“valid” or “same”)
  • 循环神经网络层:tf.keras.layers.LSTM()

model.compile

model.compile(optimizer=优化器,loss=损失函数,metrics=["准确率"])在这里告知训练时选择的优化器、损失函数、和评测指标。 这些参数都可以使用字符串形式或函数形式

  • optimizer: 引导神经网络更新参数

    • sgd or tf.keras.optimizer.SGD(lr=学习率,momentum=动量参数)
    • adagrad or tf.keras.optimizer.Adagrad(lr=学习率)
    • adadelta or tf.keras.optimizer.Adadelta(lr=学习率)
    • adam or tf.keras.optimizer.Adam(lr=学习率, beta_1=0.9, beta_2=0.999)
  • loss: 损失函数

    • mes or tf.keras.losses.MeanSquaredError()

    • sparse_categorical_crossentropy or
      tf.keras.SparseCategoricalCrossentropy(from_logits=False)(是原始输出还是经过概率分布)

  • metrics:评测指标文章来源地址https://www.toymoban.com/news/detail-421149.html

    • accuracy:y_ 和 y 都是数值,如y_=[1] y=[1]
    • categorical_accuracy: y_和y都是独热码(概率分布),如y_=[0, 1, 0], y=[0.256, 0.695,
      0.048]
    • sparse_categorical_accuracy: y_是数值,y是独热码(概率分布),如y_=[1], y=[0.256,
      0.695, 0.048]

训练模型

 model.fit(训练集的输入特征,训练集的标签,batch_size= 每次喂入神经网络的样本数, epochs=迭代多少次数据集, validation_data=(测试集的输入特征,测试集的标签,), validation_split=从训练集划分多少比例给测试集,validation_freq=多少次epoch测试一次)

打印网络结构和参数统计

 model.summary()

到了这里,关于从零使用TensorFlow搭建CNN(卷积)神经网络的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CNN卷积神经网络实现手写数字识别(基于tensorflow)

    卷积网络的 核心思想 是将: 局部感受野 权值共享(或者权值复制) 时间或空间亚采样 卷积神经网络 (Convolutional Neural Networks,简称: CNN )是深度学习当中一个非常重要的神经网络结构。它主要用于用在 图像图片处理 , 视频处理 , 音频处理 以及 自然语言处理 等等。

    2024年02月11日
    浏览(31)
  • 大数据深度学习:基于Tensorflow深度学习卷积神经网络CNN算法垃圾分类识别系统

    随着社会的发展和城市化进程的加速,垃圾分类已经成为了环境保护和可持续发展的重要课题。然而,传统的垃圾分类方法通常依赖于人工识别,效率低下且易出错。因此,本项目旨在利用大数据和深度学习技术,构建一个基于 TensorFlow 深度学习的神经网络 CNN(Convolutional

    2024年04月14日
    浏览(38)
  • Pytorch 与 Tensorflow对比学习 第3周:进阶主题 Day 15-16: 卷积神经网络(CNN)

    第3周:进阶主题 Day 15-16: 卷积神经网络(CNN) 在这两天中,我专注于学习卷积神经网络(CNN)的基础知识,包括卷积层和池化层的工作原理以及它们在图像处理中的应用。 卷积神经网络基础: 卷积层:学习了卷积层如何通过滤波器(或称为核)提取图像的特征。每个滤波器

    2024年01月20日
    浏览(35)
  • Matlab深度学习入门实例:从0搭建卷积神经网络CNN(附完整代码)

    网上已具有大量卷积神经网络的讲解,故本文不在对此赘述,这篇文章针对已了解CNN基础结构和原理者,以一个例子搭建一个简单的卷积神经网络,作为正式迈入深度学习的第一步。 我们以深度学习最经典的案例——手写数字的识别,和一种经典的CNN——LeNet进行本次学习。

    2024年02月01日
    浏览(44)
  • 卷积神经网络(CNN)入门:使用Python实现手写数字识别

    在上一篇文章中,我们介绍了如何使用Python实现一个简单的前馈神经网络。本文将重点介绍卷积神经网络(CNN),这是一种在计算机视觉任务中表现优异的深度学习模型。我们将从卷积神经网络的基本原理开始,介绍卷积层、池化层和全连接层等概念,然后使用Python和Keras库

    2023年04月15日
    浏览(38)
  • 深度学习:使用卷积神经网络CNN实现MNIST手写数字识别

    本项目基于pytorch构建了一个深度学习神经网络,网络包含卷积层、池化层、全连接层,通过此网络实现对MINST数据集手写数字的识别,通过本项目代码,从原理上理解手写数字识别的全过程,包括反向传播,梯度下降等。 卷积神经网络是一种多层、前馈型神经网络。从功能上

    2024年02月13日
    浏览(33)
  • 使用 PyTorch 和 OpenCV 实现简单卷积神经网络(CNN)的过程

    使用 PyTorch 和 OpenCV 实现简单卷积神经网络(CNN)的过程,如何构建一个简单的卷积神经网络模型,并通过使用预定义的滤波器对灰度图像进行卷积操作和激活函数处理,最终可视化了卷积层和激活层的输出结果。 1.图像处理: 使用 OpenCV 读取图像,并将彩色图像转换为灰度

    2024年01月17日
    浏览(35)
  • 【使用 k 折叠交叉验证的卷积神经网络(CNN)】基于卷积神经网络的无特征EMG模式识别研究(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 文献来源

    2024年02月11日
    浏览(33)
  • CNN卷积神经网络

    一、 什么是CNN卷积神经网络 卷积神经网络由三部分组成:输入层、由n个卷积层和池化层的组合组成、全连结的多层感知机分类器。 深度学习的迅速发展,我们会在不同的应用场景会使用不同的神经网络,没有一个神经网络他能在任何场景下,效果都好,也没有说某一个算法

    2024年02月06日
    浏览(42)
  • 关于CNN卷积神经网络

    CNN代表卷积神经网络(Convolutional Neural Network) 它是一种深度学习算法,特别适用于处理图像和视频数据。CNN由多个 卷积层、池化层和全连接层 组成,通过学习图像或视频数据的特征来进行 分类、识别或检测任务 。与传统的全连接神经网络相比,CNN的 参数数量较少 ,能够

    2023年04月09日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包