深度学习框架Tensorflow学习

一、基本概念

1、张量(Tensor)

张量是tensorflow程序中的基本成分,有了张量才能进行过后的一系列的运算。但是它表示的是所有的数据的运算的过程,而并不是数据本身。
如下面代码,定义了a,b两个常量的张量,并通过相加得到了result。但是此时的result结果并不是[3., 5.],而是result张量的基本信息(名字,维度,类型),我们打印result结果如下。

import tensorflow as tf

a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")

result = tf.add(a, b, name="add")

print(result)
Tensor("add:0", shape=(2,), dtype=float32)

2、计算图

正如Tensorflow框架的flow一样,直译就是流,意思就是以流的形式,一环一环的进行计算的模型。而每个部分的计算最后组成了整个的计算图。如上面代码中计算图即只是a和b相加得到result的过程。

3、会话(Session)

在Tensor节所说打印张量只能得到张量本身的基本信息,无法得到它所包含的数据,那么用会话就可以实现张量的运算。如下面代码,通过tf.Session(),会话去运行(run),便能得到我们所需要的结果。
总的来说,通过上述三者的结合:使用张量的数据类型,通过源代码构建自己的网络模型结构图计算图,最后通过会话去运行,便得到了最终结果。

import tensorflow as tf

a = tf.constant([1.0, 2.0], name="a")
b = tf.constant([2.0, 3.0], name="b")

result = tf.add(a, b, name="add")

with tf.Session() as sess:
    print(sess.run(result))
[3. 5.]

4、变量

在tensorflow中,变量通过tf.Variable()定义,主要用来保存跟新网络中的参数,是一种特殊的张量,其一般用于权重偏置的初始化。其中需要值得注意的是,由于变量同样是张量,那么它也并不包含数据本身,所以同样需要在会话中运行(run),即通过会话运行tf.global_variables_initializer()就可以完成所有变量的初始化,如下代码所示:

w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

init = tf.global_variables_initializer()

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

下面第二节给出了上述知识点完整的Demo代码(简单的前向传播算法)

5、placeholder,损失函数与学习器

在进行反向传播算法的时候,是一个一个batchsize进行迭代的。每一个batch只选择训练数据集的一小部分,然后进行当前小部分数据的前向传播算法,就会得到一个当前的最好预测结果。这个预测结果与真实结果的差距就是用损失函数来衡量的(损失函数的种类有很多,如差值,交叉熵等)。我们就是通过学习器(学习器的种类也很多:Adam等)来让这个损失函数最小化,那么我们在不断的进行迭代的过程中,因为遍历了更多的数据,最后模型就会变得越来越好。
值得注意的是,进行迭代的次数会非常大,所以计算图就会变得很大,节点会非常多,为了避免这样的问题,于是出现了placeholder。相当于定义了一个位置,每一次只需要用feed_dict喂数据就行了。

二、前向传播算法

前向传播算法类似于神经元的依次输入输出,如下代码所示,输入x分别进行两次传播(权重w1和w2),然后最后得到的y即为结果。

import tensorflow as tf

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.constant([[0.7, 0.9]])#模拟输入数据是1*2的矩阵

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    print(sess.run(y))

三、反向传播算法Demo

import tensorflow as tf
from numpy.random import RandomState

batch_size = 8
epoch = 5000


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)))#定义损失函数(y与y_之间)
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

rdm = RandomState(1)#通过numpy创造数据集
dataset_size = 128
X = rdm.rand(dataset_size, 2)#X是128*2的矩阵
Y = [[int(x1+x2 < 1)] for (x1, x2) in X]#X的矩阵数据之和与1判定,给予标签0和1


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))
    print("\n")


    for i in range(epoch):
        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("Training step: %d, cross entropy is %g" % (i, total_cross_entropy))

    print("\n")
    print("w1:", sess.run(w1))
    print("w2:", sess.run(w2))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值