我的代码看起来像。
output = lasagne.layers.get_output(output_layer)
loss = function(output) * target
loss = -(loss.sum())
params = lasagne.layers.get_all_params(output_layer)
updates = lasagne.updates.sgd(loss,params,learning_rate=0.00001)
train_fn = theano.function([input,target], loss, updates=updates,allow_input_downcast=True)
validate_fn = theano.function([input,target], loss, allow_input_downcast=True)
此处outputlayer是CNN网络,功能定义如下:
def function(X):
squared_euclidean_distances = (X ** 2).sum(1).reshape((X.shape[0], 1)) + (X ** 2).sum(1).reshape((1, X.shape[0])) - 2 * X.dot(X.T)
dist = 1/(1+squared_euclidean_distances)
Pij = (dist) / (dist.sum(0))
return Pij
target是一个稀疏矩阵,如果outputlayer(i)和outputlayer(j)属于同一个类,则target(i,j)= 1,否则target(i,j)= 0
在挖掘代码时,我发现错误来自CNN网络中的转换层,由函数 true_div 引发。
显然,train_fn和validate_fn的唯一区别是updates参数。 但是,我使用相同的虚拟输入打印train_fn和validate_fn的输出。 validate_fn的输出是有意义的,但train_fn输出是NAN。 我认为在更新参数之前会产生输出。怎么了?