TensorFlow学习笔记(一)TensorFlow入门(代码详解版)

一、TensorFlow运行模型——会话

1、通过创建会话(session)来执行定义好的运算
# 创建一个会话
sess = tf.Session()
# 使用这个创建好的会话来得到关心的运算的结果。比如可以调用sess.run(result)
sess.run(...)
# 关闭会话使得本次运行中得到的资源可以被释放
sess.close()

通过Python上下文管理器的机制,只要将所有的计算放在“with”的内部就可以。当上下文管理器退出时候会自动释放所有资源。这样既解决了因为异常退出时资源释放的问题,同时也解决了忘记调用Session.close函数而产生的资源泄露。

# 创建一个会话,并通过Python中的上下文管理器来管理这个会话。
with tf.Session() as sess:
    #使用创建好的会话来计算关心的结果
    sess.run(...)
# 不需要再调用“Session.close()”函数来关闭会话
# 当上下文退出时会话关闭和资源释放也自动完成了
2、通过 tf.InteractiveSession 函数可以省去将产生的会话注册为默认会话的过程。
sess = tf.InteractiveSession()
print(result.eval())
sess.close()
3、通过ConfigProto配置会话的方法:
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上进行进行:

  1. 运算无法在GPU上执行。
  2. 没有GPU资源(比如运算被指定在第二个GPU上运行,但是机器只有一个GPU)
  3. 运算输入包含CPU计算结果的引用

第二个参数也是布尔型参数,在生产环境中将这个参数设置为False可以减少日志量。

二、TensorFlow实现神经网络

1、前向传播算法

全连接网络:相邻两层之间任意两个节点之间都有连接。

不同输入的权重就是神经元的参数。

[外链图片转存失败(img-lsw88YZf-1563194907804)(C:\Users\DELL\AppData\Roaming\Typora\typora-user-images\1563028762848.png)]

# 以三层神经网络结构图示例

"""
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
2、通过TensorFlow训练神经网络模型
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))
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值