TensorFlow框架

基本概念

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

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

:张量的维数

  维数      阶           名字             例子

  0-D       0        标量 scalar        s=123

  1-D       1        向量 vector        v=[1,2,3]

  2-D       2        矩阵 matrix        m=[[1,2,3],[4,5,6],[7,8,9]]

  n-D       3        张量 tensor        t=[[[.........n个

张量可以表示0阶到n阶数组(列表)

数据类型:tf.float32 tf.int32 ....


张量加法


import tensorflow as tf

a = tf.constant([1.0 , 2.0])    #constant()代表定义常数
b = tf.constant([3.0 , 4.0])

result = a + b
print(result)

结果显示:

            Tensor("add:0", shape=(2,), dtype=float32)
                    |   |     |    |          |
               节点名  第0个  维    一维    数据类型
                      输出   度    数组
                                  长度2

计算图只描述了运算过程,不计算运算结果


计算图(Graph):搭建神经网络的计算过程,只搭建,不运算。

image

会话(Senssion):执行计算图中的节点运算。

with tf.Session() as sess:
    print(sess.run(y))
image

TensorFlow不会自动生成默认的会话,需要手动指定
当默认的会话被指定之后可以通过tf.Tensor.eval函数来计算一个张量的取值

node1 = tf.constant(3.0, tf.float32, name="node1")
node2 = tf.constant(4.0, tf.float32, name="node2")
result = tf.add(node1, node2)

sess = tf.Session()
with sess.as_default():
    print(result.eval())

下面代码也可以完成相同功能

node1 = tf.constant(3.0, tf.float32, name="node1")
node2 = tf.constant(4.0, tf.float32, name="node2")
result = tf.add(node1, node2)

sess = tf.Session()
#下面两个命令有相同的功能
print(sess.run(result))
print(result.eval(session=sess))

参数:即神经元线上的权重W,用变量表示,随机给初值。

image
w = tf.Variable(tf.random_normal([2,3] , stddev=2 , mean=0 , seed=1))    #tf.Variable() 生成随机数
                        |          |         |         |        |
                     正态分布  产生2*3矩阵  标准差为2  均值为0  随机种子
tf.truncated_normal()  #去掉过大偏离点的正态分布
tf.random_uniform()  #平均分布

tf.zeros #全0数组          
tf.zeros([3,2] , int32) #生成[[0,0],[0,0],[0,0]]

tf.ones #全1数组          
tf.ones([3,2] , int32) #生成[[1,1],[1,1],[1,1]]

tf.fill #全定值数组         
tf.fill([3,2] , 6) #生成[[6,6],[6,6],[6,6]]

tf.constant #直接给值    
tf.constant([3,2,1]) #生成[3,2,1]

神经网络的实现过程:

1、准备数据集,提取特征,作为输入喂给神经网络

2、搭建NN结构,从输入到输出(先搭建计算图,再用会话执行)

(NN前向传播算法 --> 计算输出)

3、大量特征数据喂给NN,迭代优化NN参数

(NN反向传播算法 --> 优化参数训练模型)

4、使用训练好的模型预测和分类


一、前向传播 --> 搭建模型,实现推理(以全连接网络为例)

eg. 生产一批零件将体积X1和重量X2为特征输入NN,通过NN后输出一个数值。

image
image

变量初始化、计算图节点运算都要用会话(with结构)实现:

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

变量初始化:在sess.run函数中用tf.global_variables_initializer()

init_op = tf.global_variabes_initializer()  #对所有变量初始化(赋初值)
    sess.run(init_op)

计算图节点运算:在sess.run函数中写入待运算的节点

sess.run(y)

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

喂一组数据

x = tf.placeholder(tf.float32 , shape=(1,2))  #2代表 有两个特征 比如零件有质量和体积两个特征
sess.run(y , feed_dict={x : [[0.5,0.6]]})

喂多组数据

x = tf.placeholder(tf.float32 , shape=(None,2))
sess.run(y , feed_dict={x : [[0.1,0.2],[0.2,0.3],[0.3,0.4],[0.4,0.5]]})

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

损失函数(loss):预测值(y)与已知答案(y_)的差距

均方误差MSE

image
loss = tf.reduce_mean(tf.square(y_-y))

反向传播训练方法:以减小loss值为优化目标

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)  #梯度下降

train_step = tf.train.MomentumOptimize(learning_rate).minimize(loss) #Momentum优化器

train_step = tf.train.AdamOptimizer(learning_rate).minimize(loss) #Adam优化器

学习率:决定参数每次更新的幅度


搭建神经网络:准备、前传、后传、迭代

0 准备

import

常量定义

生成数据集

1 前向传播:定义输入、参数、刷出

x=

y_=

w1=

w2=

a=

y=

2 反向传播:定义损失函数、反向传播方法

loss=

train_step=

3 生成会话,训练STEPS轮

with tf.session() as sess:
    init_op = tf.global_variables_initallzer()
    sess_run(init_op)

    STEPS=3000
    for i in range(STEPS):
        start=
        end=
        sess.run(train_step, feed_dict:)

神经网络搭建实例:


#coding:utf-8

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作为输入数据集的标签(正确答案)  人为给出零件的合格与否 1合格  0不合格

Y = [[int(x0 + x1 < 1)] for (x0,x1) in X]

#上面一行代码类似于下面

#for (x0,x1) in X:
#    if x0+x1<1:
#        Y=1
#    else:
#        Y=0

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))  #[2,3]中 2对应x  3表示隐藏层用3个神经元 
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))  #[3,1]中 1对应y  3表示隐藏层用3个神经元

#前向传播过程描述
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)  #梯度下降  学习率0.001
#train_step = tf.train.MomentumOptimize(0.001,0.9).minimize(loss) #Momentum优化器
#train_step = tf.train.AdamOptimizer(0.001).minimize(loss) #Adam优化器

#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))
    print("\n")

    #训练模型
    STEPS = 3000 #训练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))

同时欢迎关注我的CSDN博客https://blog.csdn.net/kdongyi

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容