曾经在
机器学习(1)--神经网络初探 详细介绍了神经网络基本的算法
同时在 tensorflow实例(2)--机器学习初试 篇文章中用tensorflow实现上述的神经网络算法
但这篇文章只能支持三个神经元(weight),4个神经元时而发生计算不出的,5个神经元算出来的完全不知道是什么东东
同时在 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) #正确,增加学习次数后,又正确了,
#因此我们得出结论,当神经元越多时,我们的学习率应该越小,同时学习次数应该增加,