对书中用leaky_relu激活函数训练DNN示例代码的分析

示例代码来自书中,有部分进行了修改:
加载数据集改为从本地导入
引入可视化,查看数据集

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import matplotlib

n_inputs=28*28 #mnist数据集中图片大小为28*28=784,共784个像素点
n_hidden1=300 #第一个隐藏层神经元个数
n_hidden2=100 #第二个隐藏层神经元个数
n_outputs=10  #输出层神经元个数,MNIST数据集中分类的个数为10

X=tf.placeholder(tf.float32,shape=(None,n_inputs),name="X") #占位节点,在tensorflow进行图计算过程中通过占位节点进行传值,将数据集通过占位节点参与图计算
y=tf.placeholder(tf.int32,shape=(None),name="y")


def leaky_relu(z,name=None):
    '''tf.maximum:用法tf.maximum(a,b),返回的是a,b之间的最大值,'''
    return tf.maximum(0.01*z,z,name=name)

'定义命名空间dnn'
with tf.name_scope('dnn'):
    hidden1=tf.layers.dense(X,n_hidden1,activation=leaky_relu,name='hidden1')
    hidden2=tf.layers.dense(hidden1,n_hidden2,activation=leaky_relu,name='hidden2')
    logits=tf.layers.dense(hidden2,n_outputs,name="outputs")

with tf.name_scope("loss"):
    xentropy=tf.nn.sparse_softmax_cross_entropy_with_logits(labels=y,logits=logits)
    loss=tf.reduce_mean(xentropy,name="loss")

learning_rate=0.01

with tf.name_scope("train"):
    optimizer=tf.train.GradientDescentOptimizer(learning_rate)
    training_op=optimizer.minimize(loss)

with tf.name_scope("eval"):
    correct=tf.nn.in_top_k(logits,y,1)
    accuracy=tf.reduce_mean(tf.cast(correct,tf.float32))

init = tf.global_variables_initializer()

saver=tf.train.Saver()

datasets_path="../../Datasets/mnist/mnist.npz"

try:
    data=np.load(datasets_path)
    X_train, y_train, X_test, y_test = data['x_train'], data['y_train'], data['x_test'], data['y_test']

    #保存一条数据,方便查看
    #np.savetxt('test.txt', X_train[0], fmt='%3d', newline='\n\n')

    # matplotlib可视化查看
    '''
    for i in range(20):
        plt.subplot(4, 5, i + 1)
        plt.imshow(X_train[i], cmap=matplotlib.cm.binary, interpolation='none')
        plt.title("Class {}".format(y_train[i]))
        #plt.axis("off")
    #plt.show()
    '''

    #将数据归一化
    X_train=X_train.astype(np.float32).reshape(-1,28*28)/255.0
    X_test=X_test.astype(np.float32).reshape(-1,28*28)/255.0

except Exception as e:
    print('%s',e)

#将数据类型转为int32
y_train=y_train.astype(np.int32)
y_test=y_test.astype(np.int32)

#将训练集的前5000个实例作为正式数据集,该数据集不用来训练模型,放在最后用来评估模型
#5000以后的作为训练集,对模型进行训练
X_valid,X_train=X_train[:5000],X_train[5000:]
y_valid,y_train=y_train[:5000],y_train[5000:]

def shuffle_batch(X,y,batch_size):
    rnd_idx=np.random.permutation(len(X))
    n_batches=len(X) // batch_size
    for batch_idx in np.array_split(rnd_idx,n_batches):
        X_batch,y_batch=X[batch_idx],y[batch_idx]
        yield X_batch,y_batch #关键字yield的作用是返回一个生成器对象(迭代器)

n_epochs=40 #迭代次数
batch_size=50 #批次大小

with tf.Session() as sess:
    init.run()
    for epoch in range(n_epochs):
        for X_batch,y_batch in shuffle_batch(X_train,y_train,batch_size=batch_size):
            sess.run(training_op,feed_dict={X:X_batch,y:y_batch})

        if epoch % 5 ==0:
            acc_batch=accuracy.eval(feed_dict={X:X_batch,y:y_batch})
            acc_valid=accuracy.eval(feed_dict={X:X_valid,y:y_valid})
            print(epoch,"Batch accuracy:",acc_batch,"Validation accuracy:",acc_valid)

    save_path=saver.save(sess,"../checkpoint/leaky_relu_dnn/my_model_final.ckpt")

关于tf.maximum

tensorflow中tf.maximum,tf.minimum,tf.argmax,tf.argmain的对比
https://blog.csdn.net/uestc_c2_403/article/details/74370409

Leaky ReLU是一种用于解决ReLU激活函数中梯度消失问题的高级激活函数。当输入小于0时,Leaky ReLU试图修复"dead ReLU"问题,通过引入一个很小的斜率来保留一些负轴的值,避免梯度永远为0。 数学表达式为:y = max(0, x) + leak * min(0, x),其中leak是一个很小的常数。 Leaky ReLU的图像展示了它的特点,它在x小于0的区域有一个小的斜率,而在x大于0的区域则与ReLU函数相同。 在TensorFlow中,可以使用tf.maximum(leak * x, x)来实现Leaky ReLU的简单实现。这段代码将输入x与leak * x取最大值,从而得到Leaky ReLU的输出。 总结来说,Leaky ReLU是一种修复dead ReLU问题的激活函数,在深度学习中常用于解决梯度消失的情况。它通过引入一个很小的斜率来保留负轴的信息,并在正轴上保持ReLU函数的性质。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Keras 中Leaky ReLU等高级激活函数的用法](https://download.csdn.net/download/weixin_38729685/12850036)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [AI人工智能学习之激活函数](https://blog.csdn.net/li_gf/article/details/127399179)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [激活函数ReluleakyRelu](https://blog.csdn.net/sinat_33027857/article/details/80192789)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值