用tensorflow搭建自己的神经网络

1.创建一个神经网络层

2.运用神经网络层搭建完整神经网络

3.显示训练过程

4.tensorboard展示神经网络图


  神经网络的基本知识:【机器学习】神经网络介绍  和 【深度学习】卷积神经网络入门

  本节用tensorflow来搭建一个神经网络,实现y=x*x+1的拟合。

1.创建一个神经网络层

   在之前的学习中,了解到一个完整的神经网络,包括输入层、卷积层、池化层、全连接层等部分。在tensorflow中,也已经有了专门的卷积层函数,例如:tf.nn.conv2d(卷积)、tf.nn.max_pool(池化)等。

   那如果想学习自己搭建一个神经网络层,需要包含哪些部分呢?

   如下图所示,一个神经网络层需要有数据输入、数据输出、激活函数。

            

 创建一个神经网络层


    
    
  1. #创建一个神经网络层
  2. def add_layer(input,in_size,out_size,activation_function=None):
  3. """
  4. :param input: 数据输入
  5. :param in_size: 输入大小(前一层神经元个数)
  6. :param out_size: 输出大小(本层神经元个数)
  7. :param activation_function: 激活函数(默认没有)
  8. :return:
  9. """
  10. Weight=tf.Variable(tf.random_normal([in_size,out_size]) )
  11. biases=tf.Variable(tf.zeros([ 1,out_size]) + 0.1 )
  12. W_mul_x_plus_b=tf.matmul(input,Weight) + biases
  13. #根据是否有激活函数
  14. if activation_function == None:
  15. output=W_mul_x_plus_b
  16. else:
  17. output=activation_function(W_mul_x_plus_b)
  18. return output

分析:

    参数如下,

        input:输入个数

        in_size: 当前层的输入的个数

        out_size:当前层的输出的个数(即当前层神经元的个数)

        activation_function:激活函数(输入层无激活函数,仅起到传递信号的作用,卷积层、池化层等含有激活函数。)

    内部运算如下:

        权值初始化(Weight):大小为 in_size * out_size;

         偏置初始化(biases):大小为out_size(即本层神经元的个数)

        卷积和运算:W_mul_x_plus_b=tf.matmul(input,Weight) + biases

        输出为(output):activation_function(W_mul_x_plus_b),若无激活函数则为 output=W_mul_x_plus_b。

2.运用神经网络层搭建完整神经网络

一个完整的神经网络,需要有输入层(输入数据)、隐藏层(功能层)、输出层(输出结果)、损失函数、参数求取(梯度下降法)等。

#准备训练所需的数据


    
    
  1. x_data=np.linspace( -1, 1, 300)[:,np.newaxis] # 创建输入数据 np.newaxis分别是在列(第二维)上增加维度,原先是( 300,)变为( 3001
  2. noise=np.random.normal( 0, 0.05,x_data.shape) #噪声
  3. y_data=np.square(x_data)+ 1+noise # 创建输入数据对应的输出

#定义数据格式(占位符,便于下边训练)


    
    
  1. xs=tf.placeholder(tf.float32,[None, 1])
  2. ys=tf.placeholder(tf.float32,[None, 1])

#定义一个隐藏层,含有10个神经元

hidden_layer1=add_layer(xs,1,10,activation_function=tf.nn.relu)
    
    

#定义一个输出层,含有1个神经元

prediction=add_layer(hidden_layer1,10,1,activation_function=None)
    
    

#定义训练过程并进行训练


    
    
  1. #求解神经网络参数
  2. # 1.定义损失函数
  3. loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction) ,reduction_indices=[ 1] ))
  4. # 2.定义训练过程
  5. train_step=tf.train.GradientDescentOptimizer( 0.1).minimize(loss) #梯度下降法使误差最小,学习率为 0.1
  6. init=tf.global_variables_initializer() #变量初始化
  7. sess=tf.Session()
  8. sess.run(init) #执行初始化
  9. # 3.进行训练
  10. for i in range( 1000):
  11. sess.run(train_step,feed_dict={xs:x_data,ys:y_data}) #训练
  12. if i% 100== 0:
  13. print(sess.run(loss,feed_dict={xs:x_data,ys:y_data} ) ) #输出当前loss
  14. #关闭sess
  15. sess.close()

---------------------------------------------  完整程序如下:---------------------------------------------------


    
    
  1. #encoding:utf-8
  2. #add_layer_1.py 练习增加网络层
  3. #创建神经网络并训练
  4. #功能:拟合 y=x*x+ 1
  5. import tensorflow as tf
  6. import numpy as np
  7. #创建一个神经网络层
  8. def add_layer(input,in_size,out_size,activation_function=None):
  9. "" "
  10. :param input: 数据输入
  11. :param in_size: 输入大小
  12. :param out_size: 输出大小
  13. :param activation_function: 激活函数(默认没有)
  14. :return:output:数据输出
  15. " ""
  16. Weight=tf.Variable(tf.random_normal([in_size,out_size]) )
  17. biases=tf.Variable(tf.zeros([ 1,out_size]) + 0.1 )
  18. W_mul_x_plus_b=tf.matmul(input,Weight) + biases
  19. #根据是否有激活函数
  20. if activation_function == None:
  21. output=W_mul_x_plus_b
  22. else:
  23. output=activation_function(W_mul_x_plus_b)
  24. return output
  25. #创建一个具有输入层,隐藏层,输出层的三层神经网络,神经元个数分别为 1101
  26. x_data=np.linspace( -1, 1, 300)[:,np.newaxis] # 创建输入数据 np.newaxis分别是在列(第二维)上增加维度,原先是( 300,)变为( 3001
  27. noise=np.random.normal( 0, 0.05,x_data.shape)
  28. y_data=np.square(x_data)+ 1+noise # 创建输入数据对应的输出
  29. # print(x_data.shape)
  30. # x=np.linspace( -1, 1, 300)
  31. # print(x.shape)
  32. #定义输入数据
  33. xs=tf.placeholder(tf.float32,[None, 1])
  34. ys=tf.placeholder(tf.float32,[None, 1])
  35. #定义一个隐藏层
  36. hidden_layer1=add_layer(xs, 1, 10,activation_function=tf.nn.relu)
  37. #定义一个输出层
  38. prediction=add_layer(hidden_layer1, 10, 1,activation_function=None)
  39. #求解神经网络参数
  40. # 1.定义损失函数
  41. loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction) ,reduction_indices=[ 1] ))
  42. # 2.定义训练过程
  43. train_step=tf.train.GradientDescentOptimizer( 0.1).minimize(loss)
  44. init=tf.global_variables_initializer()
  45. sess=tf.Session()
  46. sess.run(init)
  47. # 3.进行训练
  48. for i in range( 1000):
  49. sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
  50. if i% 100== 0:
  51. print(sess.run(loss,feed_dict={xs:x_data,ys:y_data} ) )
  52. #关闭sess
  53. sess.close()
运行结果:

                       

    发现随着训练次数的增加,loss越来越小。

3.显示训练过程

    matplotlib在Python中应用最多的2D图像的绘图工具包,使用matplotlib能够非常简单的可视化数据。

    在matplotlib中使用最多的模块就是pyplot,下边用pyplot简单的展示以下训练过程。

    1.首先,需要导入pyplot包

import matplotlib.pyplot as plt
    
    

    2.然后,绘制图像


    
    
  1. # 绘制求解的曲线
  2. fig = plt.figure()
  3. ax = fig.add_subplot( 1, 1, 1)
  4. ax.scatter(x_data, y_data)
  5. plt.ion() #Turn interactive mode on 开启互动模式
  6. plt.show() #Display a figure
  7. # 3.进行训练
  8. for i in range( 1000):
  9. sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
  10. if i% 100== 0:
  11. try:
  12. ax.lines.remove(lines[ 0])
  13. except Exception:
  14. pass
  15. print(sess.run(loss,feed_dict={xs:x_data,ys:y_data} ) )
  16. # 计算预测值
  17. prediction_value = sess.run(prediction, feed_dict={xs: x_data})
  18. #print(prediction.shape)
  19. # 绘制预测值
  20. lines = ax.plot(x_data, prediction_value, 'r-', lw= 5)
  21. plt.pause( 0.1)
  22. # 关闭Session
  23. plt.pause( 1000)

过程展示:


    通过此方法可视化训练过程,可看到曲线渐渐拟合。

最终结果:

                


完整程序如下:


    
    
  1. #encoding:utf-8
  2. #add_layer_1.py 练习增加网络层
  3. #创建神经网络并训练
  4. #功能:拟合 y=x*x+ 1
  5. import tensorflow as tf
  6. import numpy as np
  7. import matplotlib.pyplot as plt
  8. #创建一个神经网络层
  9. def add_layer(input,in_size,out_size,activation_function=None):
  10. "" "
  11. :param input: 数据输入
  12. :param in_size: 输入大小
  13. :param out_size: 输出大小
  14. :param activation_function: 激活函数(默认没有)
  15. :return:output:数据输出
  16. " ""
  17. Weight=tf.Variable(tf.random_normal([in_size,out_size]) )
  18. biases=tf.Variable(tf.zeros([ 1,out_size]) + 0.1 )
  19. W_mul_x_plus_b=tf.matmul(input,Weight) + biases
  20. #根据是否有激活函数
  21. if activation_function == None:
  22. output=W_mul_x_plus_b
  23. else:
  24. output=activation_function(W_mul_x_plus_b)
  25. return output
  26. #创建一个具有输入层,隐藏层,输出层的三层神经网络,神经元个数分别为 1101
  27. x_data=np.linspace( -1, 1, 300)[:,np.newaxis] # 创建输入数据 np.newaxis分别是在列(第二维)上增加维度,原先是( 300,)变为( 3001
  28. noise=np.random.normal( 0, 0.05,x_data.shape)
  29. y_data=np.square(x_data)+ 1+noise # 创建输入数据对应的输出
  30. # print(x_data.shape)
  31. # x=np.linspace( -1, 1, 300)
  32. # print(x.shape)
  33. #定义输入数据
  34. xs=tf.placeholder(tf.float32,[None, 1])
  35. ys=tf.placeholder(tf.float32,[None, 1])
  36. #定义一个隐藏层
  37. hidden_layer1=add_layer(xs, 1, 10,activation_function=tf.nn.relu)
  38. #定义一个输出层
  39. prediction=add_layer(hidden_layer1, 10, 1,activation_function=None)
  40. #求解神经网络参数
  41. # 1.定义损失函数
  42. loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction) ,reduction_indices=[ 1] ))
  43. # 2.定义训练过程
  44. train_step=tf.train.GradientDescentOptimizer( 0.1).minimize(loss)
  45. init=tf.global_variables_initializer()
  46. sess=tf.Session()
  47. sess.run(init)
  48. # 绘制求解的曲线
  49. fig = plt.figure()
  50. ax = fig.add_subplot( 1, 1, 1)
  51. ax.scatter(x_data, y_data)
  52. plt.ion() #Turn interactive mode on 开启互动模式
  53. plt.show() #Display a figure
  54. # 3.进行训练
  55. for i in range( 1000):
  56. sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
  57. if i% 100== 0:
  58. try:
  59. ax.lines.remove(lines[ 0]) #擦除之前的轨迹
  60. except Exception:
  61. pass
  62. print(sess.run(loss,feed_dict={xs:x_data,ys:y_data} ) )
  63. # 计算预测值
  64. prediction_value = sess.run(prediction, feed_dict={xs: x_data})
  65. #print(prediction.shape)
  66. # 绘制预测值
  67. lines = ax.plot(x_data, prediction_value, 'r-', lw= 5)
  68. plt.pause( 0.1)
  69. # 关闭Session
  70. plt.pause( 1000)
  71. #关闭sess
  72. sess.close()

4.tensorboard展示神经网络图

神经网络结构的可视化:【tensorflow】Tensorboard的安装及使用,内附详细过程。              

      

    训练过程的可视化:




可视化的完整程序如下:


    
    
  1. #encoding:utf-8
  2. #add_layer1_view.py 练习网络层可视化
  3. #创建神经网络并训练 #功能:拟合 y=x*x+noise+ 1
  4. #功能:将add_layer1的图标可视化
  5. import tensorflow as tf
  6. import numpy as np
  7. #创建一个神经网络层
  8. def add_layer(input,in_size,out_size,activation_function=None):
  9. layer_name= 'layer_name'
  10. "" "
  11. :param input: 数据输入
  12. :param in_size: 输入大小
  13. :param out_size: 输出大小
  14. :param activation_function: 激活函数(默认没有)
  15. :return:
  16. " ""
  17. with tf.name_scope( 'layer') :
  18. with tf.name_scope( 'Weight'):
  19. Weight=tf.Variable(tf.random_normal([in_size,out_size]) )
  20. # Draw histogram: name, variable
  21. tf.summary.histogram(layer_name + '/weights', Weight)
  22. with tf.name_scope( 'biases'):
  23. biases=tf.Variable(tf.zeros([ 1,out_size]) + 0.1 )
  24. tf.summary.histogram(layer_name + '/biases', biases)
  25. with tf.name_scope( 'W_mul_x_plus_b'):
  26. W_mul_x_plus_b=tf.matmul(input,Weight) + biases
  27. #根据是否有激活函数
  28. if activation_function == None:
  29. output=W_mul_x_plus_b
  30. else:
  31. output=activation_function(W_mul_x_plus_b)
  32. # at histogram
  33. tf.summary.histogram(layer_name + '/output', output)
  34. return output
  35. #创建一个具有输入层,隐藏层,输出层的三层神经网络,神经元个数分别为 1101
  36. x_data=np.linspace( -1, 1, 300)[:,np.newaxis] # 创建输入数据 np.newaxis分别是在列(第二维)上增加维度,原先是( 300,)变为( 3001
  37. noise=np.random.normal( 0, 0.05,x_data.shape)
  38. y_data=np.square(x_data)+ 1+noise # 创建输入数据对应的输出
  39. #定义输入数据
  40. with tf.name_scope( 'input'):
  41. xs=tf.placeholder(tf.float32,[None, 1],name= 'x_input')
  42. ys=tf.placeholder(tf.float32,[None, 1],name= 'y_input')
  43. #定义一个隐藏层
  44. with tf.name_scope( 'hidden_layer'):
  45. hidden_layer1=add_layer(xs, 1, 10,activation_function=tf.nn.relu)
  46. #定义一个输出层
  47. with tf.name_scope( 'output_layer'):
  48. prediction=add_layer(hidden_layer1, 10, 1,activation_function=None)
  49. #求解神经网络参数
  50. # 1.定义损失函数
  51. with tf.name_scope( 'loss'):
  52. loss=tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction) ,reduction_indices=[ 1] ))
  53. # 2.使用tf.scalar_summary来收集想要显示的变量,命名为loss
  54. tf.summary.scalar( 'loss', loss)
  55. # 2.定义训练过程
  56. with tf.name_scope( 'train'):
  57. train_step=tf.train.GradientDescentOptimizer( 0.1).minimize(loss)
  58. init=tf.global_variables_initializer()
  59. sess=tf.Session()
  60. # 3.定义一个summury op, 用来汇总由scalar_summary记录的所有变量
  61. merged_summary_op = tf.summary.merge_all()
  62. # 4.生成一个summary writer对象,需要指定写入路径,例如我这边就是/tmp/logdir
  63. summary_writer = tf.summary.FileWriter( 'logs_add_layer1/',sess.graph)
  64. #将网络结构图写到文件中
  65. #writer=tf.summary.FileWriter( 'logs_add_layer1/',sess.graph)
  66. sess.run(init)
  67. # 3.进行训练
  68. for i in range( 1000):
  69. sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
  70. if i% 100== 0:
  71. #print(sess.run(loss,feed_dict={xs:x_data,ys:y_data} ) )
  72. # 5.使用sess.run来得到merged_summary_op的返回值
  73. summary_str = sess.run(merged_summary_op,feed_dict={xs:x_data,ys:y_data})
  74. # 6.使用summary writer将运行中的loss值写入
  75. summary_writer.add_summary(summary_str, i)
  76. #关闭sess
  77. sess.close()

   -------------------------------------------         END      -------------------------------------

参考:https://www.jianshu.com/p/e112012a4b2d(一文学会用 Tensorflow 搭建神经网络)

          https://blog.csdn.net/mao19931004/article/details/51915016(Matplotlib简单入门学习)

                http://www.cnblogs.com/TaylorBoy/p/6802540.html(Tensorboard 可视化之训练过程)



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TensorFlow可以用来搭建BP神经网络。BP神经网络是一种常见的人工神经网络,用于分类和回归问题。以下是使用TensorFlow搭建BP神经网络的步骤: 1.导入必要的库和数据集。 2.定义神经网络的输入和输出。 3.定义神经网络的结构,包括输入层、隐藏层和输出层。 4.定义损失函数和优化器。 5.训练神经网络,使用训练数据集进行训练。 6.评估神经网络的性能,使用测试数据集进行评估。 7.使用神经网络进行预测,输入新的数据,输出预测结果。 以上是使用TensorFlow搭建BP神经网络的基本步骤,具体实现可以参考TensorFlow官方文档或相关教程。 ### 回答2: Tensorflow是现在深度学习领域最常用的框架之一,它可以快速构建各种模型。在Tensorflow中,我们可以用很简单的方式构建BP神经网络。 首先,我们要导入必要的库,比如tensorflow、numpy等,然后定义超参数。定义超参数的时候,需要考虑损失函数、优化器、学习率、神经网络的层数和节点数等因素。 接下来,我们要用tf.placeholder定义输入数据的节点和输出数据的节点。这是因为神经网络训练时需要从外部输入训练数据和对应的标签,如果使用tf.constant这个函数,就无法修改输入数据,会造成训练失败。 接着,我们需要定义参数W和b。W代表权重,b代表偏置项,它们需要在训练过程中被不断迭代更新。 接下来,我们需要定义神经网络的结构。可以使用tensorflow提供的各种函数来定义不同的神经网络层,比如全连接层、卷积层、池化层等。同时,我们还需要使用tf.nn.relu等函数来激活神经网络的输出,这样可以提高神经网络训练效果。 接着,我们需要定义损失函数。损失函数是神经网络训练过程中最重要的一部分,可以直接影响到神经网络训练效果。通常使用交叉熵损失函数来衡量神经网络的 loss 值,反映了神经网络的输出和标签的偏离程度。我们可以使用tensorflow提供的tf.reduce_mean函数来求出平均值。 然后,我们选择一个优化器。在神经网络学习的过程中,我们需要寻找全局最优解,也就是让损失函数最小的一组参数。Tensorflow提供了各种优化器,比如AdamOptimizer、AdagradOptimizer等,可以根据需要进行选择。 最后,我们需要在Tensorflow中实现反向传播算法来更新参数。通过计算损失函数对所有参数的偏导数,即可得到损失函数对权重和偏置的梯度值,再根据优化器算法,就可以不断迭代更新参数。 以上就是搭建BP神经网络的大致流程,其中需要注意的细节点还很多。搭建神经网络的过程需要耐心和细心,需要灵活运用各种Tensorflow函数,更需要在实验过程中不断调整模型,才能取得最优的效果。 ### 回答3: Tensorflow是目前最为流行的深度学习框架之一,可以用来搭建训练各种神经网络。其中,bp神经网络是一种反向传播神经网络,可以用来进行分类、回归等任务。下面介绍如何使用Tensorflow搭建bp神经网络。 1. 准备数据 首先需要准备训练数据和测试数据。对于分类任务,通常需要将数据标注好,每个样本都有一个对应的类别。可以使用Tensorflow提供的tf.data.Dataset接口读取数据,也可以使用其他库进行数据加载和预处理。 2. 定义模型 bp神经网络的主要组成部分包括输入层、隐藏层和输出层。可以使用Tensorflow的keras.layers模块定义模型。例如,可以使用Dense层定义输入层和输出层,使用Flatten层将数据展开,并使用Dropout层加入一些随机性,避免过拟合。 3. 编译模型 在训练模型前需要编译模型。可以使用Tensorflow提供的model.compile()函数设置损失函数、优化器和评价指标。对于分类任务,建议使用交叉熵作为损失函数。 4. 训练模型 训练模型需要使用训练数据集进行模型的优化。可以使用Tensorflow提供的model.fit()函数进行训练。在训练过程中,可以定义批量大小、训练轮数和验证集等参数,以及使用Tensorboard对模型进行可视化。 5. 评估模型 训练完成后,需要使用测试集数据对模型进行评估,并计算模型的精度或其他评价指标。可以使用Tensorflow提供的model.evaluate()函数进行评估。 6. 使用模型进行预测 训练完成的模型可以用来进行预测。可以使用model.predict()函数对新的数据进行预测,并得到分类结果。 以上是使用Tensorflow搭建bp神经网络的基本流程。除了bp神经网络Tensorflow还支持其他种类的神经网络,例如卷积神经网络、循环神经网络等。在使用Tensorflow进行深度学习时,需要了解每种神经网络的原理和实现方式,才能更好地构建和训练模型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值