def test_zero_pad():
    np.random.seed(1)
    x = np.random.randn(4, 3, 3, 2)
    input_dim = x.shape[1:]
    conv = Convolution(input_dim=input_dim,
                       pad=2,
                       stride=2,
                       num_filters=8,
                       filter_size=2,
                       seed=1)
    x_pad = conv.zero_pad(x, 2)
    assert (x_pad.shape == (4, 7, 7, 2))
    assert (np.sum(x_pad[1, 1]) == 0)
def test_conv_step():

    np.random.seed(1)

    A_prev = np.random.randn(4, 4, 3)
    W = np.random.randn(4, 4, 3)
    b = np.random.randn(1, 1, 1)
    input_dim = A_prev.shape
    conv = Convolution(input_dim=input_dim,
                       pad=2,
                       stride=2,
                       num_filters=8,
                       filter_size=2,
                       seed=1)
    Z = conv.convolve(A_prev, W, b)
    assert (round(Z, 11) == -6.99908945068)
示例#3
0
def make_cnn(input_dim, num_of_classes):
    conv1 = Convolution(input_dim=input_dim,
                        pad=2,
                        stride=2,
                        num_filters=10,
                        filter_size=3,
                        seed=1)
    relu1 = Relu()
    maxpool1 = Maxpool(input_dim=conv1.output_dim, filter_size=2, stride=1)
    flatten = Flatten(seed=1)
    dense1 = Dense(input_dim=np.prod(maxpool1.output_dim),
                   output_dim=num_of_classes,
                   seed=1)

    layers = [conv1, relu1, maxpool1, flatten, dense1]
    return layers
def test_conv():

    np.random.seed(1)
    A_prev = np.random.randn(10, 4, 4, 3)
    W = np.random.randn(2, 2, 3, 8)
    b = np.random.randn(1, 1, 1, 8)
    input_dim = A_prev.shape[1:]
    conv = Convolution(input_dim=input_dim,
                       pad=2,
                       stride=2,
                       num_filters=8,
                       filter_size=2,
                       seed=1)
    conv.params[0] = W
    conv.params[1] = b
    Z = conv.forward(A_prev)
    target = np.empty(8)
    target[:] = [
        -0.61490741, -6.7439236, -2.55153897, 1.75698377, 3.56208902,
        0.53036437, 5.18531798, 8.75898442
    ]
    hparameters = {"pad": 2, "stride": 2}
    cache_conv = (A_prev, conv.params[0], conv.params[1], hparameters)
    target_cache_conv = np.empty(3)
    target_cache_conv = [-0.20075807, 0.18656139, 0.41005165]

    dA, grads = conv.backward(Z)
    dW = grads[0]
    db = grads[1]

    assert (round(np.mean(Z), 13) == 0.0489952035289)
    assert ((np.sum(np.around(Z[3, 2, 1], 8) != target)) == 0)
    assert ((np.sum(
        np.around(cache_conv[0][1][2][3], 8) != target_cache_conv)) == 0)

    assert (round(np.mean(dA), 11) == 1.45243777754)
    assert (round(np.mean(dW), 11) == 1.72699145831)
    assert (round(np.mean(db), 11) == 7.83923256462)
示例#5
0
    def parser(self, optim_file=None):
        self.modules = []
        # there is no explicit input layer, the first functional layer will dirctly
        # connect to the input data steam (DMA input, 16*3bits), each data is 16bits,
        # thus the data width is 3
        up_layer_data_shape = self.blobs.get('data').data.shape[1:]
        up_layer_data_width = 1
        up_layer_output_stride = 1

        layer_list = list(self._layer_names)
        for layer_name in layer_list:
            layer_cur = self.layers[layer_list.index(layer_name)]
            layer_type = layer_cur.type
            if layer_type == 'Softmax' or layer_type == 'Dropout' or layer_type == 'Input':
                print '{} layer will be skipped.'.format(layer_type)
                continue
            # get the layer information
            layer_info = self.get_layer_info(layer_name)
            if layer_info == None:
                raise Exception(
                    'Layer [%s] not found, please check the model net file.' %
                    layer_name)
            # check the layer_name,
            if layer_name != layer_info.name:
                raise Exception(
                    'Layer parse error, please check the model net file.')

            if layer_type == 'Convolution' or layer_type == 'ConvolutionRistretto':
                stride = 1 if len(
                    layer_info.convolution_param.stride
                ) == 0 else layer_info.convolution_param.stride[0]
                pad = 0 if len(layer_info.convolution_param.pad
                               ) == 0 else layer_info.convolution_param.pad[0]
                params = [self.params[layer_name][0].data, self.params[layer_name][1].data] \
                        if layer_info.convolution_param.bias_term else [self.params[layer_name][0].data]
                module_inst = Convolution(layer_name, up_layer_data_shape, up_layer_data_width, up_layer_output_stride, \
                              self.blobs[layer_info.top[0]].data.shape[1:], params, stride, pad, \
                              get_layer_cpf(layer_name, optim_file), get_layer_kpf(layer_name, optim_file), \
                              layer_info.convolution_param.group)
                if layer_type == 'ConvolutionRistretto':
                    module_inst.set_quantization(
                        layer_info.quantization_param.bw_layer_in,
                        layer_info.quantization_param.fl_layer_in,
                        layer_info.quantization_param.bw_params,
                        layer_info.quantization_param.fl_params,
                        layer_info.quantization_param.bw_layer_out,
                        layer_info.quantization_param.fl_layer_out)
            elif layer_type == 'InnerProduct' or layer_type == 'FcRistretto':
                params = [self.params[layer_name][0].data, self.params[layer_name][1].data] \
                        if layer_info.inner_product_param.bias_term else [self.params[layer_name][0].data]
                module_inst = InnerProduct(layer_name, up_layer_data_shape, up_layer_data_width, up_layer_output_stride, \
                              self.blobs[layer_info.top[0]].data.shape[1:], params, \
                              get_layer_cpf(layer_name, optim_file), get_layer_kpf(layer_name, optim_file))
                if layer_type == 'FcRistretto':
                    module_inst.set_quantization(
                        layer_info.quantization_param.bw_layer_in,
                        layer_info.quantization_param.fl_layer_in,
                        layer_info.quantization_param.bw_params,
                        layer_info.quantization_param.fl_params,
                        layer_info.quantization_param.bw_layer_out,
                        layer_info.quantization_param.fl_layer_out)
            elif layer_type == 'Pooling':
                module_inst =  Pooling(layer_name, up_layer_data_shape, up_layer_data_width, up_layer_output_stride, \
                               self.blobs[layer_info.top[0]].data.shape[1:], \
                               layer_info.pooling_param.pool, \
                               layer_info.pooling_param.kernel_size, \
                               layer_info.pooling_param.stride, \
                               layer_info.pooling_param.pad,  \
                               get_layer_kpf(layer_name, optim_file))
                module_inst.set_quantization(self.modules[-1].output_dw,
                                             self.modules[-1].output_dq,
                                             self.modules[-1].param_ww,
                                             self.modules[-1].param_wq,
                                             self.modules[-1].output_dw,
                                             self.modules[-1].output_dq)
            elif layer_type == 'BatchNorm':
                params = [self.params[layer_name][0].data / self.params[layer_name][2].data, \
                          self.params[layer_name][1].data / self.params[layer_name][2].data]
                self.modules[-1].bn = params
                print 'Layer %s(%s), is aggregated to the upper layer %s.'\
                      %(layer_name, layer_type, self.modules[-1].layer_name)
                continue
            elif layer_type == 'Scale':
                params = [
                    self.params[layer_name][0].data,
                    self.params[layer_name][1].data
                ]
                self.modules[-1].bn.extend(params)
                print 'Layer %s(%s), is aggregated to the upper layer %s.'\
                      %(layer_name, layer_type, self.modules[-1].layer_name)
                continue
            elif layer_type == 'ReLU':
                # appregate this simple layer to the up layer
                self.modules[-1].hasrelu = 1
                print 'Layer %s(%s), is aggregated to the upper layer %s.'\
                      %(layer_name, layer_type, self.modules[-1].layer_name)
                continue
            else:
                raise Exception('Layer type [%s] is not supported.' %
                                layer_type)

            if module_inst.params:
                module_inst.dma_delay = get_layer_dma_delay(
                    module_inst.layer_name, optim_file)

            # add this module to the end of the list
            self.modules.append(module_inst)

            up_layer_data_shape = module_inst.output_shape
            up_layer_data_width = module_inst.kpf
            up_layer_output_stride = module_inst.get_output_stride()

        if INPUT_CHANNEL_PADDING > 0:
            old_shape = self.modules[0].input_shape
            self.modules[0].input_shape = (old_shape[0] +
                                           INPUT_CHANNEL_PADDING, old_shape[1],
                                           old_shape[2])
            if self.modules[0].params:
                old_params_shape = self.modules[0].params[0].shape
                new_params = np.zeros((old_params_shape[0], old_params_shape[1] + INPUT_CHANNEL_PADDING, \
                             old_params_shape[2], old_params_shape[3]))
                new_params[:, 0:old_params_shape[1], :, :] = self.modules[
                    0].params[0]
                self.modules[0].params[0] = new_params
                self.modules[0].kernel_num = self.modules[0].params[0].shape[0]
                self.modules[0].kernel_shape = self.modules[0].params[0].shape[
                    1:]
示例#6
0
import numpy as np
np.random.seed(0)


if __name__ == '__main__':
    train_data, train_labels = get_data(num_samples=50000)
    test_data, test_labels = get_data(num_samples=10000, dataset="testing")

    train_data = train_data / 255
    test_data = test_data / 255

    print("Train data shape: {}, {}".format(train_data.shape, train_labels.shape))
    print("Test data shape: {}, {}".format(test_data.shape, test_labels.shape))

    model = Model(
        Convolution(filters=5, padding='same'),
        Elu(),
        Pooling(mode='max', kernel_shape=(2, 2), stride=2),
        Flatten(),
        FullyConnected(units=10),
        Softmax(),
        name='cnn5'
    )

    model.set_loss(CategoricalCrossEntropy)

    model.train(train_data, train_labels.T, epochs=2) # set load_and_continue to True if you want to start from already trained weights
    # model.load_weights() # uncomment if loading previously trained weights and comment above line to skip training and only load trained weights.

    print('Testing accuracy = {}'.format(model.evaluate(test_data, test_labels)))