Exemplo n.º 1
0
class MLP(object):
    def __init__(self, input, label, n_in, n_hidden, n_out, rng=None):

        self.x = input
        self.y = label

        if rng is None:
            rng = numpy.random.RandomState(1234)

        # construct hidden_layer (tanh or sigmoid so far)
        self.hidden_layer = HiddenLayer(input=self.x,
                                        n_in=n_in,
                                        n_out=n_hidden,
                                        rng=rng,
                                        activation=numpy.tanh)

        # construct log_layer (softmax)
        self.log_layer = LogisticRegression(input=self.hidden_layer.output,
                                            label=self.y,
                                            n_in=n_hidden,
                                            n_out=n_out)

    def train(self):
        layer_input = self.hidden_layer.forward()
        self.log_layer.train(input=layer_input)
        self.hidden_layer.backward(prev_layer=self.log_layer)

    def predict(self, x):
        x = self.hidden_layer.output(x)
        return self.log_layer.predict(x)
Exemplo n.º 2
0
class MLP(object):
    def __init__(self, input, label, n_in, n_hidden, n_out, rng=None):
        self.x = input
        self.y = label

        if rng is None:
            rng = np.random.RandomState(1234)

        # construct hidden layer
        self.hidden_layer = HiddenLayer(input=self.x,
                                        n_in=n_in,
                                        n_out=n_hidden,
                                        rng=rng,
                                        activation=tanh)

        # construct log_layer

        self.log_layer = LR(input=self.hidden_layer.output,
                            label=self.y,
                            n_in=n_hidden,
                            n_out=n_out)

    def train(self):
        # forward hidden_layer
        layer_input = self.hidden_layer.forward()

        # forward & backward log_layer
        self.log_layer.train(input=layer_input)

        # backward hidden_layer
        self.hidden_layer.backward(prev_layer=self.log_layer)

    def predict(self, x):
        x = self.hidden_layer.output(input=x)
        return self.log_layer.predict(x)
Exemplo n.º 3
0
class MLP(object):
    def __init__(self, input, label, n_in, n_hidden, n_out, rng=None):

        self.x = input
        self.y = label

        if rng is None:
            rng = numpy.random.RandomState(1234)

        # construct hidden_layer (tanh or sigmoid so far)
        self.hidden_layer = HiddenLayer(input=self.x,
                                        n_in=n_in,
                                        n_out=n_hidden,
                                        rng=rng,
                                        activation=numpy.tanh)

        # construct log_layer (softmax)
        self.log_layer = LogisticRegression(input=self.hidden_layer.output,
                                            label=self.y,
                                            n_in=n_hidden,
                                            n_out=n_out)

    def train(self):
        layer_input = self.hidden_layer.forward()
        self.log_layer.train(input=layer_input)
        self.hidden_layer.backward(prev_layer=self.log_layer)
        

    def predict(self, x):
        x = self.hidden_layer.output(x)
        return self.log_layer.predict(x)
Exemplo n.º 4
0
class CNN(object):
    def __init__(self,
                 N,
                 label,
                 n_hidden,
                 n_out,
                 image_size,
                 channel,
                 n_kernels,
                 kernel_sizes,
                 pool_sizes,
                 rng=None,
                 activation=ReLU):

        if rng is None:
            rng = numpy.random.RandomState(1234)

        self.N = N
        self.n_hidden = n_hidden

        self.n_kernels = n_kernels

        self.pool_sizes = pool_sizes

        self.conv_layers = []
        self.conv_sizes = []

        # construct 1st conv_layer
        conv_layer0 = ConvPoolLayer(N, image_size, channel, n_kernels[0],
                                    kernel_sizes[0], pool_sizes[0], rng,
                                    activation)
        self.conv_layers.append(conv_layer0)

        conv_size = [
            (image_size[0] - kernel_sizes[0][0] + 1) / pool_sizes[0][0],
            (image_size[1] - kernel_sizes[0][1] + 1) / pool_sizes[0][1]
        ]
        self.conv_sizes.append(conv_size)

        # construct 2nd conv_layer
        conv_layer1 = ConvPoolLayer(N, conv_size, n_kernels[0], n_kernels[1],
                                    kernel_sizes[1], pool_sizes[1], rng,
                                    activation)
        self.conv_layers.append(conv_layer1)

        conv_size = [
            (conv_size[0] - kernel_sizes[1][0] + 1) / pool_sizes[1][0],
            (conv_size[1] - kernel_sizes[1][0] + 1) / pool_sizes[1][1]
        ]
        self.conv_sizes.append(conv_size)

        # construct hidden_layer
        self.hidden_layer = HiddenLayer(
            None, n_kernels[-1] * conv_size[0] * conv_size[1], n_hidden, None,
            None, rng, activation)

        # construct log_layer
        self.log_layer = LogisticRegression(None, label, n_hidden, n_out)

    # def train(self, epochs, learning_rate, input=None):
    def train(self, epochs, learning_rate, input, test_input=None):

        for epoch in xrange(epochs):

            if (epoch + 1) % 5 == 0:
                print 'iter = %d/%d' % (epoch + 1, epochs)
                print

                if (test_input != None):
                    print '------------------'
                    print 'TEST PROCESSING...'

                    print self.predict(test_input)
                    print '------------------'
                print

            # forward first conv layer
            pooled_X = self.conv_layers[0].forward(input=input)

            # forward second conv layer
            pooled_X = self.conv_layers[1].forward(input=pooled_X)

            # flatten input
            layer_input = self.flatten(pooled_X)

            # forward hidden layer
            layer_input = self.hidden_layer.forward(input=layer_input)

            # forward & backward logistic layer
            self.log_layer.train(lr=learning_rate, input=layer_input)

            # backward hidden layer
            self.hidden_layer.backward(prev_layer=self.log_layer,
                                       lr=learning_rate)

            flatten_size = self.n_kernels[-1] * self.conv_sizes[-1][
                0] * self.conv_sizes[-1][1]
            delta_flatten = numpy.zeros((self.N, flatten_size))

            for n in xrange(self.N):
                for i in xrange(flatten_size):

                    for j in xrange(self.n_hidden):
                        delta_flatten[n][i] += self.hidden_layer.W[i][
                            j] * self.hidden_layer.d_y[n][j]

            # unflatten delta
            delta = numpy.zeros(
                (len(delta_flatten), self.n_kernels[-1],
                 self.conv_sizes[-1][0], self.conv_sizes[-1][1]))

            for n in xrange(len(delta)):
                index = 0
                for k in xrange(self.n_kernels[-1]):
                    for i in xrange(self.conv_sizes[-1][0]):
                        for j in xrange(self.conv_sizes[-1][1]):
                            delta[n][k][i][j] = delta_flatten[n][index]
                            index += 1

            # backward second conv layer
            delta = self.conv_layers[1].backward(delta, self.conv_sizes[1],
                                                 learning_rate)

            # backward first conv layer
            self.conv_layers[0].backward(delta, self.conv_sizes[0],
                                         learning_rate)

    def flatten(self, input):

        flatten_size = self.n_kernels[-1] * self.conv_sizes[-1][
            0] * self.conv_sizes[-1][1]
        flattened_input = numpy.zeros((len(input), flatten_size))

        for n in xrange(len(flattened_input)):
            index = 0

            for k in xrange(self.n_kernels[-1]):
                for i in xrange(self.conv_sizes[-1][0]):
                    for j in xrange(self.conv_sizes[-1][1]):
                        flattened_input[n][index] = input[n][k][i][j]
                        index += 1

        # print flattened_input

        return flattened_input

    def predict(self, x):

        pooled_X = self.conv_layers[0].forward(input=x)

        pooled_X = self.conv_layers[1].forward(input=pooled_X)

        layer_input = self.flatten(pooled_X)

        x = self.hidden_layer.output(input=layer_input)

        return self.log_layer.predict(x)