tensorflow实例(6)--机器学习中学习率的实验

曾经在  机器学习(1)--神经网络初探  详细介绍了神经网络基本的算法
同时在  tensorflow实例(2)--机器学习初试 篇文章中用tensorflow实现上述的神经网络算法
但这篇文章只能支持三个神经元(weight),4个神经元时而发生计算不出的,5个神经元算出来的完全不知道是什么东东

其实这些是受到学习率与学习次数的影响,真正有影响的就是学习率,学习率过大,最后往往无法收敛,

学习次数仅仅只是最后精度问题,

这篇文章的目的是通过对tensorflow实现神经网络后代码简单修改后,对这两神经元的实验,并得出结论

当神经元越多时,我们的学习率应该越小,同时学习次数应该增加

import tensorflow as tf
import numpy as np

#带有后缀_data的变量是简单虚拟出来的数据,相当于实际后的样本数据,
#不含后缀_data的变量就是我们建模时的变量,也就是我们最后的求解
def learningRateTest(k,learningRate,trainTimes,printStep):
    '''参数说明:
            k   : 要设置的神经元数量
    learningRate: 学习率
    trainTimes  : 要训练的次数
    printStep   : 与计算无关,用处是每隔几次的训练显示一次训练结果
    '''
    #构建虚拟数据
    weight_data=np.round(np.random.rand(k),2).astype(np.float64)
    b_data=np.round(np.random.rand(1),2).astype(np.float64)
    x_data=np.random.rand(100,k).astype(np.float64)
    y_data=np.sum(x_data*weight_data,axis=1)+b_data


    #构建tensorflow模型
    weight=tf.Variable(tf.random_uniform([k],-1,1))
    b=tf.Variable(tf.random_uniform([1],-1,1))
    y=tf.reduce_sum(x_data*weight,axis=1)+b

    loss=tf.reduce_mean(tf.square(y-y_data))
    optimizer=tf.train.GradientDescentOptimizer(learningRate)#这就是我们这里要实验的主要对象
    train=optimizer.minimize(loss)

    #开始训练
    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())
        for i in range(trainTimes):
            sess.run(train)
            if printStep >0 and i%printStep==0 :
                print(i,sess.run(weight),sess.run(b))
        weight=np.round(sess.run(weight),2) # 对最后的结果取四舍五入两位小数,和初始的weight_data一致
        b=np.round(sess.run(b),2)

    #显示出相关的训练与结果信息
    strPrint=""
    print("-"*60)
    print("样本神经元:weight:"+str(weight_data)+"   b:"+str(b_data))
    for i in range(k):
        strPrint += ("" if strPrint=="" else " + " ) + str(x_data[0][i]) + " * " + str(weight_data[i])
    strPrint += " + " + str(b_data[0]) + " = " + str(y_data[0])
    print("生成的样本第一条数据为:"+strPrint)
    print("-"*60)
    print("求解神经元(取两位):weight:"+str(weight)+"   b:"+str(b))
    print("-"*60)

    #判断正确性
    isRight=round(b_data[0]-b_data[0],2)==0 #使用round不直接使用==的原因在于,不论怎么round后面总有些精度的问题
    for i in range(k):

        isRight=isRight and round(weight[i]-weight_data[i],2)==0
    print("结果正确性:"+("正确" if isRight else "错误"))

learningRateTest(3,0.5,200,40)  #正确

learningRateTest(5,0.5,200,40)  #错误,增加weight神经元时,同时我们会看到weight会变到非常的大,如-5.9189063e+22 ...

learningRateTest(5,0.4,200,40)  #正确,降低学习率时又正确了

learningRateTest(9,0.4,200,40)  #错误,增加weight神经元时,同时我们会看到weight值为nan 出现nan的原因是数值非常非常大了

learningRateTest(9,0.2,200,40)  #错误,降低学习率了,但是还是错误,但仔细看看数据,发现虽然错误,但没有出现nan而且值差距不是非常大

learningRateTest(9,0.2,500,100)  #正确,增加学习次数后,又正确了,

#因此我们得出结论,当神经元越多时,我们的学习率应该越小,同时学习次数应该增加,


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值