Tensorflow 入门

来源:互联网 发布:宁德时代 知乎 编辑:程序博客网 时间:2024/06/06 02:01

Tensorflow <一>

计算模型-计算图

Tensorflow分两个阶段:(1)定义计算;(2)执行计算
如下定义计算的过程

import tensorflow as tfa = tf.constant([1.0, 2.0], name="a")b = tf.constant([2.0, 3.0], name="b")ret = a + b

constant函数原型如下

tf.constant(value, dtype=None, shape=None, name='Const')

使用如下,

a = tf.constant([1.0, 2.0], name="a",dtype=tf.float32)

Tensorflow数据模型-张量

张量(Tensor)可以看做是数组,在Tensorflow中张量是对结果的引用,并没有真正的保存数字,保存的是如何得到这些数字的计算过程。如下

import tensorflow as tfa = tf.constant([1.0, 2.0], name="a")b = tf.constant([2.0, 3.0], name="b")ret = tf.add(a,b, name="add")#打印的是计算信息,并不是值print(ret)

输出如下
这里写图片描述

Tensorflow支持的14种不同的数据类型,实数(tf.float32, tf.float64);整数(tf.int8, tf.int16, tf.int32, tf.int64, tf.uint8),布尔型(tf.bool),复数(tf.complex64, tf.complex128);

张量的作用:(1)对结果的引用;(1)计算图构造完成后获取计算结果,也就是真实的数字,如可以通过tf.Session().run(ret)获取计算结果。
可通过a.get_shape()获取张量的维度。

Tensorflow运行模型-会话

Tensorflow中的会话来执行订阅号的计算,并管理资源。两种使用方式
(1)

sess = tf.Session()#获取运算的结果sess.run(...)#关闭会话使得本次运行中使用到的资源得以释放sess.close()

(2)利用Python的上下文(一般使用这种)

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

Tensorflow会自动生成一个默认的计算图,若没有特殊指定,运算会自动加入这个计算图中。Tensorflow会自动生成。

Tensorflow实现神经网络

首先附一个Tensorflow游乐场 还不错呀

Tensorflow变量

变量很重要(神经网络的参数等);变量的两个属性:维度(shape)和类型(type);
初始化变量三种方法:(1)随机数;(2)常数;(3)其他变量的初始值
先看tf.Variable的方法定义

tf.Variable(initial_value=None, trainable=True, collections=None,\validate_shape=True, caching_device=None, name=None,\variable_def=None, dtype=None, expected_shape=None,\import_scope=None)

(1)随机数声明

#声明变量用tf.Variable,weights = tf.Variable(tf.random_normal([2,3],stddev=2))

随机数生成器如下

#正太分布,mean是均值,stddev是标准差,seed种子tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)#正太分布,但如果随机出来的值偏离平均值超过2个标准差,那么这个就会被重新随机tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)#平均分布tf.random_uniform(shape, minval=0.0, maxval=1.0, dtype=tf.float32, seed=None, name=None)#Gamma分布tf.random_gamma(...)

(2)常数生成函数

#产生0的数组tf.zeros(shape, dtype=tf.float32, name=None)#产生1的数组tf.ones(shape, dtype=tf.float32, name=None)#产生一个全部为给定数字的数组tf.fill(dims, value, name=None)#产生一个给定值的常量tf.constant(value, dtype=None, shape=None, name='Const')

(3)通过其他变量初始化

w2 = tf.Variable(weights.initialized_value())w3 = tf.Variable(weights.initialized_value() * 3)

在变量被使用前,变量的初始化需要明确的被调用(调用初始化函数)。如下代码

import tensorflow as tfw1 = 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(w1.initializer)sess.run(w2.initializer)print(sess.run(y))sess.close()

为什么要初始化呢? 答:变量定义时虽然给出了变量初始化的方法,但是这个方法没有真正运行,所以计算前需要通过initializer来初始化。但是随着变量数目增多,变量之间存在依赖关系时,单个调用就麻烦,因此提供了如下方法。

init_op = tf.initialize_all_variables()tf.global_variables_initializer()sess.run(init_op)

变量和张量有什么关系呢?
答:变量的声明函数tf.Variable是一个运算,这个运算的输出是一个张量。

通过Tensorflow训练神经网络模型

神经网络优化算法中最常用的是反向传播算法(BP)。实现BP算法的第一句就是使用Tensorflow表达一个batch的数据,如下

x = tf.constant([[0.7, 0.9]])

但如果每轮迭代中选取的数据都要通过常量来表示,那么Tensorflow的计算图将会变得太大,因为每生成一个常量,Tensorflow都会在计算图中增加一个节点,一般来说,一个神经网络训练需要通过几百万甚至几亿轮的迭代,这样计算图就会非常大,为避免这个问题,提供placeholder方法,如下

tf.placeholder(dtype, shape=None, name=None)

例(通过placeholder来实现前向传播算法)

import tensorflow as tfw1 = 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.placeholder(tf.float32, shape=(3,2), name="input")a = tf.matmul(x, w1) y = tf.matmul(a, w2) sess = tf.Session()init = tf.global_variables_initializer()sess.run(init)print(sess.run(y, feed_dict={x:[[0.7,0.9],[0.1, 0.4],[0.5, 0.8]]}))sess.close()

完整神经网络样例程序

给出一个完整的样例来训练神经网络解决二分类问题

import tensorflow as tffrom numpy.random import RandomStatebatch_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))#数据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)#损失函数,解释如下cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y,1e-10,1.0)))train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)#随机生成数模拟一个数据集rdm = RandomState(1)dataset_size = 128X = rdm.rand(dataset_size, 2)Y = [[int(x1+x2<1)] for (x1,x2) in X]init_op = tf.global_variables_initializer()with tf.Session() as sess:    sess.run(init_op)    #print sess.run(w1)    #print sess.run(w2)    STEPS = 500    for i in range(STEPS):        #每次选取batch_size个样本来进行训练        start = (i * batch_size) % dataset_size        end = min(start+batch_size, dataset_size)        #X[start:end] 选取[start,end)的数据来进行训练,按行选取        sess.run(train_step, feed_dict={x:X[start:end],\        y_:Y[start:end]})        if i%100 == 0:            #每隔一段时间计算在所有数据上的交叉熵并输出。            total_cross_entropy = sess.run(cross_entropy,\            feed_dict={x:X, y_:Y})            print("After %d trainning step(s), cross entropy on\            all data is %g" % (i,total_cross_entropy))    print sess.run(w1)    print sess.run(w2)

运行截图如下

这里写图片描述

原创粉丝点击