温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的

发布时间:2021-12-23 15:54:41 来源:亿速云 阅读:209 作者:柒染 栏目:大数据

应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

TensorFlow是开发深度学习算法的主流框架,近来随着keras和pytorch等框架的崛起,它受到了不小挑战,为了应对竞争它本身也在进化,最近新出的2.0版本使得框架的应用更加简易和容易上手,本节我们就如何使用它2.0版本提出的eager模式进行探讨,在后面章节中我们将使用它来开发较为复杂的生成型对抗性网络。
最新流行的深度学习框架keras一大特点是接口的易用性和可理解性,它在Tensorflow的基础上进行了深度封装,它把很多技术细节隐藏起来,同时调整设计模式,使得基于keras的开发比Tensorflow要简单得多。  但keras对应的问题是,封装太好虽然有利于易用性,但是不利于开发人员,特别是初学者对模型设计的深入理解,由于我们主题是学习神经网络的设计原理,由于keras对模型设计模式的细节封装过度,因此反而不利于学习者。  为了兼顾易用性和对设计细节的把握性,我选择TF2.0带来的Eager模式,这样就能鱼和熊掌兼得。
我们首先看看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()  
上面代码运行后结果如下:  
 应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的
可以看到网络经过训练后准确率达到95%以上。  本节的目的是为了介绍TF2.0的eager模式,为后面开发更复杂的网络做技术准备。


看完上述内容,你们掌握应用Tensorflow2.0的Eager模式是怎么快速构建神经网络的的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI