ThensorFlow学习笔记【一】

ThensorFlow学习笔记【一】


  • ThensorFlow学习笔记【一】
    • 一、安装
    • 二、测试代码
    • 三、ThensorFlow入门
      • 一、计算图
      • 二、张量
      • 三、会话
    • 四、一个实例

环境说明:ubunu 16.04 python3 pycharm

一、安装

在这里只是说明Ubuntu上面的安装,可以利用pip安装,如果更新到最新版本的PIP可以直接使用

sudo pip3 install thensorflow

二、测试代码

简单的一些测试的代码,进行一个向量的加法。简单的一个tensorflow模型。
import tensorflow as tf

a=tf.constant([1.0,2.0],name="a")
b=tf.constant([2.0,3.0],name="b")   #利用TensorFlow的constant来初始化两个常量

result=a+b ##tensorflow支持向量之间直接用‘+’的加法
#print(result)#Tensor("add:0", shape=(2,), dtype=float32)
#直接打印的话输出的result的类型以及相关信息
sess=tf.Session() #形成一个会话
print(sess.run(result)) #要输出相加得到的结果,不能简单地直接输出result,而是需要生成一个会话(session)
                 #并且通过这个会话来得到结果,这就是一个最为简单的tensorflow的模型
在运行过程中出现了正确的结果,但是出现了一个警告,对于下面的警告是由于我直接用pip安装的所以安装的是通用版本,所以出现这个问题。解决方法,是重新编译,暂时放下,后期再做准备。
#2018-04-12 22:50:53.780642: I tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA

三、ThensorFlow入门

一、计算图

说明一下TensorFlow中的Tensor表示的张量,便于理解为可以理解为一个多维数组;Flow可以理解为“流”。那么就可以理解为,张量之间通过计算相互转化的过程。TensorFlow是一个通过计算图的形式来表述计算的编程系统。每一个计算都是计算图上的一个节点,而节点之间的边描述的就是,计算之间的依赖。

import tensorflow as tf

g1 = tf.Graph()
with g1.as_default():
    #计算g1中定义的变量“v”,并初始化为0
    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", shape=[1], initializer=tf.ones_initializer())

#在计算图g1中读取变量“v”的取值
with tf.Session(graph=g1) as sess:
    tf.global_variables_initializer().run()
    with tf.variable_scope("",reuse=True):
        #在计算图g1中,变量“v”的取值应该为0,所以先买会输出【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”的取值应该为0,所以先买会输出【0.】.
        print(sess.run(tf.get_variable("v")))
#以上代码产生了两个计算图,每个计算图中定义了一个名字为“V ”的变量。并且一个初始化为0和1。
#tf.Graph.device()来指定运行计算的设备。
#运行在GPU上的代码
g=tf.Graph()
#指定的设备上运行
#with g.device('/gpu:0'):
#    result = a + b

计算图可以通过集合(collection)来管理不同的类别的资源。比如tf.add_to_collection资源添加到集合中,tf.get_collect获取一个集合里面的所有资源。

集合名称 集合内容 使用场景
tf.GraphKeys.VARIABLES 所有变量 持久化ThensorFlow模型
tf.GraphKeys.TRAINABLE_VARIABLES 可学习的变量(一种神经网络中的参数) 模型训练、生成模型可视化内容
tf.GraphKeys.SUMMARIES 日志生成相关的张量 ThensorFlow计算可视化
tf.GraphKeys.QUEUE_RUNNERS 处理输入QueueRunner 输入处理
tf.GraphKeys.MOVING_AVERAGE_VARIABLES 所有计算滑动平均值的变量 计算变量的滑动平均值

二、张量

前面说到,张量可以简单理解为多维数组。其中零阶张量表示标量(scalar),也就是一个数。第一阶张量为向量,也就是一个多维数组;第n阶张量可以理解为多维的数组。
张量的运算不会得到算数结果,所得到的是属性,如名字、维度、类型。

三、会话

会话是在TensorFlow里面比较重要的,前面的张量和计算图是来组织数据和定义运算的,而会话是来执行这些计算的。值得注意的每次使用一个会话,必须在完成之后必须是释放掉资源,否则就会导致资源的异常。
为了防止意外发生,可以使用with 上下文管理器来完成操作。

四、一个实例

这个实力里面设计了前向传播算法和反向传播算法。暂时不介绍,后期 应该会深入了解一下。

这里我记录一些函数

函数名称 随机数分布 主要参数
tf.random_normal 正态分布 平均值、标准差、取值类型
tf.truncated_normal 正态分布,但如果随机出来的偏离平均值超过2个标准差,那么这个数将会被重新随机 平均值、标准差、取值类型
tf.random_uniform 均匀分布 最小、最大取值、取值类型
tf.random_gamma Gamma分布 形状参数alpha、尺度参数beta、取值类型

一个神将网络的训练模型

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))  #stddev定义的是数据是几维数组

#定义shape的一个维度上使用Node 可以方便使用不同的batch大小。当训练时需要把数据分成比较小的batch,但是在测试的时候,
#可以一次性使用全部的数据。当数据及比较小的时,这样比较方便测试,但数据集比较大时,将大连那个数据放入一个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.0001).minimize(cross_entropy)

#通过随机数生成一个模拟数据集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
#定义规则来给出样本的标签。在这里所有x1+x2<1的样例都被认为是正样本(比如零件合格),
#而其他的为负样本(零件不合格)。和TensorFlow游乐场中的表达法不大一样的地方是在这里使用 0 来表示负样本,1表示正样本
#大部分解决分类神经网络都会采用0和1的表示方法
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('w1 = ',sess.run(w1))
    print('w2 = ',sess.run(w2))

    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',i,'training step(s),cross entropy on all data is',total_cross_entropy)

    print('w1 = ',sess.run(w1))
    print('w2 = ',sess.run(w2))

接下来进入深度神经网络模型

你可能感兴趣的:(ThensorFlow,深度学习)