诸如对于房价的预测

近期大家上学过回归难题,比方对于房价的预测,因为其预测值是个三番两次的值,因而归属回归难题。

但还只怕有生机勃勃类难点归于分类的难点,比方我们依据一张图纸来鉴定区别它是一只猫依旧一头狗。某篇小说的原委是归属体育音讯如故划得来新闻等,这一个结果是有二个全集的离散值,那类难题正是归类难题。

自家偶然会把回归难点看做是分类难题,比方对于房价值的前瞻,在骨子里的使用中,平日无需把房价准确到元为单位的,例如对于平均价值,以新加坡房价为例,能够分为:5000-10万这么的二个范围段,而且以1000为单位就足以了,固然那样分出了数不清类,但起码也得以用作是分类难点了。

所以分类算法应用范围极其遍布,大家来看下在tensorflow中哪些缓和那个分类问题的。
本文用精华的手写数字识别作为案例开展传授。

未雨打算有备无患粮草先行数据

# 准备数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('D:/todel/python/MNIST_data/', one_hot=True)

实施上述代码后,会从线上下载测量检验的手写数字的多寡。
只是在自个儿的机械上运转时好久都还没下载下相应的数额,最终自个儿就直接到
网址上下载当中的教练多少和测量检验数据文件到钦命的目录下,然后再运维那个程序就会把数量给解压开来。
图片 1

此处一同大致有6万个教练多少,1万个测量检验数据。

手写数字是一批28X28像素的黑白图片,举例:
图片 2

在这里一次案例中,我们把那几个数组张开成一个向量,长度是 28×28 =
784,也正是三个图纸正是单排784列的数额,每列中的值是贰个像素的灰度值,0-255。
何以要把图像的二维数组调换来生龙活虎维数组?
把图像的二维数组调换到生龙活虎维数组一定是把图像中的某个音信给吐弃掉了,但当下本文的案例中也得以用豆蔻年华维数组来开展归类,那些正是深浅神经互连网的精锐之处,它会用尽全力搜索一群数据中暗藏的法规。
后来大家会用卷积神经网络来拍卖那个图像的归类,那时的正确度就能够重复张开抓牢。
而是正是把此图像数据碾平成意气风发维数据的艺术也能有一个较好的分辨率。

除此以外这里有一个有关分类难点的要害概念正是one
hot数据,即便大家对各种图片要打上的竹签是0-9数字,但在分拣中用三个总结有十叁个占位分类的数字来表示,如若归属哪个类就在丰富位置设置为1,别的地点为0.
例如:
标签0将象征成([1,0,0,0,0,0,0,0,0,0,0])
标签2将意味着成([0,0,1,0,0,0,0,0,0,0,0])
这么结果集其实是叁个10列的数据,每列的值为0或1。

添加层

增多层的函数跟后边多少个博文中意气风发律,这里仍旧把它贴出来:

def add_layer(inputs, in_size, out_size, activation_function=None):
    """
    添加层
    :param inputs: 输入数据
    :param in_size: 输入数据的列数
    :param out_size: 输出数据的列数
    :param activation_function: 激励函数
    :return:
    """

    # 定义权重,初始时使用随机变量,可以简单理解为在进行梯度下降时的随机初始点,这个随机初始点要比0值好,因为如果是0值的话,反复计算就一直是固定在0中,导致可能下降不到其它位置去。
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    # 偏置shape为1行out_size列
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    # 建立神经网络线性公式:inputs * Weights + biases,我们大脑中的神经元的传递基本上也是类似这样的线性公式,这里的权重就是每个神经元传递某信号的强弱系数,偏置值是指这个神经元的原先所拥有的电位高低值
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        # 如果没有设置激活函数,则直接就把当前信号原封不动地传递出去
        outputs = Wx_plus_b
    else:
        # 如果设置了激活函数,则会由此激活函数来对信号进行传递或抑制
        outputs = activation_function(Wx_plus_b)
    return outputs

概念输入数据

xs = tf.placeholder(tf.float32, [None, 28*28])
ys = tf.placeholder(tf.float32, [None, 10]) #10列,就是那个one hot结构的数据

定义层

# 定义层,输入为xs,其有28*28列,输出为10列one hot结构的数据,激励函数为softmax,对于one hot类型的数据,一般激励函数就使用softmax
prediction = add_layer(xs, 28*28, 10, activation_function=tf.nn.softmax)

概念损失函数

为了演练大家的模子,大家第意气风发要求定义二个能够评估这些模型有多好品位的指标。其实,在机器学习,大家通常定义一个以此模型有多坏的目标,那一个指标称为花费(cost)或损失(loss),然后尽量最小化这么些指标。那二种目的格局本质上是等价的。
在分拣中,大家平日用“交叉熵”(cross-entropy)来定义其损失值,它的概念如下:
图片 3

y 是大家估算的可能率分布, y’ 是实在的布满(大家输入的one-hot
vector卡塔尔(قطر‎。极粗糙的驾驭是,交叉熵是用来衡量大家的展望用于描述真相的低效性。

# 定义loss值
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction), axis=1))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

初阶化变量

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)

算算正确度

先是让我们寻觅那贰个预测准确的标签。tf.argmax
是一个不胜实用的函数,它能交到有个别tensor对象在某后生可畏维上的其数据最大值所在的索引值。由于标签向量是由0,1结合,因而最大值1所在的目录地方便是项指标签,举个例子tf.argmax(y_pre,1卡塔尔国重返的是模型对于任豆蔻年华输入x预测到的标签值,而
tf.argmax(v_ys,1卡塔尔国 代表正确的标签,大家得以用 tf.equal
来检查测试我们的预测是不是实际标签相称(索引地方同样表示万分卡塔尔。

correct_prediction = tf.equal(tf.argmax(y_pre, 1), tf.argmax(v_ys, 1))

那行代码会给我们生龙活虎组布尔值。为了鲜明科学预测项的比例,大家得以把布尔值转换到浮点数,然后取平均值。比如,[True,
False, True, True] 会变成 [1,0,1,1] ,取平均值后拿到 0.75.

accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

终极,我们计算机技巧商讨所学习到的模子在测验数据集上边包车型大巴正确率。

小批量格局展开练习

for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys})
    if i % 50 == 0:
        # 每隔50条打印一下预测的准确率
        print(computer_accuracy(mnist.test.images, mnist.test.labels))

最终打印出:

Extracting D:/todel/python/MNIST_data/train-images-idx3-ubyte.gz
Extracting D:/todel/python/MNIST_data/train-labels-idx1-ubyte.gz
Extracting D:/todel/python/MNIST_data/t10k-images-idx3-ubyte.gz
Extracting D:/todel/python/MNIST_data/t10k-labels-idx1-ubyte.gz
2017-12-13 14:32:04.184392: I C:tf_jenkinshomeworkspacerel-winMwindowsPY36tensorflowcoreplatformcpu_feature_guard.cc:137] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
0.1125
0.6167
0.741
0.7766
0.7942
0.8151
0.8251
0.8349
0.8418
0.8471
0.8455
0.8554
0.8582
0.8596
0.8614
0.8651
0.8655
0.8676
0.8713
0.8746

全部代码

import tensorflow as tf

# 准备数据
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('D:/todel/python/MNIST_data/', one_hot=True)

def add_layer(inputs, in_size, out_size, activation_function=None):
    """
    添加层
    :param inputs: 输入数据
    :param in_size: 输入数据的列数
    :param out_size: 输出数据的列数
    :param activation_function: 激励函数
    :return:
    """

    # 定义权重,初始时使用随机变量,可以简单理解为在进行梯度下降时的随机初始点,这个随机初始点要比0值好,因为如果是0值的话,反复计算就一直是固定在0中,导致可能下降不到其它位置去。
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    # 偏置shape为1行out_size列
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    # 建立神经网络线性公式:inputs * Weights + biases,我们大脑中的神经元的传递基本上也是类似这样的线性公式,这里的权重就是每个神经元传递某信号的强弱系数,偏置值是指这个神经元的原先所拥有的电位高低值
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        # 如果没有设置激活函数,则直接就把当前信号原封不动地传递出去
        outputs = Wx_plus_b
    else:
        # 如果设置了激活函数,则会由此激活函数来对信号进行传递或抑制
        outputs = activation_function(Wx_plus_b)
    return outputs

# 定义输入数据
xs = tf.placeholder(tf.float32, [None, 28*28])
ys = tf.placeholder(tf.float32, [None, 10]) #10列,就是那个one hot结构的数据

# 定义层,输入为xs,其有28*28列,输出为10列one hot结构的数据,激励函数为softmax,对于one hot类型的数据,一般激励函数就使用softmax
prediction = add_layer(xs, 28*28, 10, activation_function=tf.nn.softmax)

# 定义loss值
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction), axis=1))
train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)


def computer_accuracy(v_xs, v_ys):
    """
    计算准确度
    :param v_xs:
    :param v_ys:
    :return:
    """
    # predication是从外部获得的变量
    global prediction
    # 根据小批量输入的值计算预测值
    y_pre = sess.run(prediction, feed_dict={xs:v_xs})
    correct_prediction = tf.equal(tf.argmax(y_pre, 1), tf.argmax(v_ys, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    result = sess.run(accuracy, feed_dict={xs:v_xs, ys:v_ys})
    return result

for i in range(1000):
    batch_xs, batch_ys = mnist.train.next_batch(100)
    sess.run(train_step, feed_dict={xs: batch_xs, ys: batch_ys})
    if i % 50 == 0:
        # 每隔50条打印一下预测的准确率
        print(computer_accuracy(mnist.test.images, mnist.test.labels))

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*
*
Website