【手把手TensorFlow】一、从开始使用TensorFlow到弄清楚“搭建神经网络套路”

一、基本概念

基于TensorFlow的NN(神经网络):
1.张量:即多维数组,表示数据
2.计算图:搭建神经网络,不运算
3.会话:执行计算图

注:用阶表示张量的维度,t=[[]]表示2阶,t=[[[]]]表示3阶。数张量右边括号数。
0阶张量表示数
1阶张量表示数组
2阶张量表示矩阵

测试样例一

import tensorflow as tf

'''测试1'''
a=tf.constant([1.0,2.0])#1阶张量,表示长度为2的一个数组。
b=tf.constant([3.0,4.0])
result=a+b
print(result))#也应该为1阶张量,表示长度为2的一个数组。

Tensor(“add:0”, shape=(2,), dtype=float32)
表示名为"add:0"的张量,shape=(2,)表示长度为2的一维数组,dtype=float32表示数据类型

测试样例二

'''测试2'''
x=tf.constant([[1.0,2.0]])#2阶张量,表示1X2矩阵
w=tf.constant([[3.0],[4.0]])#2阶张量,表示2X1矩阵
y=tf.matmul(x,w)#矩阵相乘
print(y)
##显示运算结果需要运行,即需要会话Session()
with tf.Session() as sess:
    print(sess.run(y))

得到[[11.]],即1.03.0+2.04.0=11.0

二、神经网络的搭建

1.神经网络的参数

一般会先随机生成参数,生成参数格式:tf.Variable(生成参数的方法)
生成参数的方法:
tf.random_normal() 生成正态分布的随机数
tf.zeros() 生成全0数组
···

如:w=tf.Variable(tf.random_normal([2,3],stddev=2,mean=0,seed=1))
①随机种子如果去掉每次生成的随机数将不一致。
②如果没有特殊要求标准差、均值、随机种子是可以不写的。
tf.zeros([3,2],int32)表示生成[[0,0],[0,0],[0,0]]

2.搭建过程

2.1准备数据集,提取特征,喂给NN
2.2搭建NN结构,从输入到输出。先计算图,后会话执行。——前向传播
2.3大量特征喂给NN,迭代优化NN参数——反向传播
2.4预测+分类

'''前向传播'''
x=tf.placeholder(tf.float32,shape=(None,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],[0.2,0.3],[0.3,0.4],[0.4,0.5]]}))

第一组喂体积0.7、重量0.5,第二组喂体积0.2、重量0.3,第三组喂体积0.3、重量0.4,第四组喂体积0.4、重量0.5.

三、含反向传播的完整实例

0.导入模块

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:\n",X)
print("Y:\n",Y)

1.定义神经网络的输入、参数和输出,定义前向传播过程

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)

2.定义损失函数及反向传播方法

loss =tf.reduce_mean(tf.square(y-y_))
train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss)
#train_step = tf.train.MomentumOptimizer(0.001,0.9).minimize(loss_mse)
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss_mse)

3生成会话,训练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_mse on all data is %g" % (i, total_loss))
    
    # 输出训练后的参数取值。
    print( "w1:\n", sess.run(w1))
    print( "w2:\n", sess.run(w2))

输出结果:
在这里插入图片描述

总结

关键是先搭建前向传播神经网络,形成网络逻辑通路。在用反向传播更新优化参数,提升模型效果。

有关TensorFlow要熟悉变量,计算图,会话区别和联系:用变量存储特征,计算图搭建框架,最终用会话执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值