【发布时间】:2015-06-25 04:19:00
【问题描述】:
我在将经过训练的神经网络的权重保存在文本文件中时遇到了问题。 这是我的代码
def nNetwork(trainingData,filename):
lamda = 1
input_layer = 1200
output_layer = 10
hidden_layer = 25
X=trainingData[0]
y=trainingData[1]
theta1 = randInitializeWeights(1200,25)
theta2 = randInitializeWeights(25,10)
m,n = np.shape(X)
yk = recodeLabel(y,output_layer)
theta = np.r_[theta1.T.flatten(), theta2.T.flatten()]
X_bias = np.r_[np.ones((1,X.shape[0])), X.T]
#conjugate gradient algo
result = scipy.optimize.fmin_cg(computeCost,fprime=computeGradient,x0=theta,args=(input_layer,hidden_layer,output_layer,X,y,lamda,yk,X_bias),maxiter=100,disp=True,full_output=True )
print result[1] #min value
theta1,theta2 = paramUnroll(result[0],input_layer,hidden_layer,output_layer)
counter = 0
for i in range(m):
prediction = predict(X[i],theta1,theta2)
actual = y[i]
if(prediction == actual):
counter+=1
print str(counter *100/m) + '% accuracy'
data = {"Theta1":[theta1],
"Theta2":[theta2]}
op=open(filename,'w')
json.dump(data,op)
op.close()
def paramUnroll(params,input_layer,hidden_layer,labels):
theta1_elems = (input_layer+1)*hidden_layer
theta1_size = (input_layer+1,hidden_layer)
theta2_size = (hidden_layer+1,labels)
theta1 = params[:theta1_elems].T.reshape(theta1_size).T
theta2 = params[theta1_elems:].T.reshape(theta2_size).T
return theta1, theta2
我收到以下错误 raise TypeError(repr(o) + " is not JSON serializable")
请给出一个解决方案或任何其他方法来保存权重,以便我可以轻松地将它们加载到其他代码中。
【问题讨论】:
-
theta1 或 theta2 或两者都不是 JSON 可序列化的。它们是函数 paramUnroll 返回的对象。那么它们是什么类型的物体呢?
-
@PaulCornelius theta1 和 theta2 是 numpy 数组
-
试试
theta1.tolist()。只要记住在从文件加载写入列表后再次初始化numpy.array
标签: python numpy machine-learning neural-network