Tensorflow实战Google深度学习框架

博主好久没有更新了,以后继续坚持吧


第四章说到,深层神经网络,理解了一些基本概念,在第三章书中提到的模型是由线性的模型来实现的,被称为线性模型,因为当模型的输入只有一个的时候,输出的x和y为坐标系上的一条直线,类似的,当模型有n个输入的时候,也是在n维空间内的平面

在前面的介绍中的为:

                a = xW(1),  y=aW(2),其中x为输入,W为参数,也就相当于y = aW(1)W(2),在这里,所有的输入,输出,以及参数都是矩阵,都要用矩阵的乘法才能来实现整个关系。

在这里,为什么要讨论线性模型呢?因为要引出激活函数,由于线性模型具有很大的局限性,举个例子来说明问题吧

    如下图:

Tensorflow实战Google深度学习框架_第1张图片

这个图如果用线性模型来进行分类的话,就是用一条直线将两类的点分开,但是从图中我们可以明显的看出,这是不可能的。

因此需要激活函数(Activation),激活函数的加入,让原来是线性模型的东西变成了一个可以是非线性模型的东西,一般,除了加入Activation,还会加入biases(偏置项),tf提供了七种激活函数,常用的有tf.nn.relu, tf.nn.sigmoid, tf.nn.tanh,当然,我们也可以自己定义一个激活函数,但是要记得是非线性的哦。

之后用来刻画不同神经网络模型的效果,神经网络模型的效果以及优化的目标是通过损失函数(loss function)来实现的。

讲到损失函数,当然会提到一些比较经典的,在经典损失函数中,提到了两个概念,一个是分类,一个是回归,分类顾名思义就是分类,而回归是一个预测的过程,输出只有一个,那就是预测的结果,在神经网络回归中,我们总会判断预测的结果和实际的结果到底有多大的差别,在这里我们用交叉熵来实现,用交叉熵可以很好的体现出两个概率分布之间的距离,他是分类问题中的一种损失函数,

Tensorflow实战Google深度学习框架_第2张图片

上面的内容是交叉熵的公式,从例子中也能够看出交叉熵之和应该是1,而最后的结果总是会有一个由概率决定的东西,在这里我们需要用概率来刻画分类的结果,这也是如今人工智能方面比较火的东西吧。从交叉熵的公式中,我们可以看出,交叉熵不是对称的,也就是说它不能前后调换位置。

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))

# 在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')

# 定义神经网络前向传播的过程
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)

# 随机生成一个模拟数据集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
# 定义规则来给出样本的标签,给这里所有的x1+x2<1的样例都认为时正样本(比如合格)
# 而其他为负样本,和游乐场表示法不大一样的是,在这里用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()  #### 原来的语句中是tf.initialize_all_variables(),和上一篇一样
    # 初始化变量
    sess.run(init_op)
    print(sess.run(w1))
    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)

        # 通过选取的样本训练网络并更新参数
        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 %d training steps(s), cross entropy on all data is %g" % (i, total_cross_entropy))

    # 书上的这部分运行会报错是因为with的机制会关闭session,所以可能会显示错误为run 的是一个空的session。
    # 如果要在外面继续使用sess,需要重新使用一个session

    print(sess.run(w1))
    print(sess.run(w2))
另一个是greater和select的代码
import tensorflow as tf

v1 = tf.constant([1, 2, 3, 4])
v2 = tf.constant([4, 3, 2, 1])
sess = tf.InteractiveSession()
print(tf.greater(v1, v2).eval())

print(tf.where(tf.greater(v1, v2), v1, v2).eval()) # 原来的代码是select,应该是tensorflow新版本修改了这个函数,改为where了。用select无法运行出来
有错误的地方已经在代码中用注释的方式贴出

你可能感兴趣的:(tensorflow,机器学习)