# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话来得到关心的运算的结果。比如可以调用sess.run(result)
sess.run(...)
# 关闭会话使得本次运行中得到的资源可以被释放
sess.close()
通过Python上下文管理器的机制,只要将所有的计算放在“with”的内部就可以。当上下文管理器退出时候会自动释放所有资源。这样既解决了因为异常退出时资源释放的问题,同时也解决了忘记调用Session.close函数而产生的资源泄露。
# 创建一个会话,并通过Python中的上下文管理器来管理这个会话。
with tf.Session() as sess:
#使用创建好的会话来计算关心的结果
sess.run(...)
# 不需要再调用“Session.close()”函数来关闭会话
# 当上下文退出时会话关闭和资源释放也自动完成了
sess = tf.InteractiveSession()
print(result.eval())
sess.close()
config = tf.ConfigProto(allow_soft_placement=True,log_device_placement=True)
sess1 = tf.InteractiveSession(config=config)
sess2 = tf.Session(config=config)
ConfigProto 参数中第一个是布尔型的参数,当它为True时,在以下任意一个条件成立时,GPU上的运算可以放到CPU上进行进行:
第二个参数也是布尔型参数,在生产环境中将这个参数设置为False可以减少日志量。
全连接网络:相邻两层之间任意两个节点之间都有连接。
不同输入的权重就是神经元的参数。
# 以三层神经网络结构图示例
"""
x为输入矩阵
w1为从输入层到隐藏层的权重矩阵
a为隐藏层矩阵
w2为从隐藏层到输出层的权重矩阵
"""
import tensorflow as tf
sess = tf.Session() # 建立会话
x = tf.constant([[0.7,0.9]],name='x')
w1 = tf.constant([[0.2,0.1,0.4],[0.3,-0.5,0.2]],name='w1')
w2 = tf.constant([[0.6],[0.1],[-0.2]],name='w2')
a = tf.matmul(x,w1) # 矩阵相乘
print(sess.run(a)) # 输出结果
y = tf.matmul(a,w2)
print(sess.run(y))
sess.close() # 关闭会话
输出:
[[ 0.41000003 -0.38 0.45999998]] # 隐藏层a
[[ 0.11600002]] # 输出层y
import tensorflow as tf
from numpy.random import RandomState
# 定义训练数据batch的大小
batch_size = 8
# 定义神经网络的参数
"""
tf.Variable:TensorFlow变量的声明函数
tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))会产生一个2 X 3的矩阵
矩阵中的元素均值为0,标准差为1的随机数
并且通过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))
# 定义placeholder作为存放数据的地方
"""
这里维度也不一定要定义,但如果维度是确定的,那么给出维度可以降低出错的概率
若要改变样例数据的大小,改变shape
在shape的一个维度上使用None可以方便使用不同的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')
# 定义神经网络前向传播的过程
"""
tf.matmul :矩阵相乘
"""
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
# # 常规操作
# sess = tf.Session()
# init_op = tf.global_variables_initializer()
# sess.run(init_op)
# 定义损失函数来刻画预测值与真实值得差距
"""
使用sigmoid函数将y转换为0-1之间的数值。
转换后y代表预测是正样本的概率,1-y代表预测是负样本的概率
"""
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)))
# 定义学习率
learning_rate = 0.001
# 定义反向传播算法来优化神经网络中的参数
train_step = \
tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)
# 通过随机数生成一个模拟数据集
""""
1为随机种子,只要随机种子seed相同,产生的随机数序列就相同
dataset_size:数据集大小
定义规则来给出样本的标签
所有x1+x2<1的样例都被认为是正样本(比如零件合格),而其他为负样本(比如零件不合格)。
"""
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("w1=")
print(sess.run(w1))
print("w2=")
print(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)
# 通过选取的样本训练神经网络并更新参数
# 指定x y_的取值
sess.run(train_step,
feed_dict={x:X[start:end],y_:Y[start:end]})
if i%1000 ==0:
# 每隔一段时间计算在所有数据上的交叉熵并输出
"""
通过运行观察结果可以发现随着训练的进行,交叉熵是逐渐变小的。
交叉熵越小说明预测的结果和真实的结果差距越小
"""
# 指定x y_的取值
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))
# 训练后的神经网络权值
print("w1=")
print(sess.run(w1))
print("w2=")
print(sess.run(w2))