2016-03-30 8 views
3

非常に遅いです。ここに私のコードだ:シンプルなラザニアのネットワーク出力は、私はラザニアと非常に簡単なニューラルネットワークを訓練しようとしている

#!/usr/bin/env python 

import numpy as np 
import theano 
import theano.tensor as T 
import lasagne 
import time 

def build_mlp(input_var=None): 
    l_in = lasagne.layers.InputLayer(shape=(None, 36), input_var=input_var) 

    l_out = lasagne.layers.DenseLayer(
     l_in, 
     num_units=1) 

    return l_out 

if __name__ == '__main__': 
    start_time = time.time() 

    input_var = T.matrix('inputs') 
    target_var = T.fvector('targets') 
    network = build_mlp(input_var) 
    prediction = lasagne.layers.get_output(network)[:, 0] 
    loss = lasagne.objectives.aggregate(lasagne.objectives.squared_error(prediction, target_var), mode="sum") 
    params = lasagne.layers.get_all_params(network, trainable=True) 
    updates = lasagne.updates.nesterov_momentum(loss, params, learning_rate=0.01, momentum=0.01) 
    train_fn = theano.function([input_var, target_var], loss, updates=updates, allow_input_downcast=True) 

    features = [-0.7275278, -1.2492378, -1.1284761, -1.5771232, -1.6482532, 0.57888401,\ 
    -0.66000223, 0.89886779, -0.61547941, 1.2937579, -0.74761862, -1.4564357, 1.4365945,\ 
    -3.2745962, 1.3266684, -3.6136472, 1.5396905, -0.60452163, 1.1510054, -1.0534937,\ 
    1.0851847, -0.096269868, 0.15175876, -2.0422907, 1.6125549, -1.0562884, 2.9321988,\ 
    -1.3044566, 2.5821636, -1.2787727, 2.0813208, -0.87762129, 1.493879, -0.60782474, 0.77946049, 0.0] 

    print("Network built in " + str(time.time() - start_time) + " sec") 

    it_number = 1000 

    start_time = time.time() 
    for i in xrange(it_number): 
     val = lasagne.layers.get_output(network, features).eval()[0][0] 
    print("1K outputs: " + str(time.time() - start_time) + " sec") 

    p = params[0].eval() 

    start_time = time.time() 
    for i in xrange(it_number): 
     n = np.dot(features, p) 
    print("1K dot products: " + str(time.time() - start_time) + " sec") 

    print(val) 
    print(n) 

私はちょうどそれが私のネットワークの1K実際の予測を取得するのにかかるどのくらいの時間を確認するために(初期ランダムな重みを持つ)1K試用版をやって、まだここでネットワークを訓練ではありませんよ。 1Kドット製品と比較すると、ひどい減速です!

Network built in 8.86999106407 sec 
1K outputs: 53.0574831963 sec 
1K dot products: 0.00349998474121 sec 
0.0 
[-3.37383742] 

私の質問は、このような単純なネットワークを評価するのに時間がかかるのはなぜですか?

また、私は予測値について混乱しています。内積は、ネットワーク出力0ゼロより 小さい場合、それ以外の場合はこれらの2つの値は同じです:

Network built in 8.96299982071 sec 
1K outputs: 54.2732210159 sec 
1K dot products: 0.00287079811096 sec 
1.10120121082 
[ 1.10120121] 

私はDenseLayerがどのように機能するかについて何かが足りないのですか? https://groups.google.com/forum/#!forum/lasagne-users上のヤンSchlueterへ

答えて

2

おかげでこれに対する答えはそこにあります。

ここで私が唯一行っていない1Kは、ネットワークを通過するが、1K異なる機能をコンパイルし、一度それらのそれぞれを呼び出します。 1Kの異なる式にeval()を使用する代わりに(それぞれが異なるnumpyの配列を定数として含むために違います)、単一の予測関数をコンパイルする必要があります(train_fnと似ていますが、更新を実行する)、その1Kをループで1回呼び出す。また、解決DenseLayer約

質問:

DenseLayer整流デフォルト非線形性を含みます。整流器は、ゼロより小さいすべての出力をゼロに設定します。

すべてのラザニアの質問をはるかにGoogleグループではなく、StackOverflowの上で答えられる可能性が高いようです。 Janによると、彼らはメーリングリストにもっと集中しています。

+0

単一の予測関数をコンパイルするための更新されたコードを投稿できますか?私は同じことをしようとしています。 – nick

+0

val_fn = theano.function([input_var]、予測) –

+0

うわー。それは簡単だった。ありがとうございました! – nick

関連する問題