罗斯基白话:TensorFlow+实战系列(二)从零构建传统神经网络

本文主要是介绍罗斯基白话:TensorFlow+实战系列(二)从零构建传统神经网络,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

白话TensorFlow+实战系列(二)
从头构建传统神经网络

 

这次主要用TensorFlow从头构建一个传统神经网络作为案例,并总结需要注意的地方

 

创建一个神经网络主要有一下4个步骤:

1.定义神经网络的结构,即计算图

2.定义损失函数

3.在会话中,将数据输入进构建的神经网络中,反复优化损失函数,直至得到最优解

4.将测试集丢入训练好的神经网络进行验证

 

假设我们创建一个只有两个隐藏层的神经网络

先来看第一步:构建神经网络结构

一般在构建神经网络的初始,会先定义好超参数。参数与超参数是不一样的!参数指的是神经元进行计算时用到的权重(W)和偏置(b),而超参数一般指的是如学习率(learning_rate),一次性输入数据的个数(batch_size),遍历总数(epoch)等。

定义超参数如下:


learning_rate:用于控制梯度下降的幅度

batch_size:一次性输入数据个数

epoch_size:遍历总数

display_step:打印中间结果的步数

 

然后我们定义输入层、隐藏层、输出层神经元,如图


 

x:输入层。tf.placeholder函数在TensorFlow中可理解为占位用的,因为输入的数据在每次循环中都不一样,为了避免每次循环都要定义一个输入,可以用该函数存储当前循环的数据。float定义了数据类型, [None,  20]表示x的维度,其中None代表该数暂时不确定,其实这个None与batch_size的数据相对应,x可理解为一次性输入batch_size个数据,而每个数据有20个特征向量组成,即输入层有20个神经元。

 

y:输出层。因为有None个数据输入,所以输出也为None。5代表进行5分类

 

layer1、layer2代表隐藏层神经元个数

 

接着定义神经网络参数w、b



 

w中,h1代表的是输入层到第一层隐藏层的权重,因为输入层有20个神经元,隐藏层神经元个数为layer1,所以维度为[20,layer1]。h2同理。out表示第二层隐藏层到输出层的权重。

b同理。

其中tf.Variable是用来定义变量的函数,tf.random_normal是随机生成正太分布函数。

 

然后定义神经网络函数,如下:



其中,tf.nn.relu是非线性激励函数,常用的还有tf.sigmoid、tf.tanh

tf.matmul是矩阵相乘

output就是最后的输出。

至此,第一部分就已完成。

 

第二部分:定义损失函数

因为我们假设的是一个分类问题,将数据分成5类,正确的标签第一类可由[1,0,0,0,0]代表,第二类可由[0,1,0,0,0],因此输出层需要5个神经元来代表分成的5类。实际输出层的输出可能是[0.1,0.1, 0.6, 0.1, 0.1],因为与[0,0,1,0,0]最相近,我们可判定它属于第三类。


需要注意的是,在分类问题中,神经网络的输出层输出的数据需要经过一层额外的处理,叫做softmax层,softmax层的作用是将输出层的数据全部压缩至0~1之间,并且所有和等于1。这就可以理解成将输出层的数据变成概率分布的形式。然后就可以用交叉熵函数定义损失函数了。


TensorFlow中的tf.nn.softmax_cross_entropy_with_logits损失函数集成了上面所说的步骤,即先经过softmax层然后使用交叉熵就算损失。


由此,定义损失函数如下:


其中pred为预测的数据,即神经网络的输出

cost即损失函数,tf.reduce_mean是求平均损失,因为一次性输入的是多个(batch_size个)数据。

tf.train.AdamOptimizer是选择的优化器,其作用是最小化cost

init为初始化变量

至此,第二部分也已经完成

 

第三部分:创建会话,执行神经网络



首先进行初始化sess.run(init)

接着遍历epoch_step次所有数据,avg_cost用来记录一个epoch里所损失平均,注意cost是一个batch_size里的平均损失,两次平均不一样。total_batch表示batch_size的个数。

然后遍历每一个batch_size,x_batch与y_batch表示输入数据与对应的标签。

执行optimizer与cost,因为之前定义的x与y是用的占位符tf.placeholder,这里就要用feed_dict进行数据喂养。

epoch% display_step表示每display_step次数的epoch进行打印avg_cost

至此第三部分完成。

 

第四部分:将测试集丢入训练好的神经网络进行验证

首先在定义cost下面定义准确率的算法,如下



 

其中correct_pred代表预测正确的标签


tf.argmax函数返回的是张量在某一维最大值的索引值,由于标签向量是由0,1组成,因此最大值1所在的索引位置就是类别标签。如果pred的最大值所在的索引值等于类别标签的索引值,表示这个结果分类正确

tf.equal是TensorFlow中判断两个张量是否相等,返回的是一个布尔型张量,如[True,False,False]。


因为corret_pred是一个布尔型张量,因此需要用tf.cast()函数转化成float型来计算准确率,如[True,False,False,False]会变成[1,0,0,0],经过reduce_mean取平均值0.25来表示准确率。


最后打印准确率,为测试训练集的结果,如下:

 

feed_dict的是test_x与test_y

 

至此,一个完整的传统神经网络构建完成

 

完整代码如下:

 

import tensorflow as tflearning_rate = 0.01
batch_size = 16
epoch_step = 10000
display_step = 100x = tf.placeholder("float", [None, 20])
y = tf.placeholder("float", [None, 5])layer1 = 16
layer2 = 32w = {"h1":tf.Variable(tf.random_normal([20, layer1])),"h2":tf.Variable(tf.random_normal([layer1, layer2])),"out": tf.Variable(tf.random_normal([layer2, 5]))
}b = {"h1":tf.Variable(tf.random_normal([layer1])),"h2":tf.Variable(tf.random_normal([layer2])),"out":tf.Variable(tf.random_normal([5]))
}def network(x_input,weights,biases):net1 = tf.nn.relu(tf.matmul(x_input, weights["h1"]) + biases["h1"])net2 = tf.nn.relu(tf.matmul(net1, weights["h2"]) + biases["h2"])output = tf.matmul(net2, weights["out"]) + biases["out"]return outputpred = network(x, w, b)
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(pred, y))
optimizer = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cost)correct_pred = tf.equal(tf.argmax(y,1), tf.argmax(pred,1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, "float"))init = tf.global_variables_initializer()with tf.Session() as sess:sess.run(init)for epoch in range(epoch_step):avg_cost = 0total_batch = int(alldata / batch_size)for i in range(total_batch):x_batch, y_batch = 一个batch_size的输入,相对应输入的标签_,output = sess.run([optimizer, cost], feed_dict = {x:x_batch, y:y_batch})avg_cost += output / total_batchif epoch % display_step == 0:print("cost:",avg_cost)print("finish!")print("accuracy: ", sess.run(accuracy, feed_dict = {x: test_x, y: test_y}))

 

这篇关于罗斯基白话:TensorFlow+实战系列(二)从零构建传统神经网络的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/217666

相关文章

Python与DeepSeek的深度融合实战

《Python与DeepSeek的深度融合实战》Python作为最受欢迎的编程语言之一,以其简洁易读的语法、丰富的库和广泛的应用场景,成为了无数开发者的首选,而DeepSeek,作为人工智能领域的新星... 目录一、python与DeepSeek的结合优势二、模型训练1. 数据准备2. 模型架构与参数设置3

Java实战之利用POI生成Excel图表

《Java实战之利用POI生成Excel图表》ApachePOI是Java生态中处理Office文档的核心工具,这篇文章主要为大家详细介绍了如何在Excel中创建折线图,柱状图,饼图等常见图表,需要的... 目录一、环境配置与依赖管理二、数据源准备与工作表构建三、图表生成核心步骤1. 折线图(Line Ch

Java使用Tesseract-OCR实战教程

《Java使用Tesseract-OCR实战教程》本文介绍了如何在Java中使用Tesseract-OCR进行文本提取,包括Tesseract-OCR的安装、中文训练库的配置、依赖库的引入以及具体的代... 目录Java使用Tesseract-OCRTesseract-OCR安装配置中文训练库引入依赖代码实

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1