为什么RPROP没有更新训练准确性?

时间:2017-07-24 07:59:18

标签: python machine-learning neural-network

我的机器学习代码需要帮助。我正在尝试使用RPROP训练我的网络,并且列车准确性没有更新。

以下是代码:

import theano
from theano import *
import theano.tensor as T
from theano.ifelse import ifelse
import numpy as np
from random import random
from sklearn import datasets
from sklearn.model_selection import train_test_split
import math

    #GETTING TEST DATA
    def get_iris_data():
        """ Read the iris data set and split them into training and test sets """
        iris   = datasets.load_iris()
        data   = iris.data
        target = iris.target

        # Prepend the column of 1s for bias
        N, M  = data.shape
        all_X = np.ones((N, M + 1))
        all_X[:, 1:] = data

        # Convert into one-hot vectors
        num_labels = len(np.unique(target))

        all_Y = np.eye(num_labels)[target]  # One liner trick!
        return train_test_split(all_X, all_Y, test_size=0.33)

    #SETTING INITIAL WEIGHT VALUES
    def init_weights(shape):
        """ Weight initialization """
        weights = np.asarray(np.random.randn(*shape) * 0.01, dtype=theano.config.floatX)
        return theano.shared(weights)

    def feedforward(X, w1, w2):
        hidden = T.nnet.sigmoid(T.dot(X,w1))
        out = T.nnet.softmax(T.dot(hidden,w2))
        return out

    def rprop(cost, params, learning_rate):
        """ Back-propagation """
        #RPROP Variables
        updates = []
        gradients = T.grad(cost = cost, wrt = params)

        #Default Values
        prevparams = params
        deltaMax = 50.
        deltaMin = math.exp(-6)
        deltas = -0.1 * numpy.ones(len(params))
        prevgradients = numpy.zeros(len(params))
        npos = 1.2
        nneg = 0.5

        #All Values

        allvalues = zip(params, prevparams, gradients, deltas, prevgradients)

        for param, prevparam, gradient, delta, prevgradient in allvalues:
            polarity = T.sgn(gradient * prevgradient)
            prevdelta = delta

            if T.gt(polarity, 0):
                delta = T.minimum(prevdelta * npos, deltaMax)
                change = - T.sgn(gradient) * delta
                prevgradient = gradient

            elif T.lt(polarity,0):
                delta = T.maximu(prevdelta * nneg, deltaMin)
                prevgradient = 0
                change = -prevgradient

            else:
                change = - T.sign(gradient) * delta
                prevgradient = gradient

            updates.append((param, param - change * learning_rate))

        return updates

    #MAIN FUNCTION
    def main():

        #Initialization of Variables and data
        train_X, test_X, train_Y, test_Y = get_iris_data()
        learning_rate = 0.01
        X = T.fmatrix()
        Y = T.fmatrix() 

        #Set ANN Network Size
        in_size = train_X.shape[1]
        hid_size = 256
        out_size = train_Y.shape[1]

        #Set weights inbetween
        w1 = init_weights((in_size, hid_size))
        w2 = init_weights((hid_size, out_size))

        #Forward Propagation Function for Neuron activation and transfer funtion
        yHat = feedforward(X,w1,w2)

        #Backpropagation for correction
        cost = T.mean(T.nnet.categorical_crossentropy(yHat, Y))
        params = [w1,w2]
        updates = rprop(cost, params, learning_rate)

        # Train and predict
        train   = theano.function(inputs=[X, Y], outputs=cost, updates=updates, allow_input_downcast=True)
        pred_Y  = T.argmax(yHat, axis=1)
        predict = theano.function(inputs=[X], outputs=pred_Y, allow_input_downcast=True)

        # Run SGD

        for iter in range(2000):
            for i in range(len(train_X)):
                train(train_X[i: i + 1], train_Y[i: i + 1])
            train_accuracy = np.mean(np.argmax(train_Y, axis=1) == predict(train_X))
            test_accuracy  = np.mean(np.argmax(test_Y, axis=1) == predict(test_X))
            print("Iteration = %d, train accuracy = %.2f%%, test accuracy = %.2f%%"
                  % (iter + 1, 100 * train_accuracy, 100 * test_accuracy))

    if __name__ == '__main__':
        main()

0 个答案:

没有答案