关于构建浅层神经网络的一些理解(以MNIST为例子)

本文通过使用TensorFlow实现浅层神经网络对MNIST手写数字数据集进行分类,详细介绍了从数据准备到模型搭建及训练的全过程,并展示了如何评估模型准确性。

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

本人是tensorflow的一个小白,  理解了一天, 把代码弄明白一些,希望自己的理解能够给更多人帮助

大家都知道MNIST是一个比较简单的实例,相当于编程语言中的“hello word”,浅层神经网络也比较简单,所以也比较适合咱们新手。

话不多说,代码走起。

#coding:utf-8

import tensorflow as tf

# 我也不知道为什么要引用这个numpy,有知道的小伙伴在下面留言哦

import numpy as np

# 在tensorflow有一些基本的数据,不用我们下载,直接用就ok了

from tensorflow.examples.tutorials.mnist import input_data


# 添加一层神经网络,注意:我们设计的是浅层神经网络

# 有多浅呢? 一个输入层, 一个隐藏层,一个输出层(我们说有多少层,一般不算输入层)

#言归正传, add_layer一共有四个参数,

# input代表输入的数据 , in_size代表输入数据的形状, out_size代表当前层输出是什么形状,

# activation_function代表的是使用的激活函数

def add_layer(inputs, in_size, out_size, activation_function=None):

   #tf.Variable()可以理解为用来存放标量,W和b都是我们要修改的

    # W代表的是权重(weight),b是bias(偏置)的缩写

    W = tf.Variable(tf.random_normal([in_size, out_size]))
    b = tf.Variable(tf.zeros([1, out_size])+0.01)

    Z = tf.matmul(inputs, W) + b

    #if语句间接的判断了当前层是哪种层,如果是输出层,activation_function就是None,             

    #如果是隐藏层,就是 activation_function(Z)

    if activation_function is None:
        outputs = Z
    else:
        outputs = activation_function(Z)
    return outputs



if __name__ == '__main__':  #这个 条件是用来判断是否直接执行当前.py文件
    MNIST = input_data.read_data_sets("./", one_hot=True)

    learning_rate = 0.05 # 学习率

    batch_size = 128 #每批大小

    n_epoch = 10

    X = tf.placeholder(tf.float32, [batch_size, 784])
    Y = tf.placeholder(tf.float32, [batch_size, 10])

    # 添加隐藏层1,

    # 请注意add_layer()是我们上面编写的

    l1 = add_layer(X, 784, 1000, activation_function=tf.nn.relu)
    # 添加输出层
    prediction = add_layer(l1, 1000, 10, activation_function=None)
    entropy = tf.nn.softmax_cross_entropy_with_logits(labels=Y, logits=prediction)
    loss = tf.reduce_mean(entropy)
    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
    init = tf.initialize_all_variables()

    with tf.Session() as sess:
        sess.run(init)
        # 表示在训练阶段, 一共有多少的batch
        n_batch = int(MNIST.train.num_examples/batch_size)
        # i用来代表当前第几轮
        for i in range(n_epoch):
            # j代表在第几个batch

            for j in range(n_batch):

                # next_batch()是已经写好的,直接用就可以,而且会返回两个值:一个是特征,一个是label

                X_batch, Y_batch = MNIST.train.next_batch(batch_size)

                # _可以理解是一个变量名,因为再后面的程序中,我们使用不到这个变量中的值,所以用‘_’来命名,

                # 是python中的一种约定俗成的东西

                _, loss_ = sess.run([optimizer, loss], feed_dict={X:X_batch, Y:Y_batch})
                if j==0:
                    print("Loss of epoch[{0}]  batch[{1}]:{2}".format(i, j, loss_))
        # test the model
        n_batches = init(MNIST.test.num_examples/batch_size)
        #全部预测正确的数目
        total_correct_preds = 0
        for i in range(n_batches):
            X_batch, Y_batch = MNIST.test.next_batch(batch_size)
            preds = sess.run(prediction, feed_dict={X:X_batch, Y:Y_batch})
            correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y_batch, 1))
            accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32))
            total_correct_preds += sess.run(accuracy)
        print("Accuracy {0}".format(total_correct_preds/MNIST.test.num_examples))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值