Python Numpy神经网络成本计算:首次运行后结果发生变化

Python Numpy神经网络成本计算:首次运行后结果发生变化,python,numpy,machine-learning,neural-network,data-science,Python,Numpy,Machine Learning,Neural Network,Data Science,在python3.7中,我的神经网络成本计算有问题。 当我第一次运行compute_cost\u nn时,我得到了正确的成本0.28762916516131887,但在所有后续运行中,成本都变为0.3262751145707298,这非常烦人。 问题似乎来自我的params;如果我每次在计算成本之前重新加载它们,效果会很好。但是,如果不再次运行整个脚本,我无法使用不同的参数重新运行函数并获得正确的成本 神经网络有400个输入单元,1个隐藏层(含25个单元)和10个输出单元 以下是输入: data

在python3.7中,我的神经网络成本计算有问题。
当我第一次运行
compute_cost\u nn
时,我得到了正确的成本
0.28762916516131887
,但在所有后续运行中,成本都变为
0.3262751145707298
,这非常烦人。
问题似乎来自我的
params
;如果我每次在计算成本之前重新加载它们,效果会很好。但是,如果不再次运行整个脚本,我无法使用不同的参数重新运行函数并获得正确的成本

神经网络有400个输入单元,1个隐藏层(含25个单元)和10个输出单元

以下是输入:

data=loadmat(“ex4data1.mat”)
y=数据['y']
X=数据['X']
X=np.c_uu[np.one((X.shape[0],1)),X]
重量=装载垫(“ex4weights.mat”)
θ1=权重['θ1']
θ2=权重['θ2']
params=np.r_[Theta1.ravel(),Theta2.ravel()]
矩阵形状:

>> X: (5000, 401)
>> y: (5000, 1)
>> Theta1: (25, 401)
>> Theta2: (10, 26)
>> params: (10285,)
成本函数:

def compute_cost_nn(参数,
输入\u层\u大小,
隐藏层大小,
数字标签,
十、 y,lambda_):
m=len(y)
#从展开的参数中检索θ1和θ2
t1\u项=(输入\u层\u大小+1)*隐藏\u层\u大小
θ1=参数[0:t1_项]。重新形状(
隐藏层大小,
输入\u层\u大小+1
)
θ2=参数[t1_项:]。重塑(
数字标签,
隐藏层大小+1
)
#使用标签变换y向量列(5000x1)
#转换为5000x10矩阵,带0和1
y_mat=np.eye(num_标签)[(y-1.ravel(),:]
#正向传播
a1=X
z2=a1@Theta1.T
a2=乙状结肠(z2)
a2=np.c_U2;[np.ones((m,1)),a2]
z3=a2@Theta2.T
a3=乙状结肠(z3)
#计算成本
func=y_mat.T@np.log(a3)+(1-y_mat.T@np.log(1-a3)
成本=函数跟踪()
t1reg=(Theta1[:,1::].T@Theta1[:,1:]).trace()
t2reg=(θ2[:,1::].T@θ2[:,1:]).trace()
成本=-1/m*成本+λ/(2*m)*(t1reg+t2reg)
#梯度(不包括θ0)
d3=a3-y_材料
d2=(d3@Theta2[:,1:)*s形梯度(z2)#5000*25
Delta1=d2.T@a1
Delta2=d3.T@a2
θ1_梯度=1/m*Delta1
θ2_梯度=1/m*Delta2
#梯度正则化
θ1[:,1]=0
θ2[:,1]=0
θ1_梯度=θ1_梯度+λ/m*θ1
θ2_梯度=θ2_梯度+λ/m*θ2
返回成本,θ1梯度,θ2梯度
我通过以下方式获得成本:

compute_cost_nn(参数400,25,10,X,y,0)[0]
第一次运行:
0.28762916516131887

然后:
0.3262751145707298


非常感谢任何提示:)

我没有使用虚拟数据测试您的代码,但是快速浏览一下,您似乎是从
.mat
(MATLAB)文件导入权重。MATLAB以列主顺序(又称Fortran风格的顺序)存储数组元素,而Python以行主顺序(C风格的顺序)存储数组元素

因此,当您第一次
ravel()
权重时,Numpy将采用C样式的顺序展平数组。 当您在函数中重塑散开的权重时,情况也是如此。 您可以将顺序作为参数添加到任一函数中,以便:

params=np.r_[Theta1.ravel(order='F'),Theta2.ravel('F')]
应该解决你的问题

如果您从未见过行和列的主要顺序,可以阅读一下:

哇,Python中有一个新操作符!我想晚会迟到了。