卷积神经网络(LeNet) 讨论区


#42

有没有人好奇LeNet的第一个卷积层是怎么把一个单通道的样本变成6个通道的样本?
拿第二段代码为例,X是1个样本,1个通道,2828的矩阵
X = nd.random.uniform(shape=(1, 1, 28, 28))
经过第一层卷积之后,变成了1个样本,6个通道,24
24的矩阵
conv0 output shape: (1, 6, 24, 24)

我想看看最后的参数,那么可以在跑完train_ch5的代码之后,再插入打印参数的代码
net[0].params
结果显示
conv0_ ( Parameter conv0_weight (shape=(6, 1, 5, 5), dtype=<class 'numpy.float32'>) Parameter conv0_bias (shape=(6,), dtype=<class 'numpy.float32'>) )
可以看到卷积核是6个核,单通道,5*5的大小


#43

重复初始化了


#44

应该是设置了6个卷积核,对输入样本做了6次卷积运算得到6个通道的输出


#45

请问下大家,这个是什么原因产生的呢,电脑刚开机还可以用GPU,过一会再用就会报错


#46

为什么准确率还没有多层感知机的高?


#47

当LeNet网络用‘relu’激活函数时,不用‘sigmiod’函数,分类准确率一直不变,怎么回事?还很低


#48

个人理解 报错说的是 第一层卷积层参数形状是 [6,1,5,5],但是 根据输入数据 推断出来的形状是 [6,28,5,5],导致形状不一致,是不是 数据集 形状的问题?


#49

希望楼主看懂异常再回答“ Expected ‘float64’ v.s. given ‘float32’ at ‘weight’”。。。随机数默认产生的是’float32’ 类型


#50

这一章节里说 “ 卷积层块的两个最大池化层的窗口形状均为2×2,且步幅为2。”既然如此,为什么在代码实现的中,pool0层的输出是12*12,如果步幅是2的话,pool0层的输出应该小于12吧?


#51

前面的运行一直都没问题,gpu测试也过了,到最后直接给了一个这样的错误,我傻了。。。

MXNetError: [12:08:33] src/ndarray/ndarray.cc:1279: GPU is not enabled

Stack trace returned 10 entries:
[bt] (0) /home/leo/anaconda3/lib/python3.5/site-packages/mxnet/libmxnet.so(+0x23d55a) [0x7f98bf2ff55a]
[bt] (1) /home/leo/anaconda3/lib/python3.5/site-packages/mxnet/libmxnet.so(+0x23dbc1) [0x7f98bf2ffbc1]
[bt] (2) /home/leo/anaconda3/lib/python3.5/site-packages/mxnet/libmxnet.so(mxnet::CopyFromTo(mxnet::NDArray const&, mxnet::NDArray const&, int, bool)+0x723) [0x7f98c1e35623]
[bt] (3) /home/leo/anaconda3/lib/python3.5/site-packages/mxnet/libmxnet.so(mxnet::imperative::PushFComputeEx(std::function<void (nnvm::NodeAttrs const&, mxnet::OpContext const&, std::vector<mxnet::NDArray, std::allocatormxnet::NDArray > const&, std::vector<mxnet::OpReqType, std::allocatormxnet::OpReqType > const&, std::vector<mxnet::NDArray, std::allocatormxnet::NDArray > const&)> const&, nnvm::Op const*, nnvm::NodeAttrs const&, mxnet::Context const&, std::vector<mxnet::engine::Var*, std::allocatormxnet::engine::Var* > const&, std::vector<mxnet::engine::Var*, std::allocatormxnet::engine::Var* > const&, std::vector<mxnet::Resource, std::allocatormxnet::Resource > const&, std::vector<mxnet::NDArray*, std::allocatormxnet::NDArray* > const&, std::vector<mxnet::NDArray*, std::allocatormxnet::NDArray* > const&, std::vector<mxnet::OpReqType, std::allocatormxnet::OpReqType > const&)+0x47e) [0x7f98c1ceb59e]
[bt] (4) /home/leo/anaconda3/lib/python3.5/site-packages/mxnet/libmxnet.so(mxnet::Imperative::InvokeOp(mxnet::Context const&, nnvm::NodeAttrs const&, std::vector<mxnet::NDArray*, std::allocatormxnet::NDArray* > const&, std::vector<mxnet::NDArray*, std::allocatormxnet::NDArray* > const&, std::vector<mxnet::OpReqType, std::allocatormxnet::OpReqType > const&, mxnet::DispatchMode, mxnet::OpStatePtr)+0x839) [0x7f98c1cf08f9]
[bt] (5) /home/leo/anaconda3/lib/python3.5/site-packages/mxnet/libmxnet.so(mxnet::Imperative::Invoke(mxnet::Context const&, nnvm::NodeAttrs const&, std::vector<mxnet::NDArray*, std::allocatormxnet::NDArray* > const&, std::vector<mxnet::NDArray*, std::allocatormxnet::NDArray* > const&)+0x38c) [0x7f98c1cf117c]
[bt] (6) /home/leo/anaconda3/lib/python3.5/site-packages/mxnet/libmxnet.so(+0x2b34989) [0x7f98c1bf6989]
[bt] (7) /home/leo/anaconda3/lib/python3.5/site-packages/mxnet/libmxnet.so(MXImperativeInvokeEx+0x6f) [0x7f98c1bf6f7f]
[bt] (8) /home/leo/anaconda3/lib/python3.5/lib-dynload/_ctypes.so(ffi_call_unix64+0x4c) [0x7f98e9c50370]
[bt] (9) /home/leo/anaconda3/lib/python3.5/lib-dynload/_ctypes.so(ffi_call+0x1f5) [0x7f98e9c4fb15]

因为整体的报错实在太长了,如果有人可以回复我的话,我可以一段一段发给您,谢谢大家了。。。


#52
X = nd.random.uniform(shape=(1, 1, 28, 26))
net.initialize()
for layer in net:
X = layer(X)
print(layer.name, ‘output shape:\t’, X.shape)

这个注释掉就可以了,因为这里计算后模型里面的参数形状就不能变了,之前模型计算那里提到过,当时只是重新初始化,估计重新初始化没有重新将layer里的参数形状重置


#53

谢谢会回复,尝试了提示,但是报的错还是一样的,,,还是谢谢啦,可能是别的地方没处理好,不在这个程序内的错误


#55

试试这个,如不能用,看看是不是依赖库或者数据集的问题。

import mxnet as mx
from mxnet import autograd, gluon, init, nd
from mxnet.gluon import loss as gloss, data as gdata, nn
import time
import sys

# 定义模型
net = nn.Sequential()
net.add(
    # LeNet包含卷积层块和全连接层块
    # 卷积层块:
    # 卷积层块包含两个基本单位:每个基本单位包含一个卷积层和一个最大池化层
    # 第一个卷积层输出通道数为6,第二个为16
    # 池化层窗口大小2×2,步幅均为2
    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),
    # 全连接层块:
    # 全连接层块包含三个全连接层
    # 输出分别是120,84,10(此10为类别个数)
    # 卷积层输出形状为(batch_size, channels, height, width),
    # 全连接层输入将卷积层输出flatten为形状(batch_size, channels*height*width)
    nn.Dense(120, activation='sigmoid'),
    nn.Dense(84, activation='sigmoid'),
    nn.Dense(10)
)

# # 样例输出
# X = nd.random.uniform(shape=(1, 1, 28, 26))
# net.initialize()
# for layer in net:
#     X = layer(X)
#     print(layer.name, 'output shape:\t', X.shape)


# 获取数据
def load_data_fashion_mnist(batch_size):
    mnist_train = gdata.vision.FashionMNIST(train=True)
    mnist_test = gdata.vision.FashionMNIST(train=False)

    # ToTensor将图像数据从unit8格式变换成32位浮点数格式,并除以255使得所有像素的数值均在0到1之间。
    # ToTensor还将图像通道的最后一维移动到最前一维来方便后面卷积神经网络计算
    transformer = gdata.vision.transforms.ToTensor()
    # Gluon的DataLoader中一个很方便的共鞥是允许使用多进程来加速数据读取
    # 暂不支持Windows操作系统
    # 通过参数num_workers来设置4个进程读取数据
    if sys.platform.startswith('win'):
        num_workers = 0
    else:
        num_workers = 4

    train_iter = gdata.DataLoader(mnist_train.transform_first(transformer),
                                  batch_size,
                                  shuffle=True,
                                  num_workers=num_workers)
    test_iter = gdata.DataLoader(mnist_test.transform_first(transformer),
                                 batch_size,
                                 shuffle=True,
                                 num_workers=num_workers)
    return train_iter, test_iter


# 训练模型
batch_size = 256
train_iter, test_iter = load_data_fashion_mnist(batch_size=batch_size)



# 尝试使用gpu(0)计算,否则仍然使用CPU
def try_gpu():
    try:
        ctx = mx.gpu()
        _ = nd.zeros((1,), ctx=ctx)
    except mx.base.MXNetError:
        ctx = mx.cpu()
    return ctx


ctx = try_gpu()
print(ctx)


def evaluate_accuracy(data_iter, net, ctx):
    acc_sum, n = nd.array([0], ctx=ctx), 0
    for X, y in data_iter:
        X, y = X.as_in_context(ctx), y.as_in_context(ctx).astype('float32')
        acc_sum += (net(X).argmax(axis=1) == y).sum()
        n += y.size
    return acc_sum.asscalar() / n


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, n, start = 0.0, 0.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).sum()
            l.backward()
            trainer.step(batch_size)
            y = y.astype('float32')
            train_l_sum += l.asscalar()
            train_acc_sum += (y_hat.argmax(axis=1) == y).sum().asscalar()
            n += y.size
        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 / n, train_acc_sum / n, test_acc, time.time() - start))


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})
train_ch5(net, train_iter, test_iter, batch_size, trainer, ctx, num_epochs)


#56

你的try_gpu()里面_ = nd.zeros((1,), ctx=ctx)的这个没有被注释吧?注释的话就会报错的!(这句话就是测试是否获得了可用gpu,如果没获得就会引发异常,然后捕获异常改用cpu)
下图就是没有获得可用gpu的异常,你看看是不是这个引起的,还有看看mxnet是不是gpu版本的


#57

请问cpu是不是跑不动啊,挂了5分钟也没什么反应


#58

虚拟环境关了重开就可以了,我刚刚也这样,CPU一个epoch要跑接近半分钟,GPU跑的话内存爆,哭了


#59

我在pycharm中运行这部分的代码,中间有个提示set the environment variable MXNET_CUDNN_AUTOTUNE_DEFAULT to 0 to disable
不知道是怎么回事,有同学知道么
training on gpu(0)
[11:03:02] c:\jenkins\workspace\mxnet-tag\mxnet\src\operator\nn\cudnn./cudnn_algoreg-inl.h:97: Running performance tests to find the best convolution algorithm, this can take a while… (set the environment variable MXNET_CUDNN_AUTOTUNE_DEFAULT to 0 to disable)
epoch 1, loss 2.3140, train acc 0.112, test acc 0.294, time 5.4 sec
epoch 2, loss 1.3058, train acc 0.485, test acc 0.665, time 5.3 sec
epoch 3, loss 0.8425, train acc 0.672, test acc 0.717, time 5.3 sec
epoch 4, loss 0.7087, train acc 0.720, test acc 0.749, time 5.3 sec
epoch 5, loss 0.6369, train acc 0.747, test acc 0.759, time 5.3 sec


#60

lenet还好吧,从alexnet开始就顶不住了,一个epoch要几个小时跑。


#61

请问try_gpu()函数中mx.gpu()默认的是使用gpu 0,这是我笔记本的集成显卡,我现在想使用nvidia的独显,是gpu 1,但是我在mx.gpu(1)已经设置了,但是最后却打印出了cpu(0),应该是报错了,请问这种问题该怎么解决?


#62

书中都是直接使用Fasion-mnist数据集,那想自己做一个数据集用来测试要怎么做呢?