私は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)
これは私にそのグラフを与えます私はかなりこのネットワークがダウンして基本的にゼロに損失を得ることができる必要がありますよ
:次のようになります。私はどんな助けや問題についても感謝しています:)
EDIT:問題を簡素化するために削除されたレイヤーと隠れたレイヤーが削除されました。
あなたはオーバーフィットと戦うためのドロップアウトを使用しています。あなたが望むものとは反対に見えます。 –
良いスポットですが、一度ドロップアウトを削除しても問題は解決しません。私は隠れたレイヤーを削除してしまったので、ネットワークは1セットのウエイトだけを学習しなければならないが、まだ何もない。それは私の損失機能と関係がありますか? – TinyDancer