TensorFlow搭建神经网络

  • TensorFlow版本:2.13.0
  • TensorFlow官方文档
  • TensorFlow官方文档中文版

TensorFlow中搭建并训练一个神经网络分为以下几步:

  1. 定义神经网络
  2. 配置损失函数以及优化器
  3. 训练:反向传播、梯度下降

下面以LeNet-5为例,搭建一个卷积神经网络用于手写数字识别。(LeNet-5以及MNIST数据集介绍见PyTorch搭建神经网络)

1. 定义神经网络

TensorFlow提供了三种构建神经网络的方法,分别是继承Model类自定义模型、序列式以及函数式。

1.1 继承Model类自定义

  • 继承 keras.Model
  • 重写父类的 call 方法,该方法负责前向计算

例如:

from keras import layers
from tensorflow import kerasclass MyModel(keras.Model):def __init__(self):super(MyModel, self).__init__()self.conv1 = layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), activation='relu')self.pool1 = layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2))self.conv2 = layers.Conv2D(filters=16, kernel_size=(5, 5), strides=(1, 1), activation='relu')self.pool2 = layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2))self.fc1 = layers.Dense(units=16 * 4 * 4, activation='relu')self.fc2 = layers.Dense(units=120, activation='relu')self.fc3 = layers.Dense(units=10, activation='softmax')def call(self, x):x = self.conv1(x)x = self.pool1(x)x = self.conv2(x)x = self.pool2(x)x = layers.Flatten()(x)  # 二维压缩成一维x = self.fc1(x)x = self.fc2(x)x = self.fc3(x)return x

1.2 序列式

  • 该方式适用于简单的层堆栈,其中每一层恰好有一个输入张量和一个输出张量
  • 在以下情况下不适合使用该方法:
    • 模型有多个输入或多个输出
    • 任何层都有多个输入或多个输出
    • 需要进行图层共享
    • 想要非线性拓扑(如残差连接、多分支模型)

例如:

from keras import layers
from tensorflow import kerasdef my_model():model = keras.Sequential()model.add(layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), activation='relu'))model.add(layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2)))model.add(layers.Conv2D(filters=16, kernel_size=(5, 5), strides=(1, 1), activation='relu'))model.add(layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2)))model.add(layers.Flatten())model.add(layers.Dense(units=16 * 4 * 4, activation='relu'))model.add(layers.Dense(units=120, activation='relu'))model.add(layers.Dense(units=10, activation='softmax'))# 另一种堆叠神经网络的方式'''model = keras.Sequential([layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), activation='relu'),layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2)),layers.Conv2D(filters=16, kernel_size=(5, 5), strides=(1, 1), activation='relu'),layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2)),layers.Flatten(),layers.Dense(units=16 * 4 * 4, activation='relu'),layers.Dense(units=120, activation='relu'),layers.Dense(units=10, activation='softmax'),])'''return model

1.3 函数式

  • 该方法允许多个输入、多个输出、分支和层共享,是构建Keras模型最流行的方法
  • 深度学习的模型通常是由层 (layers) 组成的有向无环图,而函数式就是构建这种图的一种有效方式
  • 该方法:
    • 需要单独定义输入
    • 然后,需要创建一个输出对象,同时创建所有层,这些层相互关联并与输出相关联
    • 最后,创建一个接受输入和输出作为参数的模型对象

例如:

from keras import layers
from tensorflow import kerasdef my_model(input_shape):# 首先,创建一个输入节点inputs = keras.Input(input_shape)# 搭建神经网络x = layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), activation='relu')(inputs)x = layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2))(x)x = layers.Conv2D(filters=16, kernel_size=(5, 5), strides=(1, 1), activation='relu')(x)x = layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2))(x)x = layers.Flatten()(x)x = layers.Dense(units=16 * 4 * 4, activation='relu')(x)x = layers.Dense(units=120, activation='relu')(x)# 输出层outputs = layers.Dense(units=10, activation='softmax')(x)model = keras.Model(inputs=inputs, outputs=outputs)return model

2. 配置损失函数以及优化器

  • 损失函数

    损失函数用于计算真实值和预测值之间的差异。在TensorFlow官方文档中,给出了可用的损失函数列表。

    这里,我们使用交叉熵损失函数keras.losses.SparseCategoricalCrossentropy。该损失函数有一个参数from_logits ,该参数决定是否对预测值进行Softmax,默认值为 false

  • 优化器

    优化器根据损失函数求出的损失,对神经网络的参数进行更新。在TensorFlow官方文档中,给出了可用的优化器。这里,我们使用keras.optimizers.SGD作为我们的优化器。

from tensorflow import kerasloss = keras.losses.SparseCategoricalCrossentropy()  # 预测值已Softmax,from_logits 取默认值
optimizer = keras.optimizers.SGD(0.0001)

3. 训练以及测试模型

3.1训练模型

模型训练只需在配置好训练参数后调用 fit 函数即可,该函数会自动进行前向计算、反向传播、梯度下降。

如:

# 加载数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()# 维度调整,增加一个维度代表通道数
# 卷积神经网络的输入数据是4维的,分别代表: batch size,图片高度、宽度、通道数
# 批量大小在训练时指定,因此输入的数据应该是3维的,分别代表:图片高度、宽度、通道数
train_images = tf.reshape(train_images, (train_images.shape[0], train_images.shape[1], train_images.shape[2], 1))
train_images = tf.cast(train_images, tf.float32)test_images = tf.reshape(test_images, (test_images.shape[0], test_images.shape[1], test_images.shape[2], 1))
test_images = tf.cast(test_images, tf.float32)model = my_model(train_images.shape[1:])# 配置神经网络,设置损失函数、优化器
loss = keras.losses.SparseCategoricalCrossentropy()  # 预测值已Softmax,from_logits 取默认值
optimizer = keras.optimizers.SGD(0.0001)
model.compile(loss=loss, optimizer=keras.optimizers.SGD(0.00001))# 训练神经网络,设置训练集与验证集的比例、迭代次数、batch size等
model.fit(train_images, train_labels, validation_split=0.3, epochs=1000, batch_size=20)

注:

TensorFlow会自动决定是使用GPU还是CPU,默认情况下优先使用GPU

3.2 测试模型

模型训练只需调用 predict 函数即可。

pre_labels = model.predict(test_images)

4. 整体代码

import tensorflow as tf
from keras import datasets
from keras import layers
from tensorflow import kerasdef my_model(input_shape):# 首先,创建一个输入节点inputs = keras.Input(input_shape)# 搭建神经网络x = layers.Conv2D(filters=6, kernel_size=(5, 5), strides=(1, 1), activation='relu')(inputs)x = layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2))(x)x = layers.Conv2D(filters=16, kernel_size=(5, 5), strides=(1, 1), activation='relu')(x)x = layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2))(x)x = layers.Flatten()(x)x = layers.Dense(units=16 * 4 * 4, activation='relu')(x)x = layers.Dense(units=120, activation='relu')(x)# 输出层outputs = layers.Dense(units=10, activation='softmax')(x)model = keras.Model(inputs=inputs, outputs=outputs)return model# 加载数据集
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()# 维度调整,增加一个维度代表通道数
# 卷积神经网络的输入数据是4维的,分别代表: batch size,图片高度、宽度、通道数
# 批量大小在训练时指定,因此输入的数据应该是3维的,分别代表:图片高度、宽度、通道数
train_images = tf.reshape(train_images, (train_images.shape[0], train_images.shape[1], train_images.shape[2], 1))
train_images = tf.cast(train_images, tf.float32)test_images = tf.reshape(test_images, (test_images.shape[0], test_images.shape[1], test_images.shape[2], 1))
test_images = tf.cast(test_images, tf.float32)model = my_model(train_images.shape[1:])# 配置神经网络,设置损失函数、优化器
loss = keras.losses.SparseCategoricalCrossentropy()  # 预测值已Softmax,from_logits 取默认值
optimizer = keras.optimizers.SGD(0.0001)
model.compile(loss=loss, optimizer=keras.optimizers.SGD(0.00001))# 训练神经网络,设置训练集与验证集的比例、迭代次数、batch size等
model.fit(train_images, train_labels, validation_split=0.3, epochs=1000, batch_size=20)pre_labels = model.predict(test_images)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/24380.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

消息队列项目(2)

我们使用 SQLite 来进行对 Exchange, Queue, Binding 的硬盘保存 对 Message 就保存在硬盘的文本中 SQLite 封装 这里是在 application.yaml 中来引进对 SQLite 的封装 spring:datasource:url: jdbc:sqlite:./data/meta.dbusername:password:driver-class-name: org.sqlite.…

自定义elementui的主题

通常情况下,我们使用elementui框架的时候默认组件的主题都是白色的,比如: 但是如果想自定义主题,改变主题颜色,以及各种默认颜色,其实也不难: 配置默认主题,选好后点击下载 在vu…

【云计算 | Docker】Docker容器后台运行不了?entrypoint在作妖?

1. 问题 使用镜像alpine起个容器,使其保持后台运行,正常情况有如下的效果,可以发现容器保持运行状态。 [rootk8s-master helloWorld]# docker run -dit docker.io/alpine /bin/sh 8d39d7579d5e4f1a560aef16ba57ab5cae2506ea9105e21cbc0634…

python + seaborn绘制条形图

文章目录 条形图countplotpointplot条形图 条形图是我们熟悉的一种绘图方式,它可以实现这一目标。在 seaborn 中,barplot() 函数对一个完整的数据集进行操作,并应用一个函数来获取估计值(默认情况下取平均值)。当每个类别中有多个观测值时,它还会使用引导法计算估计值的…

墨觉Run Plus耳机真的很好嘛?南卡、韶音、墨觉哪个好

随着近年来蓝牙耳机市场的快速变化,耳机的样式也在不断演变,从入耳式发展到无需入耳的骨传导耳机。骨传导耳机因其可以通过骨传导技术进行声音传输,无需贴合耳道即可实现耳机功能,因此备受市场欢迎。尤其是近两年,骨传…

关于简单C++函数在内存中的存储问题

举例 int main(){... }int data(){... }int add(){... } 在分段式存储管理时,根据人们的需求,人为分段存储 如图:

ios_base::out和ios::out、ios_base::in和ios::in、ios_base::app和ios::app等之间有什么区别吗?

2023年8月2日,周三晚上 今天我看到了这样的两行代码: std::ofstream file("example.txt", std::ios_base::out);std::ofstream file("example.txt", std::ios::out);这让我产生了几个疑问: 为什么有时候用ios_base::o…

Matlab实现支持向量机算法(附上多个完整仿真源码)

支持向量机是一种常见的机器学习算法,它可以用于分类和回归问题。在Matlab中使用支持向量机,可以方便地构建和训练模型,并进行预测和评估。本文将介绍Matlab支持向量机的基本原理以及一个简单的分类案例。 文章目录 1. 支持向量机的基本原理2…

JAVA实现动态代理的两种方式及主要的区别

两种动态代理 JAVA中实现动态代理主要目的是为了实现AOP,即面向切面编程。 而动态代理主要是在程序运行期间,基于原类生成代理类,并且将需要织入的代码加入到代理类的方法中,可以实现动态的代码链接。 JAVA实现动态代理的两种方式…

如何通过 WordPress 数据库启用插件?【进不去后台可用】

如果您无法访问 WordPress 后台并需要激活插件以恢复访问权限,则可以通过 WordPress 数据库来实现。本文将向您展示如何使用数据库轻松激活 WordPress 插件。 何时使用数据库激活 WordPress 插件? 许多常见的 WordPress 错误会阻止网站所有者访问 WordP…

k8s目录

k8s笔记目录,更新中... 一 概念篇 1.1概念介绍 1.2 pod 1.3 controller 1.3.1 deployment 1.3.2 statefulset 1.3.3 daemonset 1.3.4 job和cronJob1 1.4 serivce和ingress 1.5 配置与存储 1.5.1 configMap 1.5.2 secret 1.5.3 持久化存储 1.5.4 pv、…

selenium 和 chromedriver 使用的一些总结

1 selenium 下载地址 selenium PyPIhttps://pypi.org/project/selenium/ 2 chromedriver 下载地址 ,可以下载最新版的 chromedriver ChromeDriver - WebDriver for Chrome - Downloadshttps://chromedriver.chromium.org/downloadsChrome for Testing availabi…

管理类联考——写作——论说文——实战篇——行文篇——通用性强,解释多种现象的经典理论——谈必要

前言 本节内容涉及“社会分工理论”“资源稀缺性”“瓶颈理论”等理论。这些理论一般用在“利大于弊式结构”中“整体有必要”的部分,也可用于“AB二元类”题目“谈好处”的部分。 需要注意的是,“有好处”一般指有它更好;“有必要”一般指没…

Kafka介绍

目录 1,kafka简单介绍 2,kafka使用场景 3,kafka基本概念 kafka集群 数据冗余 分区的写入 读取分区数据 顺序消费 顺序消费典型的应用场景: 批量消费 提交策略 kafka如何保证高并发 零拷贝技术(netty&#…

MySQL迁移到PostgreSQL操作指南

将MySQL数据库迁移到PostgreSQL数据库需要一些步骤和注意事项。以下是一个简单的指南,帮助您进行这样的迁移: 数据迁移: 首先,您需要将MySQL数据库中的数据迁移到PostgreSQL。有几种方法可以实现这一点: 使用工具&…

MIAOYUN获评“2023年度一云多芯稳定安全运行优秀案例”

2023年7月25日至26日,由中国信息通信研究院(简称“中国信通院”)、中国通信标准化协会主办的以“云领创新,算启新篇”为主题的“2023可信云大会”在北京成功举办。会上公布了多项前瞻领域的评估结果和2023年度最佳实践案例&#x…

IOS看书最终选择|源阅读转换|开源阅读|IOS自签

环境:IOS想使用 换源阅读 问题:换新手机,源阅读下架后,没有好的APP阅读小说 解决办法:自签APP 转换源仓库书源 最终预览 :https://rc.real9.cn/ 背景:自从我换了新iPhone手机,就无法…

zjzcyList.stream().map(Pb_zjzcy::getZjid).collect(Collectors.toList()); 解释一下

zjzcyList.stream().map(Pb_zjzcy::getZjid).collect(Collectors.toList()); 解释一下 这段代码是使用Java 8的流式处理(Stream)对一个存储了对象的列表(zjzcyList)进行操作,并最终返回一个包含了列表中每个对象的Zji…

svn 命令

连接服务器 ssh usernameip (不用端口)checkout 项目 svn checkout repourl --username username --password passwordrepourl: svn url删除文件(移除版本控制)1.从 SVN 移除版本控制,并删除文件svn delete filename2.从 SVN 移除版本控制,但是不删除文件…

生鲜蔬果小程序的完整教程

随着互联网的发展,线上商城成为了人们购物的重要渠道。其中,小程序商城在近年来的发展中,备受关注和青睐。本文将介绍如何使用乔拓云网后台搭建生鲜果蔬配送小程序,并快速上线。 首先,登录乔拓云网后台,进入…