- 前言
- 一、神经网络的构造与训练
- 1.构建网络
- 2.编译网络
- 3.训练网络
- 二、举个栗子:
或许你差不多理解神经网络,知道神经网络可以理解为一个网,每个网是由多个层堆叠连接起来的。但却没有实 *** 训练过一个自己的网络,下面将结合代码讲解如何训练一个简单的神经网络。
一、神经网络的构造与训练神经网络的核心组件是层(layer),它是一种数据处理模块,你可以将它看成数据过滤器。 进去一些数据,出来的数据变得更加有用。具体来说,层从输入数据中提取表示——我们期望这种表示有助于解决手头的问题。大多数深度学习都是将简单的层链接起来,从而实现渐进式的数据蒸馏。深度学习模型就像是数据处理的筛子,包含一系列越来越精细的数据过滤器。
训练一个神经网路的步骤一般为:构建网络 -> 编译网路 -> 训练网络。下面来详细讲解流程,使用python的Keras库来学习:
1.构建网络网络的构建就是layers的堆叠,一般调用 models.Sequential()函数来创建一个网络,使用add来添加网络层。
如以下例子是个简单的两层神经网络,包括2个Dense层,叫做密集连接层或全连接层,是神经网络作为分类器很常用的层。
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'))
可以看到与第一个层即输入层带有三个参数,第一个参数就是该层网络的输出特征,512表示输出特征有512个通道;第二个参数是该层使用的激活函数,可以理解为输入经过激活函数计算后得到输出特征;第三个参数是输入数据的形状,需要根据你的输入数据调整。激活函数的选择要根据数据的预测类型进行选择。
第二层是一个 10 通道的输出层,使用的激活函数是 ‘softmax’ 它将返回一个由 10 个概率值(总和为 1)组成的数组。每个概率值表示当前数字图像属于 10 个数字类别中某一个的概率。
构建好网络后就要对网络进行编译,调用compile()函数进行编译
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
编译时需要我们对三个参数进行选择:
损失函数(loss):网络如何衡量在训练数据上的性能,即网络如何朝着正确的方向前进。
优化器(optimizer):基于训练数据和损失函数来更新网络的机制。
在训练和测试过程中需要监控的指标(metrics):精度或者损失,即正确分类的图像所占的比例。
模型要解决的问题(分类/回归等)不同,损失函数等参数的选择也不同。
网络对输入数据的形状一般都会有要求,所以开始训练网络前需要对输入数据进行预处理,对标签也需要进行编码。做好这些 *** 作就可以把训练集(特征+标签)放入编译好的网络中进行训练,一般是调用网络的fit方法来进行训练:
network.fit(train_images, train_labels, epochs=5, batch_size=128)
在fiit函数中放入训练集特征与标签,然后需要设置迭代次数epochs,表示网络循环训练的次数,每训练一轮网络会根据编译时设置的损失函数计算网络的损失值(即预测值与真实值之间的距离),损失越小越好;接着网络的优化器会根据上一轮训练得到的损失值来调整网络,然后接着进行下一轮训练,直到迭代结束。如上例子该次网络训练进行了5次迭代,得到的最终结果精度就是本次网络训练得到的精确度。
二、举个栗子:接下来使用 “MNIST” 数据集作为例子来进行研究,该数据集是机器学习领域的一个经典数据集,解决”MNIST ”问题可以看作深度学习的“Hello World”。
要解决的问题是,将手写数字的灰度图像(28 ×28 )划分到 10 个类别(0~9)。这个数据集包含 60000 张训练图像和 10000 张测试图像。
keras库中有这个数据集,可以直接从库下载导入。
#导入数据集
from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images.shape#看下数据的维度
#构建网络
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'))
#编译网路
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))
test_images = test_images.astype('float32') / 255
#对标签进行编码
from keras.utils import to_categorical
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
#模型训练
network.fit(train_images, train_labels, epochs=5, batch_size=128)
训练过程中显示了两个数字:一个是网络在训练数据上的损失(loss),另一个是网络在 训练数据上的精度(acc)。
可以看出在训练集上的最终精度为(98.9%),接着将模型用到测试集上看性能
test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)
test_acc: 0.9785
可以看到测试集精度为 97.8%,比训练集精度低不少。训练精度和测试精度之间的这种差距是过拟合造成的。过拟合是神经网络模型普遍存在的显现,偶尔还会存在欠拟合,神经网络的训练很重要的就是要解决欠拟合的问题来提高模型范化能力。
一个简单的模型训练就完成了,根据激活函数,损失函数的不同选择可以解决不同的预测问题,如二分类,多分类,回归等。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)