具有更新的Theano功能产生NAN输出

时间:2016-10-27 08:42:36

标签: theano nan lasagne

我的代码看起来像。

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。 我认为在更新参数之前会产生输出。怎么了?

0 个答案:

没有答案