《人工智能实践:Tensorflow笔记》-02搭建神经网络

基于TensorFlow的NN:用张量表示数据,用计算图搭建神经网络,用会话执行计算图,优化线上的权重(参数),得到模型。

张量(tensor):多维数组(列表),
阶:张量的维数

举例

import tensorflow as tf

a = tf.constant([1.0, 2.0])
b = tf.constant([3.0, 4.0])

result = a+b
print(result)

# 显示结果
# Tensor("add:0", shape=(2,), dtype=float32)

add:节点名
0:第0个输出
shape:维度
2:一维数组长度2
dtype:数据类型

以上这一段代码描述的是计算过程,一个计算过程就是一张计算图。从print的输出的内容可以看出只显示出这个结果是个张量,并没有实际运算张量具体的值。因此,计算图只描述计算过程,不计算。

计算图:搭建神经网络的计算过程,只搭建,不计算。
会话:执行计算图中的节点运算。
参数:线上的权重W,用变量表示,随机给初值

w=tf.Variable(tf.random_normal([2,3], stddev=2, mean=0, seed=1))

正太分布,产生2*3的矩阵,标准差为2,随机种子如果去掉,每次生成的随机数将不一致;标准差、均值、随机种子,如果没有特殊要求,可以不写。

tf.random_normal() 正太分布
tf.truncated_normal()去掉过大偏离的正态分布
tf.random_uniform()平均分布
stddev 标准差
mean 均值
seed 随机种子


神经网络实现过程

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

  • 变量初始化、计算图节点运算都要用会话实现
with tf.Session() as sess:
	sess.run
  • 变量初始化:在sess.run函数中用tf.global_variables_initializer()
init_op = tf.global_variables_initializer()
sess.run(init_op)
  • 计算图节点运算:在sess.run函数中写入待运算的节点
sess.run(y)
  • 用tf.placeholder占位,在sess.run函数中用feed_dict喂数据
x = tf.placeholder(tf.float32, shape=[1,2])

shape=[1,2]:喂入一组数据,有两个特征
shape=[None,2]:喂入多组数据可以写none

import tensorflow as tf

# 定义输入和参数
x = tf.placeholder(tf.float32, [1,2])
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)

# 用会话计算结果
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print("y is \n",sess.run(y,feed_dict={x:[[0.7,0.5]]}))

"""
y is 
 [[3.0904667]]
"""

反向传播的目的是优化模型参数
训练模型参数,在所有参数上用梯度下降,使NN模型在训练数据上的损失函数最小。

损失函数(loss):预测值(y)与已知答案(y_)的差距
均方误差MSE:loss=tf.reduce_mean(tf.square(y-y_))
反向传播训练方法:以减小loss值为优化目标

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
train_step = tf.train.MomentumOptimizer(learning_rate, momentum).minimize(loss)
train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss)

搭建神经网络示例

import tensorflow as tf
import numpy as np

BATCH_SIZE = 8
seed = 23455

# 基于seed产生随机数
rng = np.random.RandomState(seed)
# 随机数返回32行2列的矩阵,表示 32组数据,每组两个特征 ,作为输入数据集
X = rng.rand(32,2)
# 从X这个32行2列的矩阵中取出一行, 判断如果和小于1给Y赋值1.如果和不小于1,给Y赋值0
# 作为输入数据集的标签(正确答案)
Y = [[int(x0+x1 < 1)] for (x0,x1) in X]
print("X: ",X)
print("Y: ",Y)

# 定义神经网络的输入、参数和输出,定义前向传播过程
x = tf.placeholder(tf.float32,[None,2])
y_ = tf.placeholder(tf.float32,[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(learning_rate=0.001).minimize(loss)

# 生成会话,训练STEPS轮
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    # 输入目前(未经训练)的参数取值
    print("w1: ", sess.run(w1))
    print("w2: ", 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 is : ", sess.run(w1))
    print("w2 is : ", sess.run(w2))

"""
w1:  [[-0.8113182   1.4845989   0.06532937]
 [-2.4427042   0.09924842  0.5912243 ]]
w2:  [[-0.8113182 ]
 [ 1.4845989 ]
 [ 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 is :  [[-0.7000663   0.91363186  0.08953571]
 [-2.3402493  -0.14641261  0.58823055]]
w2 is :  [[-0.06024265]
 [ 0.9195618 ]
 [-0.06820709]]
"""

搭建神经网络的八股:准备、前传、反传、迭代

你可能感兴趣的:(Tensorflow)