罗斯基白话: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

相关文章

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Pandas使用SQLite3实战

《Pandas使用SQLite3实战》本文主要介绍了Pandas使用SQLite3实战,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1 环境准备2 从 SQLite3VlfrWQzgt 读取数据到 DataFrame基础用法:读

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

使用Python和python-pptx构建Markdown到PowerPoint转换器

《使用Python和python-pptx构建Markdown到PowerPoint转换器》在这篇博客中,我们将深入分析一个使用Python开发的应用程序,该程序可以将Markdown文件转换为Pow... 目录引言应用概述代码结构与分析1. 类定义与初始化2. 事件处理3. Markdown 处理4. 转

Python实战之屏幕录制功能的实现

《Python实战之屏幕录制功能的实现》屏幕录制,即屏幕捕获,是指将计算机屏幕上的活动记录下来,生成视频文件,本文主要为大家介绍了如何使用Python实现这一功能,希望对大家有所帮助... 目录屏幕录制原理图像捕获音频捕获编码压缩输出保存完整的屏幕录制工具高级功能实时预览增加水印多平台支持屏幕录制原理屏幕

最新Spring Security实战教程之Spring Security安全框架指南

《最新SpringSecurity实战教程之SpringSecurity安全框架指南》SpringSecurity是Spring生态系统中的核心组件,提供认证、授权和防护机制,以保护应用免受各种安... 目录前言什么是Spring Security?同类框架对比Spring Security典型应用场景传统

最新Spring Security实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)

《最新SpringSecurity实战教程之表单登录定制到处理逻辑的深度改造(最新推荐)》本章节介绍了如何通过SpringSecurity实现从配置自定义登录页面、表单登录处理逻辑的配置,并简单模拟... 目录前言改造准备开始登录页改造自定义用户名密码登陆成功失败跳转问题自定义登出前后端分离适配方案结语前言