Ejemplo n.º 1
0
    net.add(gluon.nn.Dense(10))
    # net.initialize()
    return net


if __name__ == '__main__':

    train_data, test_data = utils1.load_data_fashion_mnist(batch_size)
    entrory_loss = gluon.loss.SoftmaxCrossEntropyLoss()
    lr = 0.5
    net = mynet()
    net.initialize()
    trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.5})
    epoches = 5
    for e in range(epoches):
        train_loss = 0
        test_acc = 0
        train_acc = 0
        for data, label in train_data:
            with autograd.record():
                out = net(data)
                loss = entrory_loss(out, label)
            loss.backward()
            trainer.step(batch_size)
            train_loss += nd.mean(loss).asscalar()
            train_acc += utils1.accuracy(out, label)
        test_acc = utils1.evaluate_accuracy(test_data, net)
        print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % (
            e, train_loss / len(train_data),
            train_acc / len(train_data), test_acc))
Ejemplo n.º 2
0
def myTrain(net,
            batch_size,
            train_data,
            valid_data,
            epoches,
            lr,
            wd,
            ctx,
            lr_period,
            lr_decay,
            verbose=False):
    trainer = mx.gluon.Trainer(net.collect_params(), 'sgd', {
        'learning_rate': lr,
        'momentum': 0.9,
        'wd': wd
    })
    prev_time = datetime.datetime.now()
    train_loss_record = []
    valid_loss_record = []  # epoches recycle record loss
    train_acc_record = []
    valid_acc_record = []
    focalloss = netlib.FocalLoss()
    for e in range(epoches):
        train_loss = 0.0
        train_acc = 0.0
        # if e > 99 and e < 251 and e % 10 == 0:
        #     trainer.set_learning_rate(trainer.learning_rate * lr_decay)  # decrease lr
        # if e == 60 or e == 120 or e == 160:
        #     trainer.set_learning_rate(trainer.learning_rate * lr_decay)  # decrease lr
        if e > 150 and e % 20 == 0:
            trainer.set_learning_rate(trainer.learning_rate *
                                      lr_decay)  # decrease
        # print('train len:',len(train_data))
        for data, label in train_data:
            label = label.reshape(
                shape=(label.shape[0], ))  # be careful:it turns to vector
            label = label.astype('float32').as_in_context(ctx)
            with autograd.record():
                output = net(data.as_in_context(ctx))
                loss = softmax_cross_entrory(output, label)  #
                # loss = focalloss(output, label)# focal loss
            loss.backward()
            trainer.step(batch_size)
            train_loss += nd.mean(loss).asscalar()
            train_acc += utils1.accuracy(output, label)

        train_loss_record.append(train_loss / len(train_data))
        train_acc_record.append(train_acc / len(train_data))
        cur_time = datetime.datetime.now()
        h, remainder = divmod((cur_time - prev_time).seconds, 3600)
        m, s = divmod(remainder, 60)
        time_str = 'Time %02d:%02d:%02d' % (h, m, s)
        if valid_data is not None:
            valid_acc = evaluate_accuracy(valid_data, net, ctx)
            valid_acc_record.append(valid_acc)

            if verbose:
                ###valid data loss
                valid_loss = 0
                for data, valid_label in valid_data:
                    valid_label = valid_label.reshape(
                        shape=(valid_label.shape[0],
                               ))  # be careful:it turns to vector
                    valid_label = valid_label.astype('float32').as_in_context(
                        ctx)
                    # with autograd.predict_mode():
                    out = net(data.as_in_context(ctx))
                    loss = softmax_cross_entrory(out, valid_label)
                    # loss = focalloss(out, valid_label)  # focal loss
                    valid_loss += nd.mean(loss).asscalar()
                    # valid_loss = nd.mean(loss).asscalar( # only used valid loss of every batch(vaild_data)
                valid_loss_record.append(
                    valid_loss /
                    len(valid_data))  # record every batch loss of valid data

                epoch_str = (
                    "Epoch %d. Train Loss: %f,Valid Loss: %f, Train acc %f, Valid acc %f, "
                    %
                    (e, train_loss / len(train_data), valid_loss /
                     len(valid_data), train_acc / len(train_data), valid_acc))
            else:
                epoch_str = (
                    "Epoch %d. Train Loss: %f, Train acc %f, Valid acc %f, " %
                    (e, train_loss / len(train_data),
                     train_acc / len(train_data), valid_acc))

        else:
            epoch_str = (
                "Epoch %d. Loss: %f, Train acc %f, " %
                (e, train_loss / len(train_data), train_acc / len(train_data)))
        prev_time = cur_time
        print(epoch_str + 'lr=' + str(trainer.learning_rate) + ',' + time_str)
    # plot loss and acc
    fig, (fig1, fig2) = plt.subplots(1, 2)
    if verbose:
        fig1.plot(train_loss_record, 'b')
        fig1.legend(['train'])
        fig2.plot(train_acc_record, 'b')
        fig2.legend(['train_acc'])
        if valid_data is not None:
            fig1.plot(valid_loss_record, 'r')
            fig1.legend(['train', 'test'])
            fig2.plot(valid_acc_record, 'r')
            fig2.legend(['train_acc', 'valid_acc'])
    else:
        fig1.plot(train_loss_record, 'b')
        fig1.legend(['train'])
        fig2.plot(train_acc_record, 'b')
        fig2.plot(valid_acc_record, 'r')
        fig2.legend(['train_acc', 'valid_acc'])
    fig.show()
    fig.savefig('./CIFAR10_result.png')