예제 #1
0
 def _testSolver(self, solver):
     # We are going to test if the solver correctly deals with the mpi case
     # where multiple nodes host different data. To this end we will
     # create a dummy regression problem which, when run under mpi with
     # >1 nodes, will create a different result from a single-node run.
     np.random.seed(1701)
     X = base.Blob((10, 1),
                   filler=fillers.GaussianRandFiller(mean=mpi.RANK,
                                                     std=0.01))
     Y = base.Blob((10, 1),
                   filler=fillers.ConstantFiller(value=mpi.RANK + 1.))
     decaf_net = base.Net()
     decaf_net.add_layer(core_layers.InnerProductLayer(name='ip',
                                                       num_output=1),
                         needs='X',
                         provides='pred')
     decaf_net.add_layer(core_layers.SquaredLossLayer(name='loss'),
                         needs=['pred', 'Y'])
     decaf_net.finish()
     solver.solve(decaf_net, previous_net={'X': X, 'Y': Y})
     w, b = decaf_net.layers['ip'].param()
     print w.data(), b.data()
     if mpi.SIZE == 1:
         # If size is 1, we are fitting y = 0 * x + 1
         np.testing.assert_array_almost_equal(w.data(), 0., 2)
         np.testing.assert_array_almost_equal(b.data(), 1., 2)
     else:
         # if size is not 1, we are fitting y = x + 1
         np.testing.assert_array_almost_equal(w.data(), 1., 2)
         np.testing.assert_array_almost_equal(b.data(), 1., 2)
     self.assertTrue(True)
예제 #2
0
def translate_cuda_network(cuda_layers, output_shapes):
    """Translates a list of cuda layers to a decaf net.

    Input:
        cuda_layers: a list of layers from the cuda convnet training.
        output_shapes: a dictionary that contains the specification on the
            input shapes. This dictionary will be modified in-place to add
            the output shapes for the intermediate layers, but you need to
            provide the shapes for all the data layers. For data that are
            going to be scalar, use -1. The shapes should be following the
            decaf convention, not the cuda convnet convention.
    """
    decaf_net = base.Net()
    for cuda_layer in cuda_layers:
        decaf_layer = translate_layer(cuda_layer, output_shapes)
        if not decaf_layer:
            # This layer should be ignored.
            continue
        # Now, let's figure out the parent of the layer
        needs = []
        for idx in cuda_layer['inputs']:
            if cuda_layers[idx]['type'] == DATA_TYPENAME:
                needs.append(cuda_layers[idx]['name'])
            else:
                needs.append(cuda_layers[idx]['name'] + OUTPUT_AFFIX)
        provide = cuda_layer['name'] + OUTPUT_AFFIX
        decaf_net.add_layers(decaf_layer, needs=needs, provides=provide)
    decaf_net.finish()
    return decaf_net
예제 #3
0
 def testForwardBackwardWithPrevLayer(self):
     decaf_net = base.Net()
     prev_net = base.Net()
     # add data layer
     prev_net.add_layers(imagenet_data(),
                          provides=['image', 'label'])
     decaf_net.add_layers(imagenet_layers(),
                          needs='image',
                          provides='prediction')
     loss_layer = core_layers.MultinomialLogisticLossLayer(
         name='loss')
     decaf_net.add_layer(loss_layer,
                         needs=['prediction', 'label'])
     prev_net.finish()
     decaf_net.finish()
     loss = decaf_net.forward_backward(previous_net=prev_net)
     self.assertGreater(loss, 0.)
     self.assertLess(loss, 10.)
예제 #4
0
 def testPredict(self):
     # testPredict tests performing prediction without loss layer.
     decaf_net = base.Net()
     # add data layer
     decaf_net.add_layers(imagenet_data(),
                          provides=['image', 'label'])
     decaf_net.add_layers(imagenet_layers(),
                          needs='image',
                          provides='prediction')
     decaf_net.finish()
     result = decaf_net.predict()
     self.assertTrue('label' in result)
     self.assertTrue('prediction' in result)
     self.assertEqual(result['prediction'].shape[-1], 1000)
예제 #5
0
 def testForwardBackward(self):
     # testForwardBackward tests the full f-b path.
     decaf_net = base.Net()
     # add data layer
     decaf_net.add_layers(imagenet_data(),
                          provides=['image', 'label'])
     decaf_net.add_layers(imagenet_layers(),
                          needs='image',
                          provides='prediction')
     loss_layer = core_layers.MultinomialLogisticLossLayer(
         name='loss')
     decaf_net.add_layer(loss_layer,
                         needs=['prediction', 'label'])
     decaf_net.finish()
     loss = decaf_net.forward_backward()
     self.assertGreater(loss, 0.)
     self.assertLess(loss, 10.)
예제 #6
0
 def setUp(self):
     self.decaf_net = base.Net()
     self.decaf_net.add_layer(base.Layer(name='a'), provides='data')
     self.decaf_net.add_layer(base.Layer(name='b'), needs='data')
     self.decaf_net.add_layer(base.Layer(name='c'), needs='data')
     self.decaf_net.finish()
def main():
    logging.getLogger().setLevel(logging.INFO)
    ######################################
    # First, let's create the decaf layer.
    ######################################
    logging.info('Loading data and creating the network...')
    decaf_net = base.Net()
    # add data layer
    dataset = mnist.MNISTDataLayer(name='mnist',
                                   rootfolder=ROOT_FOLDER,
                                   is_training=True)
    decaf_net.add_layer(dataset, provides=['image-all', 'label-all'])
    # add minibatch layer for stochastic optimization
    minibatch_layer = core_layers.BasicMinibatchLayer(name='batch',
                                                      minibatch=MINIBATCH)
    decaf_net.add_layer(minibatch_layer,
                        needs=['image-all', 'label-all'],
                        provides=['image', 'label'])
    # add the two_layer network
    decaf_net.add_layers([
        core_layers.FlattenLayer(name='flatten'),
        core_layers.InnerProductLayer(
            name='ip1',
            num_output=NUM_NEURONS,
            filler=fillers.GaussianRandFiller(std=0.1),
            bias_filler=fillers.ConstantFiller(value=0.1)),
        core_layers.ReLULayer(name='relu1'),
        core_layers.InnerProductLayer(
            name='ip2',
            num_output=NUM_CLASS,
            filler=fillers.GaussianRandFiller(std=0.3))
    ],
                         needs='image',
                         provides='prediction')
    # add loss layer
    loss_layer = core_layers.MultinomialLogisticLossLayer(name='loss')
    decaf_net.add_layer(loss_layer, needs=['prediction', 'label'])
    # finish.
    decaf_net.finish()
    ####################################
    # Decaf layer finished construction!
    ####################################

    # now, try to solve it
    if METHOD == 'adagrad':
        # The Adagrad Solver
        solver = core_solvers.AdagradSolver(base_lr=0.02,
                                            base_accum=1.e-6,
                                            max_iter=1000)
    elif METHOD == 'sgd':
        solver = core_solvers.SGDSolver(base_lr=0.1,
                                        lr_policy='inv',
                                        gamma=0.001,
                                        power=0.75,
                                        momentum=0.9,
                                        max_iter=1000)
    solver.solve(decaf_net)
    visualize.draw_net_to_file(decaf_net, 'mnist.png')
    decaf_net.save('mnist_2layers.decafnet')

    ##############################################
    # Now, let's load the net and run predictions
    ##############################################
    prediction_net = base.Net.load('mnist_2layers.decafnet')
    visualize.draw_net_to_file(prediction_net, 'mnist_test.png')
    # obtain the test data.
    dataset_test = mnist.MNISTDataLayer(name='mnist',
                                        rootfolder=ROOT_FOLDER,
                                        is_training=False)
    test_image = base.Blob()
    test_label = base.Blob()
    dataset_test.forward([], [test_image, test_label])
    # Run the net.
    pred = prediction_net.predict(image=test_image)['prediction']
    accuracy = (pred.argmax(1) == test_label.data()).sum() / float(
        test_label.data().size)
    print 'Testing accuracy:', accuracy
    print 'Done.'