return data
    images = normalize_data(images)

    patch_width = 8
    n_filters = 25

    n_samples, n_rows, n_cols = images.shape
    n_features = n_rows * n_cols
    patches = [extract_patches_2d(images[i], (patch_width, patch_width),
                                  max_patches=1000, random_state=i)
            for i in range(n_samples)]
    patches = numpy.array(patches).reshape(-1, patch_width * patch_width)
    print("Dataset consists of %d samples" % n_samples)

    estimator = SparseAutoEncoder(n_filters=n_filters,
                                  lmbd=0.0001, beta=3, sparsity_param=0.01,
                                  maxfun=500, verbose=True)
    estimator.fit(patches)

    pylab.figure(1)
    for i in range(estimator.W1_.shape[0]):
        rows = max(int(numpy.sqrt(n_filters)), 2)
        cols = max(int(numpy.sqrt(n_filters)), 2)
        pylab.subplot(rows, cols, i + 1)
        pylab.imshow(estimator.W1_[i].reshape(patch_width, patch_width),
                     cmap=pylab.cm.gray, interpolation="nearest")
        pylab.xticks(())
        pylab.yticks(())

    pylab.figure(2)
    for i in range(estimator.W2_.shape[1]):

if __name__ == "__main__":
    numpy.random.seed(0)

    train_images, T = load_mnist("training", 60000)
    train_images -= train_images.mean(axis=0)
    test_images, T2 = load_mnist("testing", 10000)
    test_images -= train_images.mean(axis=0)
    print "Dataset loaded"

    train_filter = train_images[:10000]
    train_classifier = train_images
    label_classifier = T
    n_filters = 196
    estimator = SparseAutoEncoder(n_filters=n_filters, lmbd=3e-3, beta=3, sparsity_param=0.1, maxfun=400, verbose=True)
    estimator.fit(train_filter)
    X = estimator.predict(train_classifier)
    X2 = estimator.predict(test_images)
    X_mean = X.mean(axis=0)
    X_std = X.std(axis=0) + 1e-8
    X = scale_features(X, X_mean, X_std)
    X2 = scale_features(X2, X_mean, X_std)
    print "Transformed datasets"

    test_classifier(X, label_classifier, X2, T2)

    pylab.figure()
    pylab.subplots_adjust(wspace=0.0, hspace=0.0)
    for i in range(estimator.W1_.shape[0]):
        rows = int(numpy.sqrt(n_filters))