美文网首页
MXNet学习—卷积神经网络实现

MXNet学习—卷积神经网络实现

作者: 风就吹吧 | 来源:发表于2018-09-25 16:41 被阅读0次

    一.LeNet

    import gluonbook as gb
    import mxnet as mx
    from mxnet import autograd, gluon, init, nd
    from mxnet.gluon import loss as gloss, nn
    import time
    
    net = nn.Sequential()
    net.add(nn.Conv2D(channels=6, kernel_size=5, activation='sigmoid'),
            nn.MaxPool2D(pool_size=2, strides=2),
            nn.Conv2D(channels=16, kernel_size=5, activation='sigmoid'),
            nn.MaxPool2D(pool_size=2, strides=2),
            nn.Dense(120, activation='sigmoid'),
            nn.Dense(84, activation='sigmoid'),
            nn.Dense(10))
    
    # X = nd.random.uniform(shape=(1, 1, 28, 28))
    # net.initialize()
    # for layer in net:
    #     X = layer(X)
    #     print(layer.name, 'output shape:', X.shape)
    batch_size = 256
    train_iter, test_iter = gb.load_data_fashion_mnist(batch_size=batch_size)
    
    
    def try_gpu():
        try:
            ctx = mx.gpu()
            _ = nd.zeros((1,), ctx=ctx)
        except:
            ctx = mx.cpu()
        return ctx
    
    
    ctx = try_gpu()
    lr, num_epochs = 0.9, 5
    
    net.initialize(force_reinit=True, ctx=ctx, init=init.Xavier())
    trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': lr})
    
    
    def evaluate_accuracy(data_iter, net, ctx):
        acc = nd.array([0], ctx=ctx)
        for X, y in data_iter:
            # 如果 ctx 是 GPU,将数据复制到 GPU 上。
            X, y = X.as_in_context(ctx), y.as_in_context(ctx)
            acc += gb.accuracy(net(X), y)
        return acc.asscalar() / len(data_iter)
    
    
    def train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx, num_epochs):
        print('training on', ctx)
        loss = gloss.SoftmaxCrossEntropyLoss()
        for epoch in range(num_epochs):
            train_l_sum, train_acc_sum, start = 0, 0, time.time()
            for X, y in train_iter:
                X, y = X.as_in_context(ctx), y.as_in_context(ctx)
                with autograd.record():
                    y_hat = net(X)
                    l = loss(y_hat, y)
                l.backward()
                trainer.step(batch_size)
                train_l_sum += l.mean().asscalar()
                train_acc_sum += gb.accuracy(y_hat, y)
            test_acc = evaluate_accuracy(test_iter, net, ctx)
            print('epoch %d, loss %.4f, train acc %.3f, test acc %.3f, '
                  'time %.1f sec' % (epoch + 1, train_l_sum / len(train_iter),
                                     train_acc_sum / len(train_iter),
                                     test_acc, time.time() - start))
    
    
    train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx, num_epochs)
    

    相关文章

      网友评论

          本文标题:MXNet学习—卷积神经网络实现

          本文链接:https://www.haomeiwen.com/subject/cvcloftx.html