tensorflow中梯度下降算法与Michael Nielsen实现的比较

tensorflow中梯度下降算法与Michael Nielsen实现的比较,tensorflow,gradient-descent,Tensorflow,Gradient Descent,首先,我将概述我的问题。我有两种设置: 1) 基于tensorflow的网络 2) 一个基于迈克尔·尼尔森书中代码的网络 两个网完全相等。他们都有 3个隐藏层30个神经元 2个输入神经元,1个输出神经元 所有激活都是乙状结肠 随机梯度下降算法作为eta=3.0的学习算法 二次成本函数:成本函数=tf.标量(1.0/(N.训练集*2.0),tf.减少总和(tf.平方差(y,y))) 批量大小为10 权重初始化:连接lth和l+1层的权重初始化为sigma=1/sqrt(N_l),其中N_l是lt

首先,我将概述我的问题。我有两种设置:

1) 基于tensorflow的网络

2) 一个基于迈克尔·尼尔森书中代码的网络

两个网完全相等。他们都有

  • 3个隐藏层30个神经元
  • 2个输入神经元,1个输出神经元
  • 所有激活都是乙状结肠
  • 随机梯度下降算法作为eta=3.0的学习算法
  • 二次成本函数:成本函数=tf.标量(1.0/(N.训练集*2.0),tf.减少总和(tf.平方差(y,y)))
  • 批量大小为10
  • 权重初始化:连接lth和l+1层的权重初始化为sigma=1/sqrt(N_l),其中N_l是lth层中的神经元数量
我的问题是,tensorflow的结果非常糟糕(比我使用Nielsen代码得到的结果差10倍)。 所以在我发布我的完整代码之前:有人知道tensorflow随机梯度下降算法中有一个bug吗?(或者有人知道如何定义tensorflow中Stocharstic梯度下降的学习率吗?我在api中找不到任何东西)

以下是我的tensorflow网络代码: 回归系数

导入读取数据
将matplotlib.pyplot作为plt导入
将numpy作为np导入
从随机导入randint
随机输入
从根目录\u numpy导入填充\u hist
从根导入TCanvas、TH2F、TText、TF1、TH1D
导入根
导入tensorflow作为tf
输入数学
# # # # # # ##
#读入数据#
#            #
函数_输出=真#对y应用一个可逆函数,并使用修改后的输出y#u mod进行训练!直到现在,我们才知道这个函数只是一个规范化。
函数_输入=真#
完整集=读取数据。读取数据集(“/TH2D\U A00\U TB10.根”,“LHCChi2\U CMSSM\U NOBS161\U A00\U TB10”,“完整集”,功能输入,功能输出)
N_full_set=full_set.get_N()
N\u验证\u集=10000
N_训练集=N_完整集-(N_验证集)
满=范围(0,N全套)
随机。随机(完全)
训练子集=完整[:N_训练集]#训练集索引
验证子集=完整[N_训练集:N_训练集+N_验证集]#验证集索引
training_set=readData.read_data_set(“./TH2D_A00_TB10.root”,“LHCChi2_CMSSM_nobs161_A00_TB10”,“training_set”,
功能输入,功能输出,完整集=完整集,子集=训练子集)
验证集=读取数据。读取数据集(“./TH2D\U A00\U TB10.root”,“LHCChi2\U CMSSM\U NOBS161\U A00\U TB10”,“验证集”,
函数\输入,函数\输出,完整\集=完整\集,子集=验证\子集)
#查看完整数据集、培训数据集和验证数据集。可以使用x_mod()和y_mod()成员函数访问修改后的成员(在本例中是标准化的)
#标准化数据(输入和输出)将用于训练网络
打印“完整数据集”:
打印“x(输入)”
打印全套。获取
打印“y(输出)”
打印全套。获取
打印“x_mod”
打印全套。获取
打印“y_mod”
打印全套。获取您的mod()
打印“----------------------”
打印“培训数据集”:
打印“x(输入)”
打印训练集。获取
打印“y(输出)”
打印训练集。获取()
打印“x_mod”
打印训练集。获取
打印“y_mod”
打印训练集。获取你的mod()
打印“----------------------”
打印“评估数据集”:
打印“x(输入)”
打印验证\u集。获取\u x()
打印“y(输出)”
打印验证集。获取
打印“x_mod”
打印验证\u集。获取\u x\u mod()
打印“y_mod”
打印验证\u集。获取\u y\u mod()
打印“----------------------”
# # # # # # # # # # # ## 
#建立网络#
#                      #
N_时代=20
学习率=3.0
批量大小=10
N1=2#等于N_输入
N2=30
N3=30
N4=30
N5=1
N_in=N1
N_out=N5
#直接计算一批中所有元素的所有内容
“”“示例:N_in=2,N_out=3,mini_batch_size=5,激活函数=线性。在输出矩阵gibt es 5Zeilen中,jede fuer ein mini batch。jede Zeile hat 3 Spalten fuer ein ein输出神经元jeweils
W2
[[-0.31917086 -0.03908769  0.5792625 ]
[ 1.34563279  0.03904691  0.39674851]]
b2
[ 0.40960133 -0.5495823  -0.97048181]
x_in
[[  23.2       12.2    ]
[   0.         1.1    ]
[   2.3        3.3    ]
[  23.22222   24.44444]
[ 333.       444.     ]]
y=x_英寸*W2+b2
[[   9.42155647   -0.98004436   17.30874062]
[   1.88979745   -0.50663072   -0.53405845]
[   4.1160965    -0.51062918    1.67109203]
[  25.8909874    -0.50280523   22.17957497]
[ 491.5866394     3.77104688  368.08026123]]
他是克劳尔,在2号德劳费尔特·威尔德中的矩阵x_中的b2。
W2是一个矩阵的变换器,它的定义是。
"""
x=tf.placeholder(tf.float32,[None,N1])#不要使用shape=(batch_size,N1)参数,因为我们需要为不同的批大小使用这个参数
W2=tf.Variable(tf.random_normal([N1,N2],mean=0.0,stddev=1.0/math.sqrt(N1*1.0))#用1/sqrt(输入神经元的权重数/之前层中的神经元数)初始化一个神经元的权重
b2=tf.变量(tf.随机_正态([N2]))
a2=tf.sigmoid(tf.matmul(x,W2)+b2)#x=a1
W3=tf.变量(tf.随机_正态([N2,N3],平均值=0.0,标准差=1.0/数学sqrt(N2*1.0)))
b3=tf.变量(tf.随机_正态([N3]))
a3=tf.sigmoid(tf.matmul(a2,W3)+b3)
W4=tf.变量(tf.随机_正态([N3,N4],均值=0.0,标准差=1.0/数学sqrt(N3*1.0)))
b4=tf.变量(tf.随机_正常([N4]))
a4=tf.sigmoid(tf.matmul(a3,W4)+b4)
W5=tf.变量(tf.随机_正态([N4,N5],均值=0.0,标准差=1.0/数学sqrt(N4*1.0)))
b5=tf.变量(tf.随机_正态([N5]))
y=tf.sigmoid(tf.matmul(a4,W5)+b5)
y=tf.placeholder(tf.float32,[None,N_out])#,shape=(None,N_out)
# # # # # # # # # # # # # #
#初始化和培训#
#                         #
成本函数=tf.标量(1.0/(N.训练集*2.0),tf.减少和(tf.平方差(y,y)))
错误\u至\u所需\u输出=y-y_
abs\u错误\u至\u所需_