2016-07-23 3 views
1

私はTheano/Lasagneの基本神経ネットワークを使用して画像の顔のキーポイントを特定しようとしています。 (私はトレーニングセットの最初のイメージを撮ったばかりです)。画像は96x96ピクセルで、学習する必要のある30の重要な点(出力)がありますが、それは失敗します。これはTheano /ラザニアを使用しての私の最初の試みですので、私は、私はちょうど何かを明らかに見逃している確信しているが、私は私が間違ってやったものを見ることができません。回帰のあるTheano/Lasagne基本神経ネットワークは、サイズ1のデータセットをオーバーフィットしません。

import sys 
import os 
import time 

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

import lasagne 
import pickle 

import matplotlib.pyplot as plt 

def load_data(): 
    with open('FKD.pickle', 'rb') as f: 
     save = pickle.load(f) 
     trainDataset = save['trainDataset'] # (5000, 1, 96, 96) np.ndarray of pixel values [-1,1] 
     trainLabels = save['trainLabels'] # (5000, 30) np.ndarray of target values [-1,1] 
     del save # Hint to help garbage collection free up memory 

     # Overtrain on dataset of 1 
     trainDataset = trainDataset[:1] 
     trainLabels = trainLabels[:1] 

    return trainDataset, trainLabels 


def build_mlp(input_var=None): 

    relu = lasagne.nonlinearities.rectify 
    softmax = lasagne.nonlinearities.softmax 

    network = lasagne.layers.InputLayer(shape=(None, 1, imageSize, imageSize), input_var=input_var) 
    network = lasagne.layers.DenseLayer(network, num_units=numLabels, nonlinearity=softmax) 

    return network 

def main(num_epochs=500, minibatch_size=500): 

    # Load the dataset 
    print "Loading data..." 
    X_train, y_train = load_data() 

    # Prepare Theano variables for inputs and targets 
    input_var = T.tensor4('inputs') 
    target_var = T.matrix('targets') 

    # Create neural network model 
    network = build_mlp(input_var) 

    # Create a loss expression for training, the mean squared error (MSE) 
    prediction = lasagne.layers.get_output(network) 
    loss = lasagne.objectives.squared_error(prediction, target_var) 
    loss = loss.mean() 

    # Create update expressions for training 
    params = lasagne.layers.get_all_params(network, trainable=True) 
    updates = lasagne.updates.nesterov_momentum(loss, params, learning_rate=0.01, momentum=0.9) 

    # Compile a function performing a training step on a mini-batch 
    train_fn = theano.function([input_var, target_var], loss, updates=updates) 

    # Collect points for final plot 
    train_err_plot = [] 

    # Finally, launch the training loop. 
    print "Starting training..." 

    # We iterate over epochs: 
    for epoch in range(num_epochs): 
     # In each epoch, we do a full pass over the training data: 
     start_time = time.time() 
     train_err = train_fn(X_train, y_train) 

     # Then we print the results for this epoch: 
     print "Epoch %s of %s took %.3fs" % (epoch+1, num_epochs, time.time()-start_time) 
     print " training loss:\t\t%s" % train_err 

     # Save accuracy to show later 
     train_err_plot.append(train_err) 

    # Show plot 
    plt.plot(train_err_plot) 
    plt.title('Graph') 
    plt.xlabel('Epochs') 
    plt.ylabel('Training loss') 
    plt.tight_layout() 
    plt.show() 

imageSize = 96 
numLabels = 30 

if __name__ == '__main__': 
    main(minibatch_size=1) 

これは私にそのグラフを与えます私はかなりこのネットワークがダウンして基本的にゼロに損失を得ることができる必要がありますよ

enter image description here

:次のようになります。私はどんな助けや問題についても感謝しています:)

EDIT:問題を簡素化するために削除されたレイヤーと隠れたレイヤーが削除されました。

+0

あなたはオーバーフィットと戦うためのドロップアウトを使用しています。あなたが望むものとは反対に見えます。 –

+0

良いスポットですが、一度ドロップアウトを削除しても問題は解決しません。私は隠れたレイヤーを削除してしまったので、ネットワークは1セットのウエイトだけを学習しなければならないが、まだ何もない。それは私の損失機能と関係がありますか? – TinyDancer

答えて

1

それはIから出力ノードの機能を変更するのを忘れだろうと判明:私は塩基として使用していたコードは(分類問題のためだった

lasagne.nonlinearities.linear 

:に

lasagne.nonlinearities.softmax 

画像のどの桁が位置しているのかを見出そうとするなど、回帰の問題にネットワークを使用していたのに対し、画像はどの桁に表示されているかを調べるなど)。分類問題にはいくつかの有用な出力関数がありますが、softmaxがその1つですが、回帰問題では線形出力関数が必要です。

これは将来的に他の誰かに役立つことを願っています:)

+0

回帰問題に線形出力が必要なのはなぜですか?回帰は確率分布でも機能するはずです。 – Maximilian

関連する問題