• 机器学习的hello world——MNIST


    MNIST:一个由60000行训练数据集和10000行的测试数据集(机器学习模型设计时必须有一个单独的数据集用于评估模型的性能)组成的数据集。

    下载mnist的数据集后,将文件放入C:Usersmissouter.kerasdatasets中,再将以下代码写入程序:

    import tensorflow as tf
    import numpy as np
    def transform_data(x_train, y_train, x_test, y_test):
        x_train_new=x_train.reshape(-1,28*28)
        x_test_new=x_test.shape(-1, 28*28)
        y_train_new=np.zeros((y_train.shape[0],10))
        y_test_new=np.zeros((y_test.shape[0],10))
        for i in range(y_train.shape[0]):
            y_train_new[i][y_train[i]] = 1
        for i in range(y_test.shape[0]):
            y_test_new[i][y_test[i]] = 1
        return x_train_new,y_train_new,x_test_new,y_test_new
    mnist=tf.keras.datasets.mnist
    (x_train, y_train), (x_test, y_test)=mnist.load_data()
    x_train,x_test=x_train/255.0,x_test/255.0
    x_train, y_train, x_test, y_test = transform_data(x_train, y_train, x_test, y_test)

    这样就直接完成了数据集的导入与训练、测试集的分割。处理完后,还需定义每轮feed给网络的数量:

    BATCH_SIZE = 100
    TOTAL_SIZE = x_train.shape[0]

    下一步需要使用softmax回归(softmax regression),softmax模型可以用来给不同的对象分配概率,以得到某个图像为某个特定数字类的证据为例,输入图片x代表的数字为x的证据可表示为:

    evidencei=∑W(i,j)xj + bi

    其中Wi代表权重;因输入会带一些无关的干扰量,故加入偏置量bi,j代表给定图片的像素索引。

    运用softmax函数可将证据转换成概率y:

    y=softmax(evidence) 激励 / 链接函数

    从而将我们定义的线性函数输出转换成十个数字类的概率分布;一般将softmax模型函数定义为下列的前一种形式,即将输入值当成幂指数求值,再将结果值正则化。

    softmax(x)=normalize(exp(x))
    softmax(x)i=exp(xi)/∑exp(xj)

    更为紧凑的格式可写为:

    y=softmax(Wx+b)

    用以下方式创建可交换单元:

    x=tf.placeholder("float", [None, 784])

    placeholder构筑整个系统的graph;第一个参数是数据类型,第二个参数是数据形状,上述代码中[None, 784]表明行未定,列为784列;第三个参数为名称,未写入代码。

    上述语句的x是一个占位符;MNIST的一张图包含28*28=784个像素,每一张图展平成784维的向量;none 表示此张量的第一维度可以是任何一个长度。

    Variable表示一个可修改的向量,放置模型参数。可用于计算输入值,也可在计算中被修改。下方代码中,因我们需要让784维的图片向量乘权值w得到十位的证据向量,故模型参数形状为[784,10]。

    用全为零的张量初始化w、b:

    w=tf.Variable(tf.zeros([784,10]))
    b=tf.Variable(tf.zeros[10])

    我们需要用784维的图片向量乘w以获得10维的证据值向量,故w维度wei[784, 10](矩阵乘法)。

    接着用以下语句实现模型:

    y=yf.nn.softmax(tf.matmul(x, W)+b)

    在训练模型时,我们定义成本损失来评估模型好坏;交叉熵是一个常见的成本函数:

    Hy‘(y)=-∑y’log(yi)

    y’为预测分布,y为实际分布;

    使用一个占位符输入正确值,然后计算交叉熵:

    y_=tf.placeholder("float", [none, 10])
    cross_entropy=-tf.reduce_sum(y_*tf.log(y))

    选择梯度算法以0.01的学习速率最小化交叉熵,将每个变量一点点朝成本降低的方向移动:

    train_step = tf.train.GradienDescentOptimizer(0.01).minimize(cross_entropy)

    简单调整一行代码就可以使用tensorflow提供的其他算法。

    最后,初始化模型并训练模型,例子中训练了一千次:

    sess=tf.Session()
    sess.run(init)
    for i in range(1000):
           start = (i * BATCH_SIZE) % TOTAL_SIZE
             end = start + BATCH_SIZE
           batch_xs, batch_ys = x_train[start:end], y_train[start:end]
          sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})

    每次循环随机抓取训练集中的100个批处理点,替换先前定位的占位符,运行train_step。

    接下来使用tf.argmax给出tensor对象某维上的数据最大值的索引值,则可知:

    tf.argmax(y, 1)返回的是预测标签值
    tf.argmax(y_, 1)代表的是正确的标签

    使用tf.equal检测预测是否与真实标签匹配:

    correct_prediction=tf.equal(tf.argmax(y, 1), tf.argmax(y_,1))

    代码返回布尔值,将其转换成浮点数后取平均,计算学习模型正确率:

    accuracy=tf.reduce_mean(tf.cast(correct_prediction, "float"))
    print(sess.run(accuracy, feed_dict={x:x_test, y_: y_test}))

    这样对于mnist手写体识别的过程就写完了。

  • 相关阅读:
    java中动态给sql追加?号
    在java中构建json对象,返回给前端页面
    java中的文件下载
    Session和Cookie
    处理全站请求编码,无论是GET还是POST,默认是UTF-8
    配置Spring的用于初始化容器对象的监听器
    在web.xml中配置struts2拦截器
    java生成一次性验证码
    tab------左右布局
    java使用Base64编码
  • 原文地址:https://www.cnblogs.com/missouter/p/12621454.html
Copyright © 2020-2023  润新知