0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深度学习笔记8:利用Tensorflow搭建神经网络

人工智能实训营 2018-08-24 18:31 次阅读

在笔记7中,和大家一起入门了 Tensorflow 的基本语法,并举了一些实际的例子进行了说明,终于告别了使用 numpy 手动搭建的日子。所以我们将继续往下走,看看如何利用 Tensorflow 搭建神经网络模型。

尽管对于初学者而言使用 Tensorflow 看起来并不那么习惯,需要各种步骤,但简单来说,Tensorflow 搭建模型实际就是两个过程:创建计算图和执行计算图。在 deeplearningai 课程中,NG和他的课程组给我们提供了 Signs Dataset (手势)数据集,其中训练集包括1080张64x64像素的手势图片,并给定了 6 种标注,测试集包括120张64x64的手势图片,我们需要对训练集构建神经网络模型然后对测试集给出预测。

先来简单看一下数据集:

#LoadingthedatasetX_train_orig,Y_train_orig,X_test_orig,Y_test_orig,classes=load_dataset()#FlattenthetrainingandtestimagesX_train_flatten=X_train_orig.reshape(X_train_orig.shape[0],-1).T
X_test_flatten=X_test_orig.reshape(X_test_orig.shape[0],-1).T#NormalizeimagevectorsX_train=X_train_flatten/255.X_test=X_test_flatten/255.#ConverttrainingandtestlabelstoonehotmatricesY_train=convert_to_one_hot(Y_train_orig,6)
Y_test=convert_to_one_hot(Y_test_orig,6)print("numberoftrainingexamples="+str(X_train.shape[1]))print("numberoftestexamples="+str(X_test.shape[1]))print("X_trainshape:"+str(X_train.shape))print("Y_trainshape:"+str(Y_train.shape))print("X_testshape:"+str(X_test.shape))print("Y_testshape:"+str(Y_test.shape))

640?wx_fmt=png

下面就根据 NG 给定的找个数据集利用 Tensorflow 搭建神经网络模型。我们选择构建一个包含 2 个隐层的神经网络,网络结构大致如下:
LINEAR -> RELU -> LINEAR -> RELU -> LINEAR -> SOFTMAX
正如我们之前利用
numpy 手动搭建一样,搭建一个神经网络的主要步骤如下:
-定义网络结构
-初始化模型参数
-执行前向计算/计算当前损失/执行反向传播/权值更新

创建 placeholder

根据 Tensorflow 的语法,我们首先创建输入X 和输出 Y 的占位符变量,这里需要注意 shape 参数的设置。

def create_placeholders(n_x, n_y):
  X = tf.placeholder(tf.float32, shape=(n_x, None), name='X')
  Y = tf.placeholder(tf.float32, shape=(n_y, None), name='Y')  
return X, Y
初始化模型参数

其次就是初始化神经网络的模型参数,三层网络包括六个参数,这里我们采用Xavier初始化方法:

def initialize_parameters(): 
  tf.set_random_seed(1)         
  W1 = tf.get_variable("W1", [25, 12288], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
  b1 = tf.get_variable("b1", [25, 1], initializer = tf.zeros_initializer())
  W2 = tf.get_variable("W2", [12, 25], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
  b2 = tf.get_variable("b2", [12, 1], initializer = tf.zeros_initializer())
  W3 = tf.get_variable("W3", [6, 12], initializer = tf.contrib.layers.xavier_initializer(seed = 1))
  b3 = tf.get_variable("b3", [6,1], initializer = tf.zeros_initializer())

  parameters = {"W1": W1,         
"b1": b1,
"W2": W2,
"b2": b2,
"W3": W3,
"b3": b3}
return parameters
执行前向传播
defforward_propagation(X,parameters):"""
Implementstheforwardpropagationforthemodel:LINEAR->RELU->LINEAR->RELU->LINEAR->SOFTMAX
"""

W1=parameters['W1']
b1=parameters['b1']
W2=parameters['W2']
b2=parameters['b2']
W3=parameters['W3']
b3=parameters['b3']

Z1=tf.add(tf.matmul(W1,X),b1)
A1=tf.nn.relu(Z1)
Z2=tf.add(tf.matmul(W2,A1),b2)
A2=tf.nn.relu(Z2)
Z3=tf.add(tf.matmul(W3,A2),b3)
returnZ3
计算损失函数

Tensorflow 中损失函数的计算要比手动搭建时方便很多,一行代码即可搞定:

def compute_cost(Z3, Y):
  logits = tf.transpose(Z3)
  labels = tf.transpose(Y)

  cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels = labels))  
return cost
代码整合:执行反向传播和权值更新

跟计算损失函数类似,Tensorflow 中执行反向传播的梯度优化非常简便,两行代码即可搞定,定义完整的神经网络模型如下:

def model(X_train, Y_train, X_test, Y_test, learning_rate = 0.0001,
     num_epochs = 1500, minibatch_size = 32, print_cost = True):
  ops.reset_default_graph()          
  tf.set_random_seed(1)             
  seed = 3                     
  (n_x, m) = X_train.shape            
  n_y = Y_train.shape[0]             
  costs = []                  

  # Create Placeholders of shape (n_x, n_y)
  X, Y = create_placeholders(n_x, n_y)  # Initialize parameters
  parameters = initialize_parameters()  # Forward propagation: Build the forward propagation in the tensorflow graph

  Z3 = forward_propagation(X, parameters)  # Cost function: Add cost function to tensorflow graph
  cost = compute_cost(Z3, Y)  # Backpropagation: Define the tensorflow optimizer. Use an AdamOptimizer.
  optimizer = tf.train.GradientDescentOptimizer(learning_rate = learning_rate).minimize(cost)  # Initialize all the variables
  init = tf.global_variables_initializer()  # Start the session to compute the tensorflow graph
  with tf.Session() as sess:    # Run the initialization
    sess.run(init)    # Do the training loop
    for epoch in range(num_epochs):
      epoch_cost = 0.          
      num_minibatches = int(m / minibatch_size) 
      seed = seed + 1
      minibatches = random_mini_batches(X_train, Y_train, minibatch_size, seed)      
for minibatch in minibatches: # Select a minibatch (minibatch_X, minibatch_Y) = minibatch _ , minibatch_cost = sess.run([optimizer, cost], feed_dict={X: minibatch_X, Y: minibatch_Y}) epoch_cost += minibatch_cost / num_minibatches # Print the cost every epoch if print_cost == True and epoch % 100 == 0:
print ("Cost after epoch %i: %f" % (epoch, epoch_cost))
if print_cost == True and epoch % 5 == 0: costs.append(epoch_cost) # plot the cost plt.plot(np.squeeze(costs)) plt.ylabel('cost') plt.xlabel('iterations (per tens)') plt.title("Learning rate =" + str(learning_rate)) plt.show() # lets save the parameters in a variable parameters = sess.run(parameters)
print ("Parameters have been trained!") # Calculate the correct predictions correct_prediction = tf.equal(tf.argmax(Z3), tf.argmax(Y)) # Calculate accuracy on the test set accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
print ("Train Accuracy:", accuracy.eval({X: X_train, Y: Y_train}))
print ("Test Accuracy:", accuracy.eval({X: X_test, Y: Y_test}))
return parameters

执行模型:

parameters=model(X_train,Y_train,X_test,Y_test)

640?wx_fmt=png

根据模型的训练误差和测试误差可以看到:模型整体效果虽然没有达到最佳,但基本也能达到预测效果。

总结
  • Tensorflow 语法中两个基本的对象类是 Tensor 和 Operator.

  • Tensorflow 执行计算的基本步骤为

    • 创建计算图(张量、变量和占位符变量等)

    • 创建会话

    • 初始化会话

    • 在计算图中执行会话

可以看到的是,在 Tensorflow 中编写神经网络要比我们手动搭建要方便的多,这也正是深度学习框架存在的意义之一。功能强大的深度学习框架能够帮助我们快速的搭建起复杂的神经网络模型,在经历了手动搭建神经网络的思维训练过程之后,这对于我们来说就不再困难了。

本文由《自兴动脑人工智能》项目部 凯文 投稿。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 神经网络
    +关注

    关注

    42

    文章

    4572

    浏览量

    98744
  • 人工智能
    +关注

    关注

    1776

    文章

    43845

    浏览量

    230596
  • 机器学习
    +关注

    关注

    66

    文章

    8122

    浏览量

    130556
  • 深度学习
    +关注

    关注

    73

    文章

    5237

    浏览量

    119907
收藏 人收藏

    评论

    相关推荐

    详解深度学习神经网络与卷积神经网络的应用

    在如今的网络时代,错综复杂的大数据和网络环境,让传统信息处理理论、人工智能与人工神经网络都面临巨大的挑战。近些年,深度学习逐渐走进人们的视线
    的头像 发表于 01-11 10:51 719次阅读
    详解<b class='flag-5'>深度</b><b class='flag-5'>学习</b>、<b class='flag-5'>神经网络</b>与卷积<b class='flag-5'>神经网络</b>的应用

    浅析深度神经网络压缩与加速技术

    深度神经网络深度学习的一种框架,它是一种具备至少一个隐层的神经网络。与浅层神经网络类似
    的头像 发表于 10-11 09:14 393次阅读
    浅析<b class='flag-5'>深度</b><b class='flag-5'>神经网络</b>压缩与加速技术

    深度学习神经网络架构解析

    感知器是所有神经网络中最基本的,也是更复杂的神经网络的基本组成部分。它只连接一个输入神经元和一个输出神经元。
    发表于 08-31 16:55 848次阅读
    <b class='flag-5'>深度</b><b class='flag-5'>学习</b>的<b class='flag-5'>神经网络</b>架构解析

    卷积神经网络模型搭建

    卷积神经网络模型搭建 卷积神经网络模型是一种深度学习算法。它已经成为了计算机视觉和自然语言处理等各种领域的主流算法,具有很大的应用前景。本篇
    的头像 发表于 08-21 17:11 610次阅读

    卷积神经网络深度神经网络的优缺点 卷积神经网络深度神经网络的区别

    深度神经网络是一种基于神经网络的机器学习算法,其主要特点是由多层神经元构成,可以根据数据自动调整神经
    发表于 08-21 17:07 2326次阅读

    卷积神经网络是什么?卷积神经网络的工作原理和应用

      卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习神经网络,主要用于图像和视频的识别、分类和预测,是计算机视觉领域中应用最广泛的
    发表于 08-21 17:03 1195次阅读

    卷积神经网络的基本原理 卷积神经网络发展 卷积神经网络三大特点

    卷积神经网络的基本原理 卷积神经网络发展历程 卷积神经网络三大特点  卷积神经网络的基本原理 卷积神经网络(Convolutional Ne
    的头像 发表于 08-21 16:49 1441次阅读

    卷积神经网络计算公式

    神经网络计算公式 神经网络是一种类似于人脑的神经系统的计算模型,它是一种可以用来进行模式识别、分类、预测等任务的强大工具。在深度学习领域,
    的头像 发表于 08-21 16:49 1206次阅读

    卷积神经网络三大特点

    卷积神经网络三大特点  卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,其具有三大特点:局部感知、参数共享和下采样。 一、局部感知
    的头像 发表于 08-21 16:49 3602次阅读

    Keras搭建神经网络的一般步骤

    1 keras是什么? Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。 Keras 的主要优点
    发表于 08-18 07:35

    卷积神经网络原理:卷积神经网络模型和卷积神经网络算法

    卷积神经网络原理:卷积神经网络模型和卷积神经网络算法 卷积神经网络(Convolutional Neural Network,CNN)是一种基于深度
    的头像 发表于 08-17 16:30 917次阅读

    TensorFlow神经网络量化为8

    随着TensorFlow Lite的推出,TensorFlow已经更新了量化技术和工具,您可以使用这些技术和工具来提高网络性能。 本指南向您展示如何量化网络,使其在训练过程中使用
    发表于 08-10 06:01

    如何使用TensorFlow神经网络模型部署到移动或嵌入式设备上

    有很多方法可以将经过训练的神经网络模型部署到移动或嵌入式设备上。不同的框架在各种平台上支持Arm,包括TensorFlow、PyTorch、Caffe2、MxNet和CNTK,如Android
    发表于 08-02 06:43

    浅析三种主流深度神经网络

    来源:青榴实验室1、引子深度神经网络(DNNs)最近在图像分类或语音识别等复杂机器学习任务中表现出的优异性能令人印象深刻。在本文中,我们将了解深度
    的头像 发表于 05-17 09:59 1081次阅读
    浅析三种主流<b class='flag-5'>深度</b><b class='flag-5'>神经网络</b>

    浅析三种主流深度神经网络

    来源:青榴实验室 1、引子 深度神经网络(DNNs)最近在图像分类或语音识别等复杂机器学习任务中表现出的优异性能令人印象深刻。 在本文中,我们将了解深度
    的头像 发表于 05-15 14:20 610次阅读
    浅析三种主流<b class='flag-5'>深度</b><b class='flag-5'>神经网络</b>