TensorFlow入门

Tensor:张量 多维数组---数据结构

Flow:流动---计算模型

Tensorflow:通过计算图的形式来表述计算的编程系统

计算图中每一个节点是一个运算,每一条边代表了计算直接的依赖关系

  • 第一阶段:定义计算图中所有的计算
  • 第二阶段:执行运算
# tf.get_default_graph函数获取当前默认的计算图

 

import tensorflow as tf
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
result = a + b
with tf.Session() as sess:
    print(sess.run(result))

# 通过a.graph可以查看张量所属的计算图。因为没有特意指定所以这个计算图
# 应该等于当前默认的计算图,所以下面的这个操作值为True
print(a.graph is tf.get_default_graph())

tf.graph函数来生成新的计算图,且不同计算图上的张量与运算不会共享

 

import tensorflow as tf

g1 = tf.Graph()
with g1.as_default():
    # 在计算图g1中定义变量"v",并设置其初始值为0
    # v = tf.get_variable("v", initializer=tf.zeros_initializer(shape=[1]))
    v = tf.get_variable("v", shape=[1], initializer=tf.zeros_initializer)

g2 = tf.Graph()
with g2.as_default():
    # 在计算图g2中定义变量‘v’,并设置其初始值为1
    # v = tf.get_variable("v", initializer=tf.ones_initializer(shape=[1]))
    v = tf.get_variable("v", shape=[1], initializer=tf.ones_initializer)

# 在计算图g1中读取变量v1的取值
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse=True):
        # 在计算图g1中,变量‘v’的取值为0,
        print(sess.run(tf.get_variable("v")))

# 在计算图g2中读取变量“v”的取值
with tf.Session(graph=g2) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("", reuse=True):
        # 在计算图g2中,变量“v”的取值为1
        print(sess.run(tf.get_variable("v")))

 

计算图可以通过tf.Graph.device函数来指定运算的设备

张量:管理数据的形式

多维数组

零阶张量:标量(scalar)---一个数

第一阶张量:向量(vector)----一个一维数组

张量保存的是如何得到这些数字的计算过程,对结果的一个引用

import tensorflow as tf
# tf.constant是一个计算,这个计算的结果为一个张量,保存在变量a中
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
result = tf.add(a, b, name='add')
print(result)
'''
输出
Tensor("add:0", shape=(2,), dtype=float32)
'''

with tf.Session() as sess:
    print(sess.run(result))
'''
输出
[3. 5.]
'''

计算结果为张量的结构

三个属性:名字(name), 维度(shape), 类型(type)

计算图上的每一个节点代表了一个计算,计算的结果保存在张量之中

张量的命名:node:src_output

  • node:节点的名称
  • src_output:表示当前张量节点的第几个输出
Tensor("add:0", shape=(2,), dtype=float32)

计算节点add输出的第一个结果

张量result为一个一维数组,数组长度为2

不带小数点的数默认为int32,带小数点的数默认为float32

通过dtype明确指定变量或常量的类型

张量的用途:

  1. 对中间计算结果的引用
  2. 得到真实的数字

Tensoflow的运行模式----会话

拥有并管理TensorFlow程序运行时的所有资源

***关闭回话---资源泄露

# 创建一个会话
sess = tf.Session()
# 使用这个会话来得到关心的运算的结果
# 比如调用sess.run(result)
# 来得到张量result的取值
sess.run(...)
# 关闭会话使得本次运行中使用到的资源可以被释放
sess.close()

上下文管理器

# 创建一个会话,并通过Python中的上下文管理器来管理这个会话
with tf.Session() as sess:
    # 使用创建好的会话来计算相关结果
    sess.run(...)
# 不需要再调用“Session.close()"函数来关闭会话
# 当上下文退出时会话关闭和资源释放自动完成

TensorFlow 会自动生成一个默认的计算图

不会自动生成默认的会话-----需手动指定

tf.Tensor.eval函数来计算一个张量的取值

 

设定默认会话计算张量的取值

sess = tf.Session()
with sess.as_default():
    print(result_eval())

# 相同功能
sess = tf.Session()

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

tf.InteractiveSession函数会自动将生成的会话注册为默认会话

sess = tf.InteractiveSession()
print(result.eval())
sess.close()

  • 前向传播算法(forword_propagation)
  • 反向传播算法(back-propagation)

神经网络可以将输入的特征向量经过层层推导得到最后的输出,并通过这些输出解决分类或者回归问题

全连接网络结构的前向传播算法

神经网络的结构:不同神经元之间的连接结构

一个最简单的神经元结构的输出就是所有输出的加权和

不同输入的权重就是神经元的参数

特征向量(feature vector)------神经网络的输入

输出值离阀值越远时越可靠

学习率:learning rate

激活函数:activation

正则化:regularization

  1. 神经网络的输入
  2. 神经网络的连接结构
  3. 每个神经元的参数

偏置bias

激活函数:activation function

bias通常用常数来设置初始值

# 初始值全为0且长度为3的变量
bias = tf.Variable(tf.zeros([3])
# 2*3矩阵,均值为0,标准差为2
weights = tf.Variable(tf.random_normal([2,3], stddev=2))
import tensorflow as tf

# 声明w1,w2两个变量。这里还通过seed参数设置了随机种子
# 这样可以保证每次运行得到的结果是一样的
w1 = tf.Variable(tf.random_normal((2,3), stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal((3,1), stddev=1, seed=1))

# 暂时将输入的特征向量定义为一个常量
x = tf.constant([[0.7, 0.9]])

# 通过前向传播算法获得神经网络的输出
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

sess = tf.Session()
# 不能直接通过sess.run(y)来获得结果
# w1,w2未初始化
sess.run(w1.initializer)    # 初始化w1
sess.run(w2.initializer)    # 初始化w2

# 输出
print(sess.run(y))
sess.close()

注意1*2矩阵[ [0.7, 0.9] ]

# 初始化所有变量
init_op = tf.global_variables_initializer()
sess.run(init_op)

random_normal默认类型为tf.float32

placeholder

x = tf.placeholder(tf.float32, shape=(3,2), name='input')

print(sess.run(y, feed_dict={x: [[0.7,0.9], [0.1,0.4], [0.5,0.7]]}))

在得到一个batch的前向传播结果之后,需要定义一个损失函数来刻画当前的预测值与真实答案之间的差距。然后通过反向传播算法来调整神经网络参数的取值使得差距可以被缩小

 

 

import tensorflow as tf
from numpy.random import RandomState

# 定义训练数据batch的大小
batch_size = 8

# 定义神经网络的参数
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))

# 在shape的一个维度上使用None可以方便使用不同的batch大小
x = tf.placeholder(tf.float32, shape=(None,2), name='x-input')
y_ = tf.placeholder(tf.float32, shape=(None,1), name='y-input')

# 定义神经网络的前向传播的过程
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

# 定义损失函数和反向传播的算法
y = tf.sigmoid(y)
cross_entropy = -tf.reduce_mean(
    y_*tf.log(tf.clip_by_value(y, 1e-10, 1.0))
    +(1-y)*tf.log(tf.clip_by_value(1-y, 1e-10, 1.0)))
train_step = tf.train.AdadeltaOptimizer(0.001).minimize(cross_entropy)

# 通过随机数生成一个模拟数据集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]

# 创建一个会话来运行Tensorflow程序
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    # 初始化变量
    sess.run(init_op)

    print(sess.run(w1))
    print(sess.run(w2))
    '''
    训练之前神经网络参数的值:
    w1=[[-0.8113182   1.4845988   0.06532937]
        [-2.4427042   0.0992484   0.5912243 ]]
    w2=[[-0.8113182 ]
        [ 1.4845988 ]
    '''

    # 设定训练的轮数
    STEPS = 5000
    for i in range(STEPS):
        # 每次选取batch_size个样本进行训练
        start = (i * batch_size) % dataset_size
        end = min(start+batch_size, dataset_size)

        # 通过选取的样本训练神经网络并更新参数
        sess.run(train_step, feed_dict={x:X[start:end], y_:Y[start:end]})
        if i % 1000 == 0:
            # 每隔一段时间计算在所有数据上的交叉熵并输出
            total_cross_entropy = sess.run(cross_entropy, feed_dict={x:X, y_:Y})
            print("After %d training step(s), cross entropy on all data is %g" %(i, total_cross_entropy))
        '''
        输出结果:
        After 0 training step(s), cross entropy on all data is 0.314668
        After 1000 training step(s), cross entropy on all data is 0.314259
        After 2000 training step(s), cross entropy on all data is 0.313718
        After 3000 training step(s), cross entropy on all data is 0.313099
        After 4000 training step(s), cross entropy on all data is 0.312431
        交叉熵逐渐变小
        '''
    
    print(sess.run(w1))
    print(sess.run(w2))
    '''
    训练之后神经网络参数的值
    w1=[[-0.8152228   1.4884994   0.06919771]
        [-2.4470553   0.1036205   0.5956092 ]]
    w2=[[-0.81617254]
        [ 1.4887934 ]
        [ 0.06990977]]

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值