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))
接下来进入深度神经网络模型