人工神经网络(ANN)是一种高效的计算系统,其核心主题借鉴了生物神经网络的类比。神经网络是机器学习的一种模型类型。在20世纪80年代中期和90年代初,神经网络取得了许多重要的架构进步。在本章中,你将深入了解深度学习,这是一种人工智能的方法。
深度学习源自数十年计算爆炸性增长,成为该领域的有力竞争者。因此,深度学习是一种特殊的机器学习,其算法灵感来源于人脑的结构和功能。
机器学习与深度学习
深度学习是当今最强大的机器学习技术。它之所以强大,是因为他们在学习如何解决问题的同时,学会了最佳的表达问题方式。深度学习与机器学习的比较如下 −
数据依赖
第一个区别点基于数据规模增加时DL和ML的性能。当数据量很大时,深度学习算法表现非常好。
机器依赖
深度学习算法需要高端机器才能完美运行。另一方面,机器学习算法也可以在低端设备上工作。
特征提取
深度学习算法可以提取高层特征并尝试从中学习。另一方面,专家需要识别机器学习提取的大部分特征。
执行时间
执行时间取决于算法中使用的众多参数。深度学习的参数比机器学习算法更多。因此,DL算法的执行时间,尤其是训练时间,远远超过机器学习算法。但深度学习算法的测试时间比机器学习算法短。
问题解决方法
深度学习从头到尾解决问题,而机器学习则采用传统的解决问题方式,即将其拆解为多个部分。
卷积神经网络(CNN)
卷积神经网络与普通神经网络相同,因为它们同样由具有可学习权重和偏差的神经元组成。普通神经网络忽略输入数据的结构,所有数据在输入网络前都会被转换为一维数组。该过程适用于常规数据,但如果数据包含图像,过程可能会繁琐。
CNN轻松解决了这个问题。它在处理图像时考虑了图像的二维结构,从而能够提取图像特有的属性。通过这种方式,CNN的主要目标是从输入层的原始图像数据过渡到输出层的正确类别。普通神经网络和CNN的唯一区别在于输入数据的处理方式和层的类型。
CNN的架构概述
在结构上,普通神经网络接收输入并通过一系列隐藏层进行转换。每一层通过神经元的帮助与另一层相连。普通神经网络的主要缺点是它们不适合扩展到完整图像。
CNN的架构中,神经元按三维结构排列,分别是宽度、高度和深度。当前层的每个神经元都连接到上一层输出的一小块。这类似于在输入图像上叠加滤波器。它使用M滤波器以确保获得所有细节。这些M滤波器是特征提取器,提取边缘、角点等特征。
用于构建卷积神经网络的层
以下层用于构建卷积神经网络 −
输入层− 它直接接收原始图像数据。
卷积层− 这一层是卷积神经网络的核心构建模块,负责大部分计算。这一层计算神经元与输入中各个片段之间的卷积。
整流线性单位层− 它对前一层的输出应用激活函数。它为网络增加了非线性,使其能够很好地推广到任何类型的函数。
池层− 池化帮助我们在网络中只保留重要部分。池层独立于输入的每个深度切片上工作,并在空间上调整其大小。它使用了MAX功能。
全连通层/输出层− 该层计算最后一层的输出分数。最终输出大小为 ,其中 L 是训练数据集的数量。
安装有用的 Python 包
你可以用Keras,这是一个用Python编写的高级神经网络API,可以运行在TensorFlow、CNTK或Theno之上。它兼容 Python 2.7-3.6。你可以从 https://keras.io/ 了解更多。
使用以下命令安装keras−
pip install keras在conda环境下,你可以使用以下命令 −
conda install c conda-forge keras利用人工神经网络构建线性回归器
在本节中,你将学习如何利用人工神经网络构建线性回归器。你可以用KerasRegressor来实现这个目标。在这个例子中,我们使用波士顿房价数据集,其中有13个数值数据,针对波士顿的房产。该 Python 代码如下所示 −
导入所有所需软件包,如图所示 −
import numpy import pandas from keras.models import Sequential from keras.layers import Dense from keras.wrappers.scikit_learn import KerasRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold现在,加载保存在本地目录中的数据集。
dataframe = pandas.read_csv("/Usrrs/admin/data.csv", delim_whitespace = True, header = None) dataset = dataframe.values现在,将数据分为输入和输出变量,即X和Y −
X = dataset[:,0:13] Y = dataset[:,13]由于我们使用基线神经网络,定义模型−
def baseline_model():现在,创建模型如下 −
model_regressor = Sequential() model_regressor.add(Dense(13, input_dim = 13, kernel_initializer = 'normal', activation = 'relu')) model_regressor.add(Dense(1, kernel_initializer = 'normal'))接着,编译模型−
model_regressor.compile(loss='mean_squared_error', optimizer='adam') return model_regressor现在,将随机种子固定为以下可重复性 −
model_regressor.compile(loss='mean_squared_error', optimizer='adam') return model_regressor现在,将随机种子固定为以下可重复性 −
seed = 7 numpy.random.seed(seed)用于scikit-learn的 Keras 包装对象称为KerasRegressor。在本节中,我们将用标准化数据集来评估该模型。
estimator = KerasRegressor(build_fn = baseline_model, nb_epoch = 100, batch_size = 5, verbose = 0) kfold = KFold(n_splits = 10, random_state = seed) baseline_result = cross_val_score(estimator, X, Y, cv = kfold) print("Baseline: %.2f (%.2f) MSE" % (Baseline_result.mean(),Baseline_result.std()))上述代码的输出将是模型在未见数据问题上的表现估计值。它将是均方误差,包括交叉验证评估中所有10个折面的平均和标准差。
图像分类器:深度学习的应用
卷积神经网络(CNN)解决了一个图像分类问题,即输入图像属于哪个类别。你可以使用 Keras 深度学习库。请注意,我们使用的是来自以下链接 https://www.kaggle.com/c/dogs-vs-cats/data 的猫狗训练和测试图像数据集。
导入重要的 Keras 库和包,如图所示 −
以下称为sequential的包将以顺序网络初始化神经网络。
from keras.models import Sequential以下称为Conv2D的包用于执行卷积作,即CNN的第一步。
from keras.layers import Conv2D以下软件包称为MaxPoling2D,用于执行池化作,这是CNN的第二步。
from keras.layers import MaxPooling2D以下软件包称为Flatten,是将所有所得二维数组转换为单一长连续线性向量的过程。
from keras.layers import Flatten以下称为Dense的软件包用于实现神经网络的全连接,这是CNN的第四步。
from keras.layers import Dense现在,创建一个顺序类对象。
S_classifier = Sequential()接下来,是编写卷积部分。
S_classifier.add(Conv2D(32, (3, 3), input_shape = (64, 64, 3), activation = 'relu'))这里relu是整流函数。
现在,CNN的下一步是在卷积部分后对所得特征映射进行池化作。
S-classifier.add(MaxPooling2D(pool_size = (2, 2)))现在,利用 恭维化 − 将所有合并的图像转换为连续向量
S_classifier.add(Flatten())接下来,创建一个全连通的层。
S_classifier.add(Dense(units = 128, activation = 'relu'))这里,128 是隐藏单元的数量。通常将隐藏单元数定义为2的幂次方。
现在,初始化输出层如下 −
S_classifier.add(Dense(units = 1, activation = 'sigmoid'))现在,编译CNN,我们已经构建了——
S_classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])这里的优化参数是选择随机梯度下降算法,损失参数是选择损失函数,度量参数是选择性能指标。
现在,进行图像增强,然后将图像拟合到神经网络中——
train_datagen = ImageDataGenerator(rescale = 1./255,shear_range = 0.2, zoom_range = 0.2, horizontal_flip = True) test_datagen = ImageDataGenerator(rescale = 1./255) training_set = train_datagen.flow_from_directory(/Users/admin/training_set,target_size = (64, 64),batch_size = 32,class_mode = 'binary') test_set = test_datagen.flow_from_directory('test_set',target_size = (64, 64),batch_size = 32,class_mode = 'binary')现在,将数据拟合到我们创建的模型——
classifier.fit_generator(training_set,steps_per_epoch = 8000,epochs = 25,validation_data = test_set,validation_steps = 2000)这里steps_per_epoch训练图像的数量。
现在模型已经训练好,我们可以用它进行如下预测 −
from keras.preprocessing import image test_image = image.load_img('dataset/single_prediction/cat_or_dog_1.jpg', target_size = (64, 64)) test_image = image.img_to_array(test_image) test_image = np.expand_dims(test_image, axis = 0) result = classifier.predict(test_image) training_set.class_indices if result[0][0] == 1: prediction = 'dog' else: prediction = 'cat'