Ejemplo n.º 1
0
    def test_batchnorm(self):
        print("\n======== TestFCNet.test_batchnorm :")

        dataset = load_data(self.data_dir, self.verbose)
        num_train = 10
        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        input_dim = 32 * 32 * 3
        hidden_dims = [100, 100, 100, 100, 100, 100]
        weight_scale = 2e-2
        learning_rate = 1e-3
        update_rule = 'adam'

        bn_model = fcnet.FCNet(input_dim=input_dim,
                               hidden_dims=hidden_dims,
                               weight_scale=weight_scale,
                               use_batchnorm=True)
        bn_solver = solver.Solver(
            bn_model,
            small_data,
            num_epochs=self.num_epochs,
            update_rule=update_rule,
            optim_config={'learning_rate': learning_rate},
            verbose=True,
            print_every=self.print_every)
        print("Training with batchnorm")
        bn_solver.train()
        fc_model = fcnet.FCNet(input_dim=input_dim,
                               hidden_dims=hidden_dims,
                               weight_scale=weight_scale,
                               use_batchnorm=False)

        fc_solver = solver.Solver(
            fc_model,
            small_data,
            num_epochs=self.num_epochs,
            update_rule=update_rule,
            optim_config={'learning_rate': learning_rate},
            verbose=True,
            print_every=self.print_every)
        print("Training without batchnorm")
        fc_solver.train()

        print("======== TestFCNet.test_batchnorm: <END> ")
Ejemplo n.º 2
0
    def test_weight_init(self):
        print("======== TestFCNet.test_weight_init:")

        dataset = load_data(self.data_dir, self.verbose)
        num_train = 1500
        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        input_dim = 32 * 32 * 3
        hidden_dims = [100, 100, 100, 100, 100, 100, 100, 100, 100]
        weight_scale = 2e-2
        reg = 2e-2
        learning_rate = 1e-3
        batch_size = 50
        update_rule = 'adam'
        weight_init = ['gauss', 'gauss_sqrt2', 'xavier']

        model_dict = {}
        for w in weight_init:
            model = fcnet.FCNet(input_dim=input_dim,
                                hidden_dims=hidden_dims,
                                weight_scale=weight_scale,
                                reg=reg,
                                weight_init=w)
            model_dict[w] = model
        solver_dict = {}

        for k, m in model_dict.items():
            if self.verbose:
                print(m)

            solv = solver.Solver(
                m,
                small_data,
                print_every=self.print_every,
                num_epochs=self.num_epochs,
                batch_size=batch_size,  # previously 25
                update_rule=update_rule,
                optim_config={'learning_rate': learning_rate})
            solv.train()
            #skey = '%s-%s' % (m.__repr__(), k)
            skey = '%s' % k
            solver_dict[skey] = solv

        if self.draw_plots:
            fig, ax = vis_solver.get_train_fig()
            vis_solver.plot_solver_compare(ax, solver_dict)
            #vis_solver.plot_solver(ax, solv)
            plt.show()

        print("======== TestFCNet.test_weight_init: <END> ")
Ejemplo n.º 3
0
    def test_all_optim_fcnet_5layer(self):
        print("\n======== TestSolverFCNet.test_all_optim_fcnet_5layer:")

        dataset = load_data(self.data_dir, self.verbose)
        num_train = 50
        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        #input_dim = small_data['X_train'].shape[0]
        input_dim = 3 * 32 * 32
        hidden_dims = [100, 100, 100, 100, 100]
        #hidden_dims = [100, 50, 10]     # just some random dims
        weight_scale = 5e-2
        reg = 1e-1
        batch_size = 50
        solvers = {}

        # Solver params
        optim_list = ['rmsprop', 'sgd_momentum', 'adam', 'sgd']
        lr = {'rmsprop': 1e-4, 'adam': 1e-3, 'sgd': 1e-3, 'sgd_momentum': 1e-3}

        for update_rule in optim_list:
            print("Using update rule %s" % update_rule)
            model = fcnet.FCNet(input_dim=input_dim,
                                hidden_dims=hidden_dims,
                                weight_scale=weight_scale,
                                reg=reg,
                                dtype=np.float64)
            if self.verbose:
                print(model)
            model_solver = solver.Solver(
                model,
                small_data,
                print_every=self.print_every,
                num_epochs=self.num_epochs,
                batch_size=batch_size,  # previously 25
                update_rule=update_rule,
                optim_config={'learning_rate': lr[update_rule]})
            solvers[update_rule] = model_solver
            model_solver.train()

        # get some figure handles and plot the data
        if self.draw_plots:
            fig, ax = get_figure_handles()
            plot_test_result(ax, solvers, self.num_epochs)
            fig.set_size_inches(8, 8)
            fig.tight_layout()
            plt.show()

        print("======== TestSolverFCNet.test_all_optim_fcnet_5layer: <END> ")
Ejemplo n.º 4
0
    def test_model_restore(self):
        print("\n======== TestSolverCheckpoint.test_model_restore:")

        dataset = load_data(self.data_dir, self.verbose)
        num_train = 50
        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        #input_dim = small_data['X_train'].shape[0]
        input_dim = 3 * 32 * 32
        #hidden_dims = [100, 100, 100, 100, 100]
        hidden_dims = [100, 50, 10]  # just some random dims
        weight_scale = 5e-2
        learning_rate = 1e-2
        batch_size = 50
        update_rule = 'adam'

        model = fcnet.FCNet(input_dim=input_dim,
                            hidden_dims=hidden_dims,
                            weight_scale=weight_scale,
                            dtype=np.float64)
        if self.verbose:
            print(model)
        ref_solver = solver.Solver(
            model,
            small_data,
            print_every=self.print_every,
            num_epochs=self.num_epochs,
            batch_size=batch_size,  # previously 25
            update_rule=update_rule,
            optim_config={'learning_rate': learning_rate})
        ref_solver.train()
        ref_solver_file = 'tests/ref_solver.pkl'
        ref_solver.save(ref_solver_file)

        test_solver = solver.Solver(model, small_data)
        test_solver.load(ref_solver_file)

        # Compare the two solvers
        print("Checking parameters")
        self.assertEqual(ref_solver.update_rule, test_solver.update_rule)
        self.assertEqual(ref_solver.num_epochs, test_solver.num_epochs)
        self.assertEqual(ref_solver.batch_size, test_solver.batch_size)
        self.assertEqual(ref_solver.print_every, test_solver.print_every)
        self.assertEqual(ref_solver.lr_decay, test_solver.lr_decay)

        #self.assertDictEqual(ref_solver.optim_config, test_solver.optim_config)

        print("======== TestSolverCheckpoint.test_model_restore: <END> ")
Ejemplo n.º 5
0
    def test_adam_vs_rmsprop_fcnet(self):
        print("\n======== TestSolverFCNet.test_adam_vs_rmsprop:")
        dataset = load_data(self.data_dir, self.verbose)
        num_train = 50
        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        #input_dim = small_data['X_train'].shape[0]
        input_dim = 3 * 32 * 32
        #hidden_dims = [100, 100, 100, 100, 100]
        hidden_dims = [100, 100, 100, 100, 100]
        weight_scale = 5e-2
        batch_size = 50
        reg = 1e-1
        lr = {'rmsprop': 1e-4, 'adam': 1e-3}
        update_rule = ['rmsprop', 'adam']

        solvers = {}
        for u in update_rule:
            model = fcnet.FCNet(input_dim=input_dim,
                                hidden_dims=hidden_dims,
                                weight_scale=weight_scale,
                                reg=reg,
                                dtype=np.float64)
            if self.verbose:
                print(model)
            model_solver = solver.Solver(
                model,
                small_data,
                print_every=self.print_every,
                num_epochs=self.num_epochs,
                batch_size=batch_size,  # previously 25
                update_rule=u,
                optim_config={'learning_rate': lr[u]})
            solvers[u] = model_solver
            model_solver.train()

        if self.draw_plots is True:
            fig, ax = get_figure_handles()
            plot_test_result(ax, solvers, self.num_epochs)
            fig.set_size_inches(8, 8)
            fig.tight_layout()
            plt.show()

        print("======== TestSolverFCNet.test_adam_vs_rmsprop: <END> ")
Ejemplo n.º 6
0
    def test_fcnet_2layer_dropout(self):
        print("\n======== TestFCNetDropout.test_fcnet_2layer_dropout :")
        dataset = load_data(self.data_dir, self.verbose)
        num_train = 10

        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        #input_dim = small_data['X_train'].shape[0]
        input_dim = 3 * 32 * 32
        #hidden_dims = [100, 100, 100, 100]
        batch_size = 100
        solvers = {}
        dropout_probs = [0.0, 0.3, 0.5, 0.7]

        for d in dropout_probs:
            model = fcnet.FCNet(hidden_dims=[500],
                                input_dim=input_dim,
                                num_classes=10,
                                dropout=d,
                                weight_scale=2e-2)
            s = solver.Solver(model,
                              small_data,
                              num_epochs=self.num_epochs,
                              batch_size=batch_size,
                              update_rule='adam',
                              optim_config={'learning_rate': 5e-4},
                              verbose=True,
                              print_every=self.print_every)
            print("Training with dropout %f" % d)
            s.train()
            solvers['p=' + str(d)] = s

        if self.draw_plots:
            fig, ax = get_figure_handles()
            plot_test_result(ax, solvers, self.num_epochs)
            fig.set_size_inches(8, 8)
            fig.tight_layout()
            plt.show()

        print("======== TestFCNetDropout.test_fcnet_2layer_dropout: <END> ")
Ejemplo n.º 7
0
    def test_fcnet_3layer_overfit(self):
        print("\n======== TestFCNet.test_fcnet_3layer_overfit:")

        dataset = load_data(self.data_dir, self.verbose)
        num_train = 50

        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        #input_dim = small_data['X_train'].shape[0]
        input_dim = 3 * 32 * 32
        hidden_dims = [100, 100]
        weight_scale = 0.079564
        learning_rate = 0.003775

        # Get model and solver
        model = fcnet.FCNet(input_dim=input_dim,
                            hidden_dims=hidden_dims,
                            weight_scale=weight_scale,
                            dtype=np.float64,
                            verbose=True)
        print(model)
        model_solver = solver.Solver(
            model,
            small_data,
            print_every=self.print_every,
            num_epochs=self.num_epochs,
            batch_size=50,  # previously 25
            update_rule='sgd',
            optim_config={'learning_rate': learning_rate})
        model_solver.train()

        # Plot results
        if self.draw_plots is True:
            plt.plot(model_solver.loss_history, 'o')
            plt.title('Training loss history (3 layers)')
            plt.xlabel('Iteration')
            plt.ylabel('Training loss')
            plt.show()

        print("======== TestFCNet.test_fcnet_3layer_overfit: <END> ")
Ejemplo n.º 8
0
    def test_rmsprop_fcnet(self):
        print("\n======== TestSolverFCNet.test_rmsprop_fcnet:")
        dataset = load_data(self.data_dir, self.verbose)
        num_train = 50
        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        #input_dim = small_data['X_train'].shape[0]
        input_dim = 3 * 32 * 32
        #hidden_dims = [100, 100, 100, 100, 100]
        hidden_dims = [100, 50, 10]  # just some random dims
        weight_scale = 5e-2
        learning_rate = 1e-2
        batch_size = 50
        update_rule = 'rmsprop'

        model = fcnet.FCNet(input_dim=input_dim,
                            hidden_dims=hidden_dims,
                            weight_scale=weight_scale,
                            dtype=np.float64)
        if self.verbose:
            print(model)
        model_solver = solver.Solver(
            model,
            small_data,
            print_every=self.print_every,
            num_epochs=self.num_epochs,
            batch_size=batch_size,  # previously 25
            update_rule=update_rule,
            optim_config={'learning_rate': learning_rate})
        model_solver.train()

        if self.draw_plots is True:
            solvers = {'rmsprop': model_solver}
            fig, ax = get_figure_handles()
            plot_test_result(ax, solvers, self.num_epochs)
            fig.set_size_inches(8, 8)
            fig.tight_layout()
            plt.show()

        print("======== TestSolverFCNet.test_rmsprop_fcnet: <END> ")
Ejemplo n.º 9
0
    def test_dropout_backward(self):
        print("\n======== TestLayersDropout.test_dropout_backward:")

        N = 2
        D = 15
        H1 = 20
        H2 = 30
        C = 10
        X = np.random.randn(N, D)
        y = np.random.randint(C, size=(N, ))
        dropout_probs = [0.3, 0.6, 0.1]

        import pymllib.classifiers.fcnet as fcnet
        # Network params
        hidden_dims = [H1, H2]
        weight_scale = 5e-2

        for p in dropout_probs:
            print("Running check with dropout p = %f" % p)
            model = fcnet.FCNet(hidden_dims=hidden_dims,
                                input_dim=D,
                                num_classes=C,
                                dropout=p,
                                weight_scale=weight_scale,
                                seed=123,
                                dtype=np.float64)
            loss, grads = model.loss(X, y)
            print("Initial loss : %f" % loss)
            for n in sorted(grads):
                f = lambda _: model.loss(X, y)[0]
                grad_num = check_gradient.eval_numerical_gradient(
                    f, model.params[n])
                grad_error = error.rel_error(grad_num, grads[n])
                print("%s relative error : %.2e" % (n, grad_error))

        print("======== TestLayersDropout.test_dropout_backward: <END> ")
Ejemplo n.º 10
0
    def test_fcnet_5layer_loss(self):
        print("\n======== TestFCNet.test_fcnet_5layer_loss:")

        dataset = load_data(self.data_dir, self.verbose)
        num_train = 50

        small_data = {
            'X_train': dataset['X_train'][:num_train],
            'y_train': dataset['y_train'][:num_train],
            'X_val': dataset['X_val'][:num_train],
            'y_val': dataset['y_val'][:num_train]
        }
        #input_dim = small_data['X_train'].shape[0]
        input_dim = 3 * 32 * 32
        hidden_dims = [100, 100, 100, 100]
        weight_scale = 1e-2
        learning_rate = 1e-2

        # Get model and solver
        model = fcnet.FCNet(input_dim=input_dim,
                            hidden_dims=hidden_dims,
                            weight_scale=weight_scale,
                            reg=0.0,
                            dtype=np.float64)
        print(model)
        model_solver = solver.Solver(
            model,
            small_data,
            print_every=self.print_every,
            num_epochs=self.num_epochs,
            batch_size=50,  # previously 25
            update_rule='sgd',
            optim_config={'learning_rate': learning_rate})
        model_solver.train()

        print("======== TestFCNet.test_fcnet_5layer_loss: <END> ")
Ejemplo n.º 11
0
    def test_fcnet_loss(self):
        print("\n======== TestFCNet.test_fcnet_loss:")
        # Some model parameters
        np.random.seed(231)
        N = 3
        D = 5
        H = 50
        C = 7
        std = 1e-2

        # Get model
        model = fcnet.FCNet(hidden_dims=[H],
                            input_dim=D,
                            num_classes=C,
                            weight_scale=std,
                            dtype=np.float64,
                            verbose=True)
        W1_std = abs(model.params['W1'].std() - std)
        W2_std = abs(model.params['W2'].std() - std)
        b1 = model.params['b1']
        b2 = model.params['b2']

        # Check that the weights are sensible
        self.assertLess(W1_std,
                        std / 10.0,
                        msg="Problem in first layer weights")
        self.assertLess(W2_std,
                        std / 10.0,
                        msg="Problem in second layer weights")
        self.assertTrue(np.all(b1 == 0), msg="Problem in first layer biases")
        self.assertTrue(np.all(b2 == 0), msg="Problem in second layer biases")

        print("\tTest time forward pass")
        model.params['W1'] = np.linspace(-0.7, 0.3, num=D * H).reshape(D, H)
        model.params['W2'] = np.linspace(-0.3, 0.4, num=H * C).reshape(H, C)
        model.params['b1'] = np.linspace(-0.1, 0.9, num=H)
        model.params['b2'] = np.linspace(-0.9, 0.1, num=C)

        # Get data
        X = np.linspace(-5.5, 4.5, num=N * D).reshape(D, N).T
        y = np.random.randint(C, size=N)
        scores = model.loss(X)

        correct_scores = np.asarray([[
            11.53165108, 12.2917344, 13.05181771, 13.81190102, 14.57198434,
            15.33206765, 16.09215096
        ],
                                     [
                                         12.05769098, 12.74614105, 13.43459113,
                                         14.1230412, 14.81149128, 15.49994135,
                                         16.18839143
                                     ],
                                     [
                                         12.58373087, 13.20054771, 13.8173455,
                                         14.43418138, 15.05099822, 15.66781506,
                                         16.2846319
                                     ]])

        scores_diff = np.abs(scores - correct_scores).sum()
        # Cheating constant
        if self.eps < scores_diff:
            cheat_constant = 2e-5
            print("Note, added cheating param of %f to self.eps (%f)" %
                  (cheat_constant, self.eps))
        else:
            cheat_constant = 0.0
        self.assertLess(scores_diff, self.eps + cheat_constant)

        print("======== TestFCNet.test_fcnet_loss: <END> ")