应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的
发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。TensorFlow
千家信息网最后更新 2024年11月25日应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的TensorFlow是开发深度学习算法的主流框架,近来随着keras和pytorch等框架的崛起,它受到了不小挑战,为了应对竞争它本身也在进化,最近新出的2.0版本使得框架的应用更加简易和容易上手,本节我们就如何使用它2.0版本提出的eager模式进行探讨,在后面章节中我们将使用它来开发较为复杂的生成型对抗性网络。 最新流行的深度学习框架keras一大特点是接口的易用性和可理解性,它在Tensorflow的基础上进行了深度封装,它把很多技术细节隐藏起来,同时调整设计模式,使得基于keras的开发比Tensorflow要简单得多。 但keras对应的问题是,封装太好虽然有利于易用性,但是不利于开发人员,特别是初学者对模型设计的深入理解,由于我们主题是学习神经网络的设计原理,由于keras对模型设计模式的细节封装过度,因此反而不利于学习者。 为了兼顾易用性和对设计细节的把握性,我选择TF2.0带来的Eager模式,这样就能鱼和熊掌兼得。 我们首先看看Eager模式和传统模式有何区别。 传统模式一大特点是代码首先要创建一个会话对象,深度学习网络模型实际上是由多种运算节点构成的一张运算图,模型运行时需要依赖会话对象对运算图的驱动和管理,我们先看看传统模式的基本开发流程:
应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
import tensorflow as tf a = tf.constant(3.0) b = tf.placeholder(dtype = tf.float32) c = tf.add(a,b) sess = tf.Session() #创建会话对象 init = tf.global_variables_initializer() sess.run(init) #初始化会话对象 feed = { b: 2.0 } #对变量b赋值 c_res = sess.run(c, feed) #通过会话驱动计算图获取计算结果 print(c_res)
从上面代码看你会感觉有一种别扭,placeholder用来开辟一块内存,然后通过feed再把数值赋值到被开辟的内存中,然后再使用run驱动整个计算流程的运转,这种设计模式与传统编程模式的区别在于饶了一个弯,对很多TF的初学者而言,一开始要花不少精力去适应这种模式。
我们再看看eager模式下上面代码的设计过程,首先要注意一点是,要开启eager模式,需要在最开始处先执行如下代码:
import tensorflow as tf import tensorflow.contrib.eager as tfe tf.enable_eager_execution()
代码执行后TF就进入eager模式,接下来我们看看如何实现前面的运算步骤:
def add(num1, num2): a = tf.convert_to_tensor(num1) #将数值转换为TF张量,这有利于加快运算速度 b = tf.convert_to_tensor(num2) c = a + b return c.numpy() #将张量转换为数值 add_res = add(3.0, 4.0) print(add_res)
代码运行后输出结果7.0,可以看到eager模式的特点是省掉了传统模式绕弯的特点,它可以像传统编程模式那样从上到下的方式执行所有运算步骤,不需要特别去创建一个会话对象,然后再通过会话对象驱动所有运算步骤的执行,这种设计模式就更加简单易懂
我们看看如何使用eager模式开发一个简单的神经网络。 类似"Hello World!",在神经网络编程中常用与入门的练手项目叫鸢尾花识别,它的花瓣特征明显,不同品种对应花瓣的宽度和长度不同,因此可以通过通过神经网络读取花瓣信息后识别出其对应的品种,首先我们先加载相应训练数据:
from sklearn import datasets, preprocessing, model_selection data = datasets.load_iris() #加载数据到内存 x = preprocessing.MinMaxScaler(feature_range = (-1, 1)).fit_transform(data['data']) #将数据数值预处理到(-1,1)之间方便网络识别 #把不同分类的品种用向量表示,例如有三个不同品种,那么分别用(1,0,0),(0,1,0),(0,0,1)表示 y = preprocessing.OneHotEncoder(sparse = False).fit_transform(data['target'].reshape(-1, 1)) x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size = 0.25, stratify = y) #将数据分成训练集合测试集 print(len(x_train))
代码运行后可以看到拥有训练的数据有112条。 接下来我们创建一个简单的三层网络:
class IrisClassifyModel(object): def __init__(self, hidden_unit, output_unit): #这里只构建两层网络,第一层是输入数据 self.hidden_layer = tf.keras.layers.Dense(units = hidden_unit, activation = tf.nn.tanh, use_bias = True, name="hidden_layer") self.output_layer = tf.keras.layers.Dense(units = output_unit, activation = None, use_bias = True, name="output_layer") def __call__(self, inputs): return self.output_layer(self.hidden_layer(inputs))
我们用如下代码检测一下网络构建的正确性:
#构造输入数据检验网络是否正常运行 model = IrisClassifyModel(10, 3) train_dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train)) for x, y in tfe.Iterator(train_dataset.batch(32)): output = model(x) print(output.numpy()) break
代码如果正确运行并输出相应结果,那表明网络设计没有太大问题。 接着我们用下面代码设计损失函数和统计网络预测的准确性:
def make_loss(model, inputs, labels): return tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits_v2(logits = model(inputs), labels = labels)) opt = tf.train.AdamOptimizer(learning_rate = 0.01) def train(model, x, y): opt.minimize(lambda:make_loss(model, x, y)) accuracy = tfe.metrics.Accuracy() def check_accuracy(model, x_batch, y_batch): #统计网络判断结果的准确性 accuracy(tf.argmax(model(tf.constant(x_batch)), axis = 1), tf.argmax(tf.constant(y_batch), axis = 1)) return accuracy
最后我们启动网络训练流程,然后将网络训练的结果绘制出来:
import numpy as np model = IrisClassifyModel(10, 3) epochs = 50 acc_history = np.zeros(epochs) for epoch in range(epochs): for (x_batch, y_batch) in tfe.Iterator(train_dataset.shuffle(1000).batch(32)): train(model, x_batch, y_batch) acc = check_accuracy(model, x_batch, y_batch) acc_history[epoch] = acc.result().numpy() import matplotlib.pyplot as plt plt.figure() plt.plot(acc_history) plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.show()
上面代码运行后结果如下:
可以看到网络经过训练后准确率达到95%以上。 本节的目的是为了介绍TF2.0的eager模式,为后面开发更复杂的网络做技术准备。
看完上述内容,你们掌握应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注行业资讯频道,感谢各位的阅读!
模式
网络
代码
设计
数据
开发
运算
神经
传统
对象
结果
训练
运行
神经网络
学习
不同
品种
数值
框架
模型
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
数据库中信息管理系的英文缩写
关于网络安全问题英语作文
dba的职责是数据库安全
echo是什么服务器
应届生想学软件开发
电脑服务器需要硬盘通道吗
州市梦享网络技术有限公司
初中学生网络安全教育课
服务器管理器新增用户
重庆市网络安全企业
深圳锐思克网络技术有限公司
我们与网络安全的关系
青秀区网络安全
网络安全和数据恢复知识点
对网络安全心存侥幸
软件开发公司注册商标
伴随网络技术的发展英语翻译
如何崩溃腾讯数据库
数据库报inital
乡镇网络安全宣传周简报信息
中神网上怎么做网络安全
学校网络安全实施方案免费下载
网络安全和机房安全值班制度
wow单机版人物数据库
数据库中对数据的三种操作
拼多多平台服务器在哪里
渲图服务器
我的世界服务器文明
cmac是哪个数据库
江西通用软件开发报价表