机器学习之搭建属于你的第一个神经网络


文章代码来源:《deep learning on keras》,非常好的一本书,大家如果英语好,推荐直接阅读该书,如果时间不够,可以看看此系列文章


还记得第一次跑出自己的神经网络的那种欣喜感,仿佛是看着自己的第一个孩子出生了一样。为了让更多人尽快也体验的这种欣喜感,特此总结此系列教程,代码来自书<deep learning on keras>.
简要介绍一下我们需要的:

  • 安装annaconda,它自带的很多科学计算包能够省掉很多我们自己安装的麻烦
  • 打开cmd,输入pip install tensorflow,默认安装的是cpu版tensorflow,对于我们这新手级别的,已经够用了,要装gpu版比较麻烦
  • 在装好tensorflow以后再pip install keras,这个keras是基于tensorflow或者caffe的,我习惯使用tensorflow,keras是在tensorflow上的进一步封装,使用起来非常简单,我们只需要把精力放在网络结构的搭建上就够了。

引入库和数据集

此处我们引入MNIST数据集,这是一个手写数字数据集,由60000个训练集和10000个测试集构成。

import keras
from keras.datasets import mnist
(trainimages, trainlabels), (testimages, testlabels) = mnist.loaddata()

这句代码表示调用数据集mnist,把训练图片和标签分别存到trainimages和trainlabels里面,测试图片和标签分别存在testimages和testlabels里面。
接下来我们看一看具体是如何储存这些数据的:

>>> train_images.shape
(60000, 28, 28)
>>> len(train_labels)
60000
>>> train_labels
array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)

我们看到计算机使用数组的形式来储存这些数据,(60000,28,28)代表着有60000个图片,每一个的大小是28*28。而labels则更加直接,每一个位置对应于图片的位置为数字的大小。
接下来,看一下测试集的情况,其实完全类似:

>>> test_images.shape
(10000, 28, 28)
>>> len(test_labels)
10000
>>> test_labels
array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)

搭建训练框架

from keras import models
from keras import layers
network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

我们从keras引入了models 和layers,前者用来搭建整个模型框架。

  • models.Sequential()这一句代表我们之后加layers是按照顺序从前往后加。
  • 至于layers.Dense则是设置这一层的具体参数第一个为输出维度,第二项为激活函数类型,第三维为输入的形状,我们看到shape的第二项逗号之后没有东西,这个是根据输入数据来自动补的,例如我们输入数据为

在这里插入图片描述

个,那么第二项则是

在这里插入图片描述

,也就是说总数一定要是

在这里插入图片描述

的整数倍,不然会报错。

  • 第二层layers输出为10,激活函数为softmax,就是将10个输出里面最大取1,最小取0,最后就得到了我们需要的预测值,至于为什么这里不需要输入,这就是keras的好处了,它自动计算需要的输入的大小,所以我们只需要关心最开始的输入大小,不需要逐层计算每一层的大小,这对于深层网络的搭建非常方便。
  • network.compile(optimizer='rmsprop',
      loss='categorical_crossentropy',
      metrics=['accuracy'])
    

    设置优化器,损失函数,还有需要显示的指标,这三个都是可以改的,大家可以

    在这里插入图片描述

    来查看更多有关这些参数的东西。

    预处理数据和标签

    train_images = train_images.reshape((60000, 28 * 28))
    train_images = train_images.astype('float32') / 255
    test_images = test_images.reshape((10000, 28 * 28))
    testimages = testimages.astype('float32') / 255
    

    输入的图像是unit8类型的,我们转化为float32,因为python里面很多运算只支持float32类型,然后将形状拉长为28*28的,因为我们构建的网络是一个简单的全连接网络,也就是逐个像素点的预测,最后是归一化的问题,由于像素值一开始都是0-255,我曾经就感到很奇怪为什么要全部归一化到0-1,不就是等比例缩放吗,为什么会影响到收敛性呢,感兴趣的同学可以搜索神经网络正则化相关的知识。

    from keras.utils import to_categorical
    train_labels = to_categorical(train_labels)
    testlabels = tocategorical(testlabels)
    

    对标签下手,将原来的十个数字转化成分类的编码,这个具体为什么以后会再详细介绍。

    开始训练!

    >>> network.fit(train_images, train_labels, epochs=5, batch_size=128)
    Epoch 1/5
    60000/60000 [==============================] - 9s - loss: 0.2524 - acc: 0.927
    Epoch 2/5
    51328/60000 [========================>.....] - ETA: 1s - loss: 0.1035 - acc: 0.9692
    

    keras还有一个好处就是它的可视化做的比较好,开始训练以后,有一个动态的小箭头告诉你训练到什么程度了,让人感到很舒服。再解释一下代码,第一项,放入训练数据,第二项放入对应的标签,epochs代表要训练多少批次,因为这个优化是一个循环往复的过程,需要不断的循环才能逐渐靠近最优,最后就是batch_size,这是minibatch,这也是正则化相关内容,如果每次都将全部的数据集放进来才训练一次,那么我们的训练进度就会很慢,所以我们就会把数据分成很多小批次,一次喂一点进去,而为什么偏偏是128呢,这是因为计算机是二进制的,给它2的次方的数,运算会更加快。

    评估训练效果

    >>> test_loss, test_acc = network.evaluate(test_images, test_labels)
    >>> print('test_acc:', test_acc
    testacc: 0.9785
    

    通过上述指令,在训练完以后network输入测试集和对应的标签来进行测试。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Python单隐层神经网络是一种基于Python语言编写的神经网络模型,具有一个输入层、一个隐藏层和一个输出层的结构。 单隐层神经网络是一种较为简单的神经网络模型,但仍然具有一定的强大能力。在模型中,输入层接收外部输入数据,隐藏层通过一系列的权重和激活函数对输入进行处理,并将结果传递给输出层。 训练过程中,我们需要通过训练数据来调整网络中的权重,以期望输出与实际输出之间的误差最小化。这个过程通常使用优化算法例如梯度下降法来实现。训练过程中,我们不断迭代调整权重,直到误差最小化。 在使用Python实现单隐层神经网络时,我们可以利用一些开源的机器学习库,如TensorFlow、PyTorch或Keras等。这些库提供了丰富的函数和工具,使得神经网络搭建变得更加简单和高效。 我们需要定义神经网络的层数、每个层的节点数、激活函数、损失函数等参数。然后,可以使用标准的前向传播和反向传播算法来进行训练,以更新权重和偏差,使得网络能够准确预测未知数据。 总之,Python单隐层神经网络是一种用于模式识别和数据预测的强大工具。它的实现相对简单,但对于许多问题来说仍然具有很好的性能。通过利用Python语言和相关机器学习库,我们可以更加便捷地构建和训练这种神经网络模型。 ### 回答2: Python单隐层神经网络是一种基于Python编程语言的人工神经网络模型,只包含一个隐藏层的神经网络结构。 单隐层神经网络由输入层、隐藏层和输出层组成。输入层接收外部输入数据,隐藏层通过一组权重和偏置进行计算,最后输出层生成预测结果。隐藏层中的神经元数量和上述权重和偏置是通过训练过程中学习得出的,以最大程度地减小模型的预测误差。 在Python中,可以使用其他第三方库(如TensorFlow或Keras)来实现单隐层神经网络。首先,需要定义神经网络的结构和参数,包括输入层、隐藏层和输出层的神经元数量。然后,通过矩阵运算和激活函数,将输入数据从输入层传递到隐藏层,再从隐藏层传递到输出层。在训练过程中,可以使用反向传播算法来不断调整权重和偏置,以提高模型的准确性。一般使用梯度下降法更新网络的参数。 单隐层神经网络在某些简单的问题上具有较好的预测性能,但对于复杂的问题,可能需要更深层的神经网络结构来提高模型的表达能力和预测准确性。同时,在构建神经网络模型时,还需要根据具体问题选择合适的激活函数、损失函数和优化算法,以及进行有效的模型训练和评估。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值