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

    文章

    4827

    浏览量

    106803
  • 人工智能
    +关注

    关注

    1813

    文章

    49743

    浏览量

    261586
  • 机器学习
    +关注

    关注

    66

    文章

    8541

    浏览量

    136236
  • 深度学习
    +关注

    关注

    73

    文章

    5591

    浏览量

    123912
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    NMSIS神经网络库使用介绍

    :   神经网络卷积函数   神经网络激活函数   全连接层函数   神经网络池化函数   Softmax 函数   神经网络支持功能   该库具有用于操作不同权重和激活数据类型的
    发表于 10-29 06:08

    在Ubuntu20.04系统中训练神经网络模型的一些经验

    本帖欲分享在Ubuntu20.04系统中训练神经网络模型的一些经验。我们采用jupyter notebook作为开发IDE,以TensorFlow2为训练框架,目标是训练一个手写数字识别的神经网络
    发表于 10-22 07:03

    如何在机器视觉中部署深度学习神经网络

    图 1:基于深度学习的目标检测可定位已训练的目标类别,并通过矩形框(边界框)对其进行标识。 在讨论人工智能(AI)或深度学习时,经常会出现“神经网络
    的头像 发表于 09-10 17:38 698次阅读
    如何在机器视觉中部署<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>神经网络</b>

    神经网络专家系统在电机故障诊断中的应用

    摘要:针对传统专家系统不能进行自学习、自适应的问题,本文提出了基于种经网络专家系统的并步电机故障诊断方法。本文将小波神经网络和专家系统相结合,充分发挥了二者故障诊断的优点,很大程度上降低了对电机
    发表于 06-16 22:09

    基于FPGA搭建神经网络的步骤解析

    本文的目的是在一个神经网络已经通过python或者MATLAB训练好的神经网络模型,将训练好的模型的权重和偏置文件以TXT文件格式导出,然后通过python程序将txt文件转化为coe文件,(coe
    的头像 发表于 06-03 15:51 899次阅读
    基于FPGA<b class='flag-5'>搭建</b><b class='flag-5'>神经网络</b>的步骤解析

    BP神经网络网络结构设计原则

    ,仅作为数据输入的接口。输入层的神经元个数通常与输入数据的特征数量相对应。 隐藏层 :对输入信号进行非线性变换,是神经网络的核心部分,负责学习输入与输出之间的复杂映射关系。隐藏层可以有一层或多层,层数和
    的头像 发表于 02-12 16:41 1255次阅读

    BP神经网络与卷积神经网络的比较

    BP神经网络与卷积神经网络在多个方面存在显著差异,以下是对两者的比较: 一、结构特点 BP神经网络 : BP神经网络是一种多层的前馈神经网络
    的头像 发表于 02-12 15:53 1316次阅读

    如何优化BP神经网络学习

    优化BP神经网络学习率是提高模型训练效率和性能的关键步骤。以下是一些优化BP神经网络学习率的方法: 一、理解学习率的重要性
    的头像 发表于 02-12 15:51 1430次阅读

    BP神经网络的实现步骤详解

    BP神经网络的实现步骤主要包括以下几个阶段:网络初始化、前向传播、误差计算、反向传播和权重更新。以下是对这些步骤的详细解释: 一、网络初始化 确定网络结构 : 根据输入和输出数据的特性
    的头像 发表于 02-12 15:50 1124次阅读

    BP神经网络的优缺点分析

    BP神经网络(Back Propagation Neural Network)作为一种常用的机器学习模型,具有显著的优点,同时也存在一些不容忽视的缺点。以下是对BP神经网络优缺点的分析: 优点
    的头像 发表于 02-12 15:36 1596次阅读

    什么是BP神经网络的反向传播算法

    神经网络(即反向传播神经网络)的核心,它建立在梯度下降法的基础上,是一种适合于多层神经元网络学习算法。该算法通过计算每层网络的误差,并将这
    的头像 发表于 02-12 15:18 1282次阅读

    BP神经网络深度学习的关系

    BP神经网络深度学习之间存在着密切的关系,以下是对它们之间关系的介绍: 一、BP神经网络的基本概念 BP神经网络,即反向传播
    的头像 发表于 02-12 15:15 1351次阅读

    BP神经网络在图像识别中的应用

    BP神经网络在图像识别中发挥着重要作用,其多层结构使得网络能够学习到复杂的特征表达,适用于处理非线性问题。以下是对BP神经网络在图像识别中应用的分析: 一、BP
    的头像 发表于 02-12 15:12 1191次阅读

    深度学习入门:简单神经网络的构建与实现

    深度学习中,神经网络是核心模型。今天我们用 Python 和 NumPy 构建一个简单的神经网络神经网络由多个
    的头像 发表于 01-23 13:52 847次阅读

    人工神经网络的原理和多种神经网络架构方法

    在上一篇文章中,我们介绍了传统机器学习的基础知识和多种算法。在本文中,我们会介绍人工神经网络的原理和多种神经网络架构方法,供各位老师选择。 01 人工神经网络   人工
    的头像 发表于 01-09 10:24 2258次阅读
    人工<b class='flag-5'>神经网络</b>的原理和多种<b class='flag-5'>神经网络</b>架构方法