TensorFlow入门-MNIST数据集

本文通过实现一个多层感知器模型在MNIST数据集上进行手写数字识别,详细介绍了使用TensorFlow构建、训练及评估模型的过程。文中不仅涵盖了模型结构的设计,还深入探讨了超参数的选择及其对模型性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在深度学习的路上,从头开始了解一下各项技术。本人是DL小白,连续记录我自己看的一些东西,大家可以互相交流。

之前写过一些关于深度学习的简单概念,最近这段时间会看一些代码相关的东西。

本文参考:

https://github.com/aymericdamien/TensorFlow-Examples/blob/master/examples/3_NeuralNetworks/multilayer_perceptron.py

TensorFlow官方样例

一、前言

tensorflow相关的内容可以看之前实验室同学写的介绍

https://blog.youkuaiyun.com/wangyanbeilin/article/details/81108278

这两天实现的东西乱七八糟的,一点点整理出来。

下面是MNIST数据集在tensorflow上的实现,主要写的内容都在代码注释里了。用tensorflow实现还是很简单的。

三、代码实现

#导入3.x新功能,让python 2.x的代码,也需要在print后面加(),这里用于统一代码规范
from __future__ import print_function

#下载导入MNIST数据集,MNIST数据集被包括在tensorflow之中
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

import tensorflow as tf

#设置超参数(hyperparameters)
learning_rate = 0.001
training_epochs = 15

#一般使用256,128,64,32等存储大小,这里因为MNIST数据集一共55000个数据,用100可以整除,省去了mini_batch的余数部分batch的处理,用来简化操作
batch_size = 100
display_step = 1

#设定参数
n_h1 = 256
n_h2 = 256
#MNIST数据大小为28 * 28 = 784
n_x = 784 #输入层为784个神经元结点
n_y = 10

#创建占位符(placeholder)
X = tf.placeholder("float", [None, n_x])
Y = tf.placeholder("float", [None, n_y])

#初始化参数(权重)
parameters = {
    "W1": tf.Variable(tf.random_normal([n_x, n_h1])),
    "W2": tf.Variable(tf.random_normal([n_h1, n_h2])),
    "W3": tf.Variable(tf.random_normal([n_h2, n_y]))
}

#初始化参数(偏置)
biases = {
    "b1": tf.Variable(tf.random_normal([n_h1])),
    "b2": tf.Variable(tf.random_normal([n_h2])),
    "b3": tf.Variable(tf.random_normal([n_y]))
}
#Acc : 0.8901
#cost: 21.8285
"""""
这里也可以用个零向量来初始化偏置,代价函数初始值比随意量初始化的初值要低。可能因为其他的超参数也需要调优的原因,单独调整偏置之后的正确率反而下降了
biases = {
    "b1": tf.Variable(tf.zeros([n_h1])),
    "b2": tf.Variable(tf.zeros([n_h2])),
    "b3": tf.Variable(tf.zeros([n_y]))
}
Acc : 0.878
cost: 22.4767
"""""
#建立MLP model
def multilayer_perceptron(x):
    layer_1 = tf.add(tf.matmul(x, parameters['W1']), biases['b1'])
    layer_2 = tf.add(tf.matmul(layer_1, parameters['W2']), biases['b2'])
    out_layer = tf.add(tf.matmul(layer_2, parameters['W3']), biases['b3'])
    return out_layer

#logits即为y-hat预测值
logits = multilayer_perceptron(X)

#计算损失
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits = logits, labels= Y))

"""
创建优化器,这里使用的是Adam优化器,常用的还有
tf.train.GradientDescentOptimizer(learning_rate) 梯度下降优化方法
tf.train.RMSPropOptimizer(learning_rate) RMSProp优化方法
"""
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)

#优化模型,最小化损失
train_op = optimizer.minimize(loss_op)

#初始化变量
init = tf.global_variables_initializer()

#开始会话,tensorflow
with tf.Session() as sess:
    sess.run(init)

    for epoch in range(training_epochs):
        avg_cost = 0.
        #这里如果是64为一batch的话,还需要单独处理余数部分的数据
        total_batch = int(mnist.train.num_examples / batch_size)

        for i in range(total_batch):
            batch_x, batch_y = mnist.train.next_batch(batch_size)
            _, c = sess.run([train_op, loss_op], feed_dict={X: batch_x, Y:batch_y})
            avg_cost += c / total_batch
        
        #因为迭代次数仅为15次,所以每次都输出损失,大规模训练可以隔几次输出
        if epoch % display_step == 0:
            print("Epoch:", '%04d' % (epoch+1), "cost={:.9f}".format(avg_cost))

    print('Optimization Finished')

#测试模型,用测试数据集来看模型的能力
    pred = tf.nn.softmax(logits)
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(Y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    print("Accuracy:", accuracy.eval({X: mnist.test.images, Y: mnist.test.labels}))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值