tensorflow学习笔记【搭建神经网络】

Tensorflow学习笔记之搭建神经网络

一、 神经网络参数

神经网络的参数是指神经元线上的权重W, 用变量表示, 一般会随机生成这些参数。生成这些参数的方法是tf.Variable, 把生成的方式写在括号中。
常用的神经网络函数有:

tf.random_normal()  生成正态分布随机数
tf.truncated_normal()  生成去掉过大偏移点的正态分布随机数
tf.random_uniform()  生成均匀分布随机数
tf.zeros   表示生成全0 的数组 
tf.ones     表示生成全1 的数组
tf.fill      表示生成全定值的数组
tf.constant   表示生成直接给定值的数组

二、 神经网络的搭建

当我们知道张量,计算图,会话和参数后,我们可以讨论神经网络的实现过程了。

神经网络的实现过程:

1、 准备数据集,提取特征,作为输入喂给神经网络
2、 搭建NN结构, 从输入到输出(先搭建计算图,再用会话执行)
3、大量特征数据喂给NN, 迭代优化NN参数
4、使用训练好的模型预测和分类

由此可见,基于神经网络的机器学习主要分为两个过程,即训练过程和使用过程。 训练过程是第一步、第二步、第三步的循环迭代,使用过程是第四步,一旦参数优化完成就可以固定这些参数,实现特定的应用了。

很多实际的应用中,我们会实现使用现有的网络结构,喂入新的数据,训练相应的模型,判断能否对未入的新数据做出正确响应,在适当更改网络结构,反复迭代,在机器能够自动训练参数找出最优的结构和参数,以固定专用模型。

三、 前向传播

前向传播就是搭建模型的计算过程,让模型具有推理能力,可以针对一对输入数据给出相应的输出结果。

前向传播过程的tensorflow描述:

变量初始化,计算图节点运算都用session会话来实现

with tf.Session() as sess:
      sess.run()

变量初始化: 在sess.run() 函数中用tf.global_variables_initializer() 汇总所有待优化的变量

init_op = tf.global_variable_initializer()
sess.run(init_op)

用tf.placeholder 占位, 在sess.run 函数中用feed_dict 喂数据

x = tf.placeholder(tf.float32, shape = (1,2))
sess.run(y,feed_dict={x:[0.5, 0.6]})

举例:
这是一个实现神经网络前向传播的过程,网络可以自动推理出输出y的值

1、用placeholder 实现输入定义(sess.run() 中喂入一组数据)的情况

import tensorflow as tf

#定义输入和参数
x = tf.placeholder(tf.float32,shape = (1,2))
w1 = tf,Variable(tf.random_normal([2,3], stddev = 1, seed = 1))
w2 = tf.Variable(tf.random_normal([3,1], stdden = 1, seed = 1))
#定义前向传播过程
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
#用会话计算结果
with tf.Session() as sess:
     init_op = tf.global_variable_initilizer()
     sess.run(init_op)
     print ("y:\n", sess.run(y,feed_dict = {x:[0.7,0.5],[0.2,0.3],[0.3,0.4],[0.4,0.5]}))

三、 反向传播

1、反向传播: 训练模型参数,在所有参数上使用梯度下降,使得NN模型在训练数据上的损失函数最小。

2、损失函数: 计算得到的预测值y与真实值之间的差距
损失函数有多种计算方法,MSE是最常用的方法。
3、均方误差: 求前向传播计算结果与真实结果之差的再求平均
在这里插入图片描述
用tensorflow函数表示为:

loss_mse = tf.reduce_mean(tf.square(y_ -  y))

反向传播训练方法: 以减少loss为优化目标,有梯度下降、momentum优化器,adam优化器等方法。

这三种方法用tensorlfow函数实现可以表示为:

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step = tf.train.MomentumOptimizer(learning_rate).minimizer(loss)
train_step = tf.train.AdamOptimzer(learning_rate).minimizer(loss)

4、 学习率

优化器中需要一个叫做学习率的参数,使用时,如果学习概率选择过大则会出现震荡不收敛的情况,如果选择太小,会出现收敛缓慢的情况,所以在填写的过程中我们一般会选择使用, 0.01, 0.001

5、 进阶 (反向传播过程中的参数推导过程)

在这里插入图片描述
在这里插入图片描述

四、 搭建神经网络的八股

神经网络的搭建主要分四步完成: 准备工作,前向传播,反向传播和循环迭代

1、 导入模块: 生成模拟数据集
2、前向传播: 定义输入、参数和输出
3、 反向传播: 定义损失函数、反向传播方法
4、 生成会话: 悬链step轮

with tf.Session() as tf:
    init_op = tf.global_variable_initilizer()
    sess.run(init_op)
    STEP = 300
    for i in range(STEP):
    	start = 
    	end = 
    	sess.run(train_step, feed_dict:)
    

五、 实例代码

import tensorflow as tf
import numpy as np
batch_size = 8
seed = 23455

rng = np.random.RandomState(seed)
X = rng.rand(32,2)
Y = [[int(x0+x1<1)] for [x0,x1] in X]
print ("X:\n",X)
print ("Y: \n",Y)

#定义神经网络的输入,参数和输出,定义前向传播过程
x = tf.placeholder(tf.float32, shape=(None,2))
y_ = tf.placeholder(tf.float32,shape=(None,1))

w1 = tf.Variable(tf.random_normal([2,3],stddev = 1, seed = 1))
w2 = tf.Variable(tf.random_normal([3,1],stddev = 1, seed = 1))

a = tf.matmul(x,w1)
y = tf.matmul(a,w2)

#定义反向传播函数以及损失函数
loss = tf.reduce_mean(tf.square(y - y_))
train_step = tf.train.GradientDescentOptimizer(0.001).minimize(loss)

#生成会话,训练steps 轮数
with tf.Session() as sess:
     init_op = tf.global_variables_initializer()
     sess.run(init_op)
     #输出当前未经训练的数据
     print ("W1:\n", sess.run(w1))
     print ("W2: \n", sess.run(w2))

     #训练模型
     STEPS = 3000
     for i in range(STEPS):
         start = (i*batch_size) %32
         end = start + batch_size
         sess.run(train_step, feed_dict = {x:X[start:end],y_:Y[start:end]})
         if i%500 == 0:
             total_loss = sess.run(loss,feed_dict={x:X, y_:Y})
             print("After %d training_step(s),loss  on all data is %g"%(i,total_loss))

     #输出训练后的参数取值
     print("\n")
     print("w1: \n",sess.run(w1))
     print("w2: \n",sess.run(w2))

训练结果:

W1:
[[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]
W2:
[[-0.8113182 ]
[ 1.4845988 ]
[ 0.06532937]]
After 0 training_step(s),loss on all data is 5.13118
After 500 training_step(s),loss on all data is 0.429111
After 1000 training_step(s),loss on all data is 0.409789
After 1500 training_step(s),loss on all data is 0.399923
After 2000 training_step(s),loss on all data is 0.394146
After 2500 training_step(s),loss on all data is 0.390597

w1:
[[-0.7000663 0.9136318 0.08953571]
[-2.3402493 -0.14641267 0.58823055]]
w2:
[[-0.06024267]
[ 0.91956186]
[-0.0682071 ]]

Process finished with exit code 0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
神经网络训练完成后,我们可以使用模型对新的输入数据进行预测。以下是使用 TensorFlow 进行简单神经网络训练和测试的示例代码: ```python import tensorflow as tf # 定义输入数据 x = tf.placeholder(tf.float32, [None, input_size]) # 定义模型参数 W = tf.Variable(tf.zeros([input_size, num_classes])) b = tf.Variable(tf.zeros([num_classes])) # 定义模型 y = tf.nn.softmax(tf.matmul(x, W) + b) # 定义损失函数 y_ = tf.placeholder(tf.float32, [None, num_classes]) cross_entropy = tf.reduce_mean(-tf.reduce_sum(y_ * tf.log(y), reduction_indices=[1])) # 定义优化器 train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy) # 训练模型 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for i in range(num_iterations): batch_xs, batch_ys = get_next_batch(train_data, train_labels, batch_size) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # 测试模型 correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print("Accuracy: ", sess.run(accuracy, feed_dict={x: test_data, y_: test_labels})) ``` 在训练完成后,我们可以使用 `sess.run()` 函数来获取模型的输出。例如,如果我们想要对一个新的数据样本进行预测,我们可以将其传递给 `sess.run()` 函数的 `feed_dict` 参数,并获取模型的输出 `y`。下面是一个简单的示例: ```python # 定义要预测的数据 new_data = [[5.1, 3.5, 1.4, 0.2]] # 获取预测结果 prediction = sess.run(y, feed_dict={x: new_data}) # 打印预测结果 print(prediction) ``` 在上面的代码中,我们将 `new_data` 作为输入数据传递给模型,并使用 `sess.run()` 函数获取模型的输出 `y`。然后,我们打印预测结果即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子私房菜

给小强一点爱心呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值