一:计算图的知识:
1.tensorflow会将定义的计算转化为计算图上的结点。
2.tf会维护一个默认的计算图,通过 tf.get_default_graph 可以得到当前默认的计算图。 假设张量 a,通过a.graph 可以得到张量所属的计算图。
3. tf可以通过 tf.Graph函数生成新的计算图, 不同的计算图上的张量和运算不会共享。
二:张量:多维数组
1.张量不保存数字,保存的是得到这些数字的过程。
2.张量有三个属性,在定义时注意,分别是名字,维度,类型。
a =tf.constant([1.0, 2.0], name='a')
三:会话:
有两种使用模式:
1.
#创建一个会话
sess = tf.Session()
#运行
sess.run()
#关闭
sess.close()
2.使用python的上下文管理器
with tf.Session() as sess:
sess.run()
四.变量:Variable
1.tf中变量需要指定初始值 一般随机初始值,比如正态分布,参数是平均值,标准差,取值类型,类型不写默认是tf.float32,例如:
weights = tf.Variable(tf.random_normal([2, 3], stddev=2, mean=0))
w2 = tf.Variable(tf.random_normal([2,3], stddev=1, dtype=tf.float64), name='w2')
此外还有
tf.truncated_normal :正态分布,但是随机结果的值离平均值超过两个标准差,那么重新生成
tf.random_uniform :平均分布
tf.random_gamma :Gamma 分布
2.tf也可以使用常数初始化一个变量:
tf.zeros :全0数组
tf.ones :全1数组
tf.fill :指定数字填充 tf.fill([2, 3], 9)->[[9,9,9],[9,9,9]]
tf.constant : 给定常量填充 tf.constant([1, 2, 3])
在神经网络中,偏置项一般使用常数设置初始值:
bias = tf.Variable(tf.zeros([3,3]))
3.tf 中变量使用前都要初始化,用以下函数:
init_op = tf.global_variables_initializer()
sess.run(init_op)
3. tf.assign 函数 可以将第二个参数的值赋给第一个,如果维度不匹配,可以通过设置 validate_shape = False 来修改·
tf.assign(w1, w2, validate_shape=False)
五:占位符
tf.placeholder: 在计算图中占据了一个位置,但是它的值可以在使用过程中再传入。三个参数,分别是类型,维度,名字
x = tf.placeholder(tf.float32, shape=(1, 2), name='input')
在计算时,要提供一个feed_dict 来指定x的值
sess.run(y, feed_dict={x: train_x})
六:tf.clip_by_value
tf.clip_by_value(A, min, max):输入一个张量A,把A中的每一个元素的值都压缩在min和max之间。小于min的让它等于min,大于max的元素的值等于max
检验 :接下来实现一个简单的神经网络案例总结一下学到的知识:
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 20 18:55:38 2018
@author: www
"""
import tensorflow as tf
from numpy.random import RandomState
#准备数据
rs = RandomState(1)
dataset_size = 128
X = rs.rand(dataset_size, 2)
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
#定义网络的一些参数
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))
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)
#开始训练
steps = 5000
sess = tf.Session()
init_op = tf.global_variables_initializer()
sess.run(init_op)
for i in range(steps):
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 {} training step(s), cross entropy on all data is{}".format(i,total_cross_entropy))