深度学习笔记-深层神经网络


深层神经网络符号表示

我们先来看一下深层神经网络的结构,

我们先表示一下符号:

  • 用L=n表示一个n层的神经网络。

核对矩阵的维数

在深度神经网络里面,我们经常会check数据是否出现问题?这个时候我们对于矩阵维数的核对显得非常重要。下面我们看一个简单的例子:

先从单个实例的深度神经网络信息如下:

感知机算法

我们通过一个简单的实例来解释运行上面我们得出的结论,通过FashionMNIST多分类感知机算法,在浅层神经网络里面增加一个隐藏层。我们通过mxnet逐步实现多分类,mxnet也在李沐mxnet中国社区里面介绍的很详细,这个例子我们定义一个只有一个隐含层的模型,这个隐含层输出256个节点。

from mxnet import gluon
from mxnet import nd
from mxnet import image
from mxnet.gluon import nn
import mxnet as mx
import numpy as np

class DataLoader(object):
    """similiar to gluon.data.DataLoader, but might be faster.

    The main difference this data loader tries to read more exmaples each
    time. But the limits are 1) all examples in dataset have the same shape, 2)
    data transfomer needs to process multiple examples at each time
    """
    def __init__(self, dataset, batch_size, shuffle):
        self.dataset = dataset
        self.batch_size = batch_size
        self.shuffle = shuffle

    def __iter__(self):
        data = self.dataset[:]
        X = data[0]
        y = nd.array(data[1])
        n = X.shape[0]
        if self.shuffle:
            idx = np.arange(n)
            np.random.shuffle(idx)
            X = nd.array(X.asnumpy()[idx])
            y = nd.array(y.asnumpy()[idx])

        for i in range(n//self.batch_size):
            yield (X[i*self.batch_size:(i+1)*self.batch_size],
                   y[i*self.batch_size:(i+1)*self.batch_size])

    def __len__(self):
        return len(self.dataset)//self.batch_size

def load_data_fashion_mnist(batch_size, resize=None, root="~/project/mxnet/datasets/fashion-mnist"):
    """下载 fashion mnist 单色图片,并后续加载到内存里面。"""
    def transform_mnist(data, label):
	"""对数据进行转换为浮点数和resize"""
        if resize:
            n = data.shape[0]
            new_data = nd.zeros((n, resize, resize, data.shape[3]))
            for i in range(n):
                new_data[i] = image.imresize(data[i], resize, resize)
            data = new_data
        return nd.transpose(data.astype('float32'), (0,3,1,2))/255, label.astype('float32')
	# 训练数据的加载,train代表是否为训练数据集。
    mnist_train = gluon.data.vision.FashionMNIST(root=root, train=True, transform=transform_mnist)
	# 测试数据集的加载
    mnist_test = gluon.data.vision.FashionMNIST(root=root, train=False, transform=transform_mnist)
	# 将得到的数据进行数据处理,可以提高数据处理速度。
    train_data = DataLoader(mnist_train, batch_size, shuffle=True)
    test_data = DataLoader(mnist_test, batch_size, shuffle=False)
    return (train_data, test_data)

1.首先我们需要准备训练数据和测试数据集以及参数初始化。

from mxnet import ndarray as nd
# Fashion MNIST 是单色图像(灰度图像)height:28px,width:28px.
num_inputs = 28*28
#我们的输出为0-9手写字,输出结果分类。
num_outputs = 10
#隐藏层的神经元节点
num_hidden = 256
#权重scale
weight_scale = .01
#对W1权重进行初始化
W1 = nd.random_normal(shape=(num_inputs, num_hidden), scale=weight_scale)
#对b1进行初始化
b1 = nd.zeros(num_hidden)
#对W2进行初始化
W2 = nd.random_normal(shape=(num_hidden, num_outputs), scale=weight_scale)
b2 = nd.zeros(num_outputs)

params = [W1, b1, W2, b2]
#对参数进行求导时分配内存空间
for param in params:
    param.attach_grad()

2.我们使用reLu非线性激活函数作为神经网络的激活函数。

def relu(X):
    return nd.maximum(X, 0)

3.定义神经网络模型。

def net(X):
    X = X.reshape((-1, num_inputs))
    h1 = relu(nd.dot(X, W1) + b1)
    output = nd.dot(h1, W2) + b2
    return output

4.定义衡量损失函数 在多类Logistic回归里我们提到分开实现Softmax和交叉熵损失函数可能导致数值不稳定。这里我们直接使用Gluon提供的函数。

from mxnet import gluon
softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()

5.定义随机梯度算法

def SGD(params, lr):
    for param in params:
        param[:] = param - lr * param.grad

6.进行训练和测试

from mxnet import autograd as autograd
learning_rate = .5
for epoch in range(5):
    train_loss = 0.
    train_acc = 0.
    for data, label in train_data:
        with autograd.record():
            output = net(data)
            loss = softmax_cross_entropy(output, label)
        loss.backward()
        SGD(params, learning_rate/batch_size)
        train_loss += nd.mean(loss).asscalar()
        train_acc += utils.accuracy(output, label)
    test_acc = utils.evaluate_accuracy(test_data, net)
    print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % (
        epoch, train_loss/len(train_data),
        train_acc/len(train_data), test_acc))
#output
Epoch 0. Loss: 0.825024, Train acc 0.695813, Test acc 0.792167
Epoch 1. Loss: 0.497659, Train acc 0.815288, Test acc 0.821314
Epoch 2. Loss: 0.436145, Train acc 0.838325, Test acc 0.852264
Epoch 3. Loss: 0.396678, Train acc 0.853582, Test acc 0.864083
Epoch 4. Loss: 0.375521, Train acc 0.862213, Test acc 0.837540

使用Gluon作用感知器多分类算法

加载数据时一致的,主要区别是我们这边采用了mxnet提供的定义模型。

from mxnet import gluon
net = gluon.nn.Sequential()
with net.name_scope():
    net.add(gluon.nn.Flatten())
    net.add(gluon.nn.Dense(256, activation="relu"))
    net.add(gluon.nn.Dense(10))
net.initialize()

读取数据并训练,如下:

from mxnet import ndarray as nd
from mxnet import autograd

batch_size = 256
train_data, test_data = utils.load_data_fashion_mnist(batch_size)
softmax_cross_entropy = gluon.loss.SoftmaxCrossEntropyLoss()
trainer = gluon.Trainer(net.collect_params(), 'sgd', {'learning_rate': 0.5})

for epoch in range(5):
    train_loss = 0.
    train_acc = 0.
    for data, label in train_data:
        with autograd.record():
            output = net(data)
            loss = softmax_cross_entropy(output, label)
        loss.backward()
        trainer.step(batch_size)

        train_loss += nd.mean(loss).asscalar()
        train_acc += accuracy(output, label)

    test_acc = evaluate_accuracy(test_data, net)
    print("Epoch %d. Loss: %f, Train acc %f, Test acc %f" % (
        epoch, train_loss/len(train_data), train_acc/len(train_data), test_acc))
#output
Epoch 0. Loss: 0.734776, Train acc 0.730536, Test acc 0.801182
Epoch 1. Loss: 0.468885, Train acc 0.827741, Test acc 0.798878
Epoch 2. Loss: 0.423539, Train acc 0.843249, Test acc 0.860677
Epoch 3. Loss: 0.379952, Train acc 0.860911, Test acc 0.839844
Epoch 4. Loss: 0.361828, Train acc 0.866403, Test acc 0.855168

深度有效

多层深度学习为什么有效,特别是在含有多个隐藏层训练效果会稍好?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏华章科技

与数据挖掘有关或有帮助的R包和函数的集合

rpart,party,randomForest,rpartOrdinal,tree,marginTree,

853
来自专栏PPV课数据科学社区

【学习】干货:与数据挖掘有关或有帮助的R包和函数的集合

与数据挖掘有关或者有帮助的R包和函数的集合。 1、聚类 常用的包: fpc,cluster,pvclust,mclust 基于划分的方法: kmeans, pa...

2685
来自专栏AI研习社

详解自动识别验证码,LSTM大显身手

这是去年博主心血来潮实现的一个小模型,现在把它总结一下。由于楼主比较懒,网上许多方法都需要切割图片,但是楼主思索了一下感觉让模型有多个输出就可以了呀,没必要一定...

4148
来自专栏AI研习社

一文教你如何用神经网络识别验证码!

AI 研习社按:本文作者 Slyne_D,原载于作者个人博客,雷锋网 AI 研习社已获授权。文中相关链接详见文末“阅读原文”。 这是去年博主心血来潮实现的一个小...

2973
来自专栏AI-Master

TensorFlow实现XOR

tf.train.GradientDescentOptimizer是实现梯度下降算法的优化器。

911
来自专栏数据结构与算法

圆的反演变换

挺神奇的东西,网上没有多少资料,我也不是太懂,代码什么的都没写过,那就抄一下百度百科吧

1382
来自专栏小鹏的专栏

机器学习算法应用中常用技巧-2

7. 降维-PCA n_components为降到多少维,用原数据fit后,再用transform转换成降维后的数据。 from sklearn.decom...

19110
来自专栏LhWorld哥陪你聊算法

【Keras篇】---Keras初始,两种模型构造方法,利用keras实现手写数字体识别

Keras 适合快速体验 ,keras的设计是把大量内部运算都隐藏了,用户始终可以用theano或tensorflow的语句来写扩展功能并和keras结合使用。

1252
来自专栏人工智能LeadAI

图像学习-验证码识别

这是去年博主心血来潮实现的一个小模型,现在把它总结一下。由于楼主比较懒,网上许多方法都需要切割图片,但是楼主思索了一下感觉让模型有多个输出就可以了呀,没必要一定...

6184
来自专栏数据科学学习手札

(数据科学学习手札44)在Keras中训练多层感知机

  Keras是有着自主的一套前端控制语法,后端基于tensorflow和theano的深度学习框架,因为其搭建神经网络简单快捷明了的语法风格,可以帮助使用者更...

1996

扫码关注云+社区

领取腾讯云代金券