精华内容
下载资源
问答
  • 在本教程中,您将学习如何将Keras用于多输入和混合数据。 您将了解如何定义一Keras体系结构,该体系结构能够接受多种输入,包括数字、分类和图像数据。然后,我们将在此混合数据上训练单个端到端网络。 今天是我们...


    点击此处下载源代码:https://jbox.sjtu.edu.cn/l/NHfFZu
    在这里插入图片描述

    摘要

    在本教程中,您将学习如何将Keras用于多输入和混合数据。

    您将了解如何定义一个Keras网络结构,该网络结构能够接受多种输入,包括数字、类别和图像等多种数据。然后,我们将在混合数据上训练一个端到端的网络。

    这是我们有关Keras和回归问题的三篇系列文章的最后一篇:

    1. 第一篇:基于Keras的基本回归问题
    2. 第二篇:基于Keras训练一个CNN网络,用于预测回归数值
    3. 第三篇:多输入和混合数据输入

    在本系列文章中,我们以回归预测房价作为背景。

    我们正在使用的房价数据集不仅包括数值类别数据,同样也包括图像数据,我们称之为多种类型的混合数据。我们的模型需要能够接受多种类型的混合数据输入,并且计算得出回归问题的输出值。

    在本教程的其余部分,您将学习如何:

    1. 定义一个Keras模型,该模型能够同时接受多个类型的输入数据,包括数值、类别和图像等类型的数据。
    2. 在混合数据输入上训练端到端的Keras模型。
    3. 使用多个输入来评估我们的模型。

    要了解更多关于使用Keras的多个输入和混合数据的信息,请继续阅读!

    正文

    Keras: 创建多个输入以及混合数据输入的神经网络模型

    在本教程的第一部分中,我们将简要回顾混合数据的概念以及Keras如何接受多个类型输入数据
    接下来,我们将介绍我们的房价数据集和该数据集的目录结构。
    接下来,我将向您展示如何:

    1. 从磁盘加载数值、类别和图像类型的数据。
    2. 对数据进行预处理,以便进行网络的训练。
    3. 准备好混合数据,使其可以应用于一个多输入的Keras网络。

    一旦我们的数据准备好,您将了解如何通过Keras定义和训练一个多输入的端到端网络模型。
    最后,我们将使用测试集中的多输入和混合数据模型对模型进行评估,并将结果与本系列之前的文章进行比较。

    什么是混合数据?

    在这里插入图片描述

    图1:使用灵活的Keras深度学习框架,可以定义一个多输入模型,其分别包括CNN和MLP分支来分别处理混合数据。

    混合数据指的是同时使用不同数据类型的输入数据。
    例如,假设我们是在一家医院工作的机器学习工程师,要开发一个能够对病人的健康状况进行分类的系统。
    我们拥有一个病人的多种类型的输入数据,包括:

    1. 数值/连续值,如年龄、心率、血压
    2. 类别值,包括性别和种族
    3. 图像数据,如MRI、x片等。

    我们的机器学习模型必须能够将这些**“混合数据”**,并对病人的健康状况做出(准确的)预测。

    开发能够处理混合数据的机器学习系统非常具有挑战性,因为每种数据类型可能需要单独的预处理步骤,包括缩放、标准化和特征工程(feature engineering)。

    处理混合数据仍然是一个非常开放的研究领域,并且常常严重依赖于特定的任务/目标。

    在今天的教程中,我们将使用混合数据来帮助您了解与之相关的一些挑战。

    Keras如何接受多个输入?

    在这里插入图片描述

    图2:相对于它的顺序API, Keras的函数API(functional API)允许更复杂的模型。在这篇博客文章中,我们使用函数API来创建一个包含多个输入和混合数据的模型,用于房价预测。

    Keras能够通过它的函数API处理多个输入(甚至多个输出)。

    您以前肯定通过Sequential 类使用过顺序式API,函数式API与之相反相反,可用于定义非顺序的复杂得多的模型,包括:

    • 多输入模型
    • 多输出模型
    • 模型包括多个输入和多个输出
    • 有向无环图
    • 具有共享层的模型

    例如,我们可以将一个简单的序列神经网络定义为:

    model = Sequential()
    model.add(Dense(8, input_shape=(10,), activation="relu"))
    model.add(Dense(4, activation="relu"))
    model.add(Dense(1, activation="linear"))
    

    该网络是一个简单的前馈神经网络,有10个输入,第一个隐层有8个节点,第二个隐层有4个节点,最后一个输出层用于回归。

    我们可以使用functional API定义样本神经网络:

    inputs = Input(shape=(10,))
    x = Dense(8, activation="relu")(inputs)
    x = Dense(4, activation="relu")(x)
    x = Dense(1, activation="linear")(x)
    model = Model(inputs, x)
    

    这样,我们就不再依赖于Sequential类。

    为了了解Keras函数API的强大功能,请考虑以下代码,其中我们创建了一个接受多个输入的模型:

    # define two sets of inputs
    inputA = Input(shape=(32,))
    inputB = Input(shape=(128,))
     
    # the first branch operates on the first input
    x = Dense(8, activation="relu")(inputA)
    x = Dense(4, activation="relu")(x)
    x = Model(inputs=inputA, outputs=x)
     
    # the second branch opreates on the second input
    y = Dense(64, activation="relu")(inputB)
    y = Dense(32, activation="relu")(y)
    y = Dense(4, activation="relu")(y)
    y = Model(inputs=inputB, outputs=y)
     
    # combine the output of the two branches
    combined = concatenate([x.output, y.output])
     
    # apply a FC layer and then a regression prediction on the
    # combined outputs
    z = Dense(2, activation="relu")(combined)
    z = Dense(1, activation="linear")(z)
     
    # our model will accept the inputs of the two branches and
    # then output a single value
    model = Model(inputs=[x.input, y.input], outputs=z)
    

    这里你可以看到我们定义了Keras神经网络的两个输入:

    • inputA: 32维
    • inputB: 128维

    第21-23行:使用Keras函数API定义了一个简单的32-8-4网络。
    第26-29行:定义了一个128-64-32-4网络。
    第32行将x和y的输出组合起来。x和y的输出都是4维,所以一旦我们把它们连接起来,就得到一个8维的向量。
    然后在第36行和第37行上应用两个全连接层。第一层有2个节点,然后是ReLU激活,第二层只有一个带有线性激活层的节点。
    构建多输入模型的最后一步,是定义一个模型(Model)对象:

    • 接受我们的两个输入
    • 将输出定义为FC层的输出(即z)

    如果您使用Keras来可视化模型架构,它将看起来像这样:
    在这里插入图片描述

    图3:这个模型有两个输入分支,它们最终合并并产生一个输出。Keras函数API允许这种类型的体系结构,你也可以构建任何其他您可以想象的架构。

    注意我们的模型有两个不同的分支。

    第一个分支接受128维输入,而第二个分支接受32维输入。这些分支在连接之前彼此独立运行,连接之后输出一个值。
    在本教程的其余部分中,您将学习如何使用Keras创建多输入的网络。

    房价数据集

    在这里插入图片描述

    图4:房价数据集包括数值数据,类别数据和图像数据。使用Keras,我们将构建一个支持多种输入和混合数据类型的模型,并且通过这个回归模型预测房屋的价值。

    在这一系列文章中,我们使用了Ahmed和Mustafa在2016年发表的论文《从视觉和文本特征估计房价》(House price estimate from visual and text features)中的房价数据集。

    这个数据集包括535个示例房屋的数值数据,类别数据以及图像数据。

    数值属性和分类属性包括:

    1. 卧室的数量
    2. 浴室的数量
    3. 区域(面积)
    4. 邮政编码

    每栋房子一共提供了四幅图片:

    1. 卧室
    2. 浴室
    3. 厨房
    4. 房子的正面

    在本系列的第一篇文章中,您学习了如何根据数值和分类数据训练Keras回归网络。
    在本系列的第二篇文章中,您学习了如何使用Keras CNN进行回归。
    今天我们将使用Keras处理多个输入和混合数据。

    我们将接受数值数据,类别数据和图像数据,通过定义网络的两个分支来处理每种类型的数据,最后将这些分支合并起来,得到我们最终的房价预测。通过这种方式,我们将能够利用Keras处理多个输入和混合数据。

    获取房价数据集

    点击此处下载源代码:https://jbox.sjtu.edu.cn/l/NHfFZu

    一旦你有了zip文件,导航到文件所在的目录,并提取文件:

    $ cd path/to/zip
    $ unzip keras-multi-input.zip
    $ cd keras-multi-input
    

    接下来你可以通过如下命令下载数据集:

    $ git clone https://github.com/emanhamed/Houses-dataset
    

    房价数据集现在应该在keras-multi-input目录中,这是我们在这个项目中使用的目录。

    项目结构

    让我们来看看今天的项目是如何组织的:

    $ tree --dirsfirst --filelimit 10
    .
    ├── Houses-dataset
    │   ├── Houses\ Dataset [2141 entries]
    │   └── README.md
    ├── pyimagesearch
    │   ├── __init__.py
    │   ├── datasets.py
    │   └── models.py
    └── mixed_training.py
     
    3 directories, 5 files
    

    Houses-dataset文件夹包含我们在本系列中使用的房价数据集。当我们准备好运行mixed_training.py脚本时,您只需要提供一个路径作为数据集的命令行参数(我将在结果部分向您详细说明这是如何完成的)。

    今天我们将回顾三个Python脚本:

    • pyimagesearch/datasets.py: 加载和预处理我们的数字数据,类别数据以及图像数据。

    • pyimagesearch/models.py: 包含多层感知器(MLP)和卷积神经网络(CNN)。这些组件是我们的多输入混合数据模型的输入分支。

    • mixed_training.py: 首先我们的训练脚本将使用pyimagesearch模块来加载和分割训练数据集,添加数据头,并将两个分支连接到我们的网络。然后对模型进行培训和评估。

    加载数值和分类数据

    在这里插入图片描述

    图5:我们使用一个Python包panda来读取CSV住房数据。

    打开data .py文件,插入以下代码:

    # import the necessary packages
    from sklearn.preprocessing import LabelBinarizer
    from sklearn.preprocessing import MinMaxScaler
    import pandas as pd
    import numpy as np
    import glob
    import cv2
    import os
     
    def load_house_attributes(inputPath):
    	# initialize the list of column names in the CSV file and then
    	# load it using Pandas
    	cols = ["bedrooms", "bathrooms", "area", "zipcode", "price"]
    	df = pd.read_csv(inputPath, sep=" ", header=None, names=cols)
     
    	# determine (1) the unique zip codes and (2) the number of data
    	# points with each zip code
    	zipcodes = df["zipcode"].value_counts().keys().tolist()
    	counts = df["zipcode"].value_counts().tolist()
     
    	# loop over each of the unique zip codes and their corresponding
    	# count
    	for (zipcode, count) in zip(zipcodes, counts):
    		# the zip code counts for our housing dataset is *extremely*
    		# unbalanced (some only having 1 or 2 houses per zip code)
    		# so let's sanitize our data by removing any houses with less
    		# than 25 houses per zip code
    		if count < 25:
    			idxs = df[df["zipcode"] == zipcode].index
    			df.drop(idxs, inplace=True)
     
    	# return the data frame
    	return df
    

    我们在第10-33行定义load_house_attributes函数。该函数通过pandapd以CSV文件的形式从房价数据集中读取数值和类别数据。第13行和第14行是read_csv

    原始数据需要经过过滤以适应样本分布的不均匀性。如有些邮编仅由1或2所房子表示,因此我们要删除(第23-30行)来自邮编少于25所房子的任何记录。这样邮编样本数量分布不均匀的问题可以得到缓解,这样做的结果是得到一个更精确的模型。

    现在让我们定义process_house_attributes函数:

    def process_house_attributes(df, train, test):
    	# initialize the column names of the continuous data
    	continuous = ["bedrooms", "bathrooms", "area"]
     
    	# performin min-max scaling each continuous feature column to
    	# the range [0, 1]
    	cs = MinMaxScaler()
    	trainContinuous = cs.fit_transform(train[continuous])
    	testContinuous = cs.transform(test[continuous])
     
    	# one-hot encode the zip code categorical data (by definition of
    	# one-hot encoding, all output features are now in the range [0, 1])
    	zipBinarizer = LabelBinarizer().fit(df["zipcode"])
    	trainCategorical = zipBinarizer.transform(train["zipcode"])
    	testCategorical = zipBinarizer.transform(test["zipcode"])
     
    	# construct our training and testing data points by concatenating
    	# the categorical features with the continuous features
    	trainX = np.hstack([trainCategorical, trainContinuous])
    	testX = np.hstack([testCategorical, testContinuous])
     
    	# return the concatenated training and testing data
    	return (trainX, testX)
    

    这个函数通过scikit-learnMinMaxScaler(第41-43行)对连续特性应用最小-最大缩放。
    然后,通过scikit-learnLabelBinarizer(第47-49行)计算分类特征的one-hot编码。
    然后将连续的和分类的特性连接起来并返回(第53-57行)。

    加载图像数据集

    在这里插入图片描述

    图6:我们模型的一个分支接受一个图像——来自房屋的四个图像的拼合图像。利用拼合图像结合数字,类别数据,输入到另一个分支,然后我们的模型使用Keras框架回归与预测住宅的价值。

    下一步是定义一个helper函数来加载输入图像。同样,打开data .py文件并插入以下代码:

    def load_house_images(df, inputPath):
    	# initialize our images array (i.e., the house images themselves)
    	images = []
     
    	# loop over the indexes of the houses
    	for i in df.index.values:
    		# find the four images for the house and sort the file paths,
    		# ensuring the four are always in the *same order*
    		basePath = os.path.sep.join([inputPath, "{}_*".format(i + 1)])
    		housePaths = sorted(list(glob.glob(basePath)))
    

    load_house_images函数有三个功能:

    1. 从房价数据集中加载所有照片。回想一下,我们每个房子有四张照片(图6)。
    2. 从四张照片生成一个单一的拼合图像。拼合图像总是按照你在图中看到的那样顺序排列。
    3. 将所有这些主蒙版添加到列表/数组中并返回到调用函数。

    从第59行开始,我们定义了一个函数,它接受panda dataframedataset inputPath

    然后我们继续:

    • 初始化图像列表(第61行)并将用我们创建的所有拼合图像填充这个列表。
    • 循环遍历数据帧中的房屋(第64行)以获取当前住宅的四张照片的路径(第67行和第68行)。

    让我们继续看看循环内部:

    		# initialize our list of input images along with the output image
    		# after *combining* the four input images
    		inputImages = []
    		outputImage = np.zeros((64, 64, 3), dtype="uint8")
     
    		# loop over the input house paths
    		for housePath in housePaths:
    			# load the input image, resize it to be 32 32, and then
    			# update the list of input images
    			image = cv2.imread(housePath)
    			image = cv2.resize(image, (32, 32))
    			inputImages.append(image)
     
    		# tile the four input images in the output image such the first
    		# image goes in the top-right corner, the second image in the
    		# top-left corner, the third image in the bottom-right corner,
    		# and the final image in the bottom-left corner
    		outputImage[0:32, 0:32] = inputImages[0]
    		outputImage[0:32, 32:64] = inputImages[1]
    		outputImage[32:64, 32:64] = inputImages[2]
    		outputImage[32:64, 0:32] = inputImages[3]
     
    		# add the tiled image to our set of images the network will be
    		# trained on
    		images.append(outputImage)
     
    	# return our set of images
    	return np.array(images)
    

    到目前为止,代码已经完成了上面讨论的第一个目标(每个房子抓取四个图像)。

    • 在循环中,我们:

      • 执行初始化(第72行和第73行)。我们的inputImages将以列表的形式包含每条记录的四张照片。我们的inputImages将是照片的拼接图像(如图6所示)。

      • 循环4张照片(第76行):

        • 加载、调整大小并将每张照片附加到 inputImages中(第79-81行)。
      • 为四个房子的图片(第87-90行)创建平铺(拼接图像):

        • 左上方的浴室图片。
        • 右上角的卧室图片。
        • 右下角的正面视图。
        • 厨房在左下角。
      • 添加拼接outputImageimages(第94行)。

    • 跳出循环,我们以NumPy数组的形式返回所有图像(第97行)。

    我们的每个平铺图像将如图6所示(当然没有覆盖文本)。您可以看到其中的四张照片被拼接到一起(我使用了更大的图像尺寸,以便我们可以更好地可视化代码在做什么)。正如我们的数字属性和分类属性代表房子一样,这四张照片(平铺成一张图片)将代表房子的视觉美学。

    定义多层感知器(MLP)和卷积神经网络(CNN)

    在这里插入图片描述

    图7:Keras多输入(混合数据)模型有一个分支接受数字/类别数据(左),另一个分支接受4张照片拼接形式的图像数据(右)。

    到目前为止,我们已经使用了多个库对数据进行了仔细的处理:panda、scikit-learn、OpenCV和NumPy
    我们已经通过datasets.py对数据集的两种模式进行了组织和预处理。

    • 数字和分类数据
    • 图像数据

    为了实现这一点,我们所使用的技能是通过经验和实践一点点调试开发出来的。请不要忽视我们到目前为止所讨论和使用的数据处理技巧,因为它是我们项目成功的关键。

    让我们换个话题,讨论一下我们将如何使用Keras的函数API构建的多输入和混合数据网络。

    为了建立我们的多输入网络,我们需要两个分支:

    • 第一个分支是一个简单的多层感知器(MLP),用于处理数值输入。
    • 第二个分支是卷积神经网络,用于对图像数据进行操作。
    • 然后将这些分支连接在一起,形成最终的多输入Keras模型。

    我们将在下一节中处理构建最终的连接多输入模型,我们当前的任务是定义这两个分支。

    打开models.py文件,插入如下代码:

    # import the necessary packages
    from keras.models import Sequential
    from keras.layers.normalization import BatchNormalization
    from keras.layers.convolutional import Conv2D
    from keras.layers.convolutional import MaxPooling2D
    from keras.layers.core import Activation
    from keras.layers.core import Dropout
    from keras.layers.core import Dense
    from keras.layers import Flatten
    from keras.layers import Input
    from keras.models import Model
     
    def create_mlp(dim, regress=False):
    	# define our MLP network
    	model = Sequential()
    	model.add(Dense(8, input_dim=dim, activation="relu"))
    	model.add(Dense(4, activation="relu"))
     
    	# check to see if the regression node should be added
    	if regress:
    		model.add(Dense(1, activation="linear"))
     
    	# return our model
    	return model
    

    我们的类别/数值数据将由一个简单的多层感知器(MLP)处理。
    MLP由create_mlp在第13-24行定义。
    我们的MLP很简单:

    • 具有ReLU激活的完全连接(密集)输入层(第16行)。
    • 一个完全连接的隐藏层,也带有ReLU激活(第17行)。
    • 最后,一个线性激活的可选的回归输出(第20行和第21行)。

    虽然我们在第一篇文章中使用了MLP的回归输出,但是在这个多输入混合数据网络中不会使用它。您很快就会看到,我们将显式地设置regress=False,即使它也是默认值。稍后将在整个多输入混合数据网络的头部执行回归(图7的底部)

    MLP分支在第24行返回。

    根据图7,我们现在已经构建了网络的左上分支。

    现在让我们来定义我们网络的右上角分支,CNN:

    def create_cnn(width, height, depth, filters=(16, 32, 64), regress=False):
    	# initialize the input shape and channel dimension, assuming
    	# TensorFlow/channels-last ordering
    	inputShape = (height, width, depth)
    	chanDim = -1
    	
    	# define the model input
    	inputs = Input(shape=inputShape)
     
    	# loop over the number of filters
    	for (i, f) in enumerate(filters):
    		# if this is the first CONV layer then set the input
    		# appropriately
    		if i == 0:
    			x = inputs
     
    		# CONV => RELU => BN => POOL
    		x = Conv2D(f, (3, 3), padding="same")(x)
    		x = Activation("relu")(x)
    		x = BatchNormalization(axis=chanDim)(x)
    		x = MaxPooling2D(pool_size=(2, 2))(x)
    

    create_cnn函数处理图像数据并接受五个参数:

    • 宽度:输入图像的宽度,单位为像素。
    • 高度:输入图像的高度,单位为像素。
    • 深度:输入图像中的通道数。对于RGB彩色图像,它是3。
    • 过滤器:一组逐渐变大的过滤器,使我们的网络可以学习更多的区分功能。
    • 回归:一个布尔值,指示是否将一个完全连接的线性激活层添加到CNN以进行回归。

    我们的网络的inputShape在第29行定义。
    模型的输入是通过inputShape(第33行)定义的。
    从这里开始,我们开始遍历过滤器并创建一组CONV => RELU > BN =>POOL 层。循环的每次迭代都会累加这些层。

    让我们完成CNN网络分支的建设:

    	# flatten the volume, then FC => RELU => BN => DROPOUT
    	x = Flatten()(x)
    	x = Dense(16)(x)
    	x = Activation("relu")(x)
    	x = BatchNormalization(axis=chanDim)(x)
    	x = Dropout(0.5)(x)
     
    	# apply another FC layer, this one to match the number of nodes
    	# coming out of the MLP
    	x = Dense(4)(x)
    	x = Activation("relu")(x)
     
    	# check to see if the regression node should be added
    	if regress:
    		x = Dense(1, activation="linear")(x)
     
    	# construct the CNN
    	model = Model(inputs, x)
     
    	# return the CNN
    	return model
    

    我们将下一层(第49行)压平,意味着我们将所有提取到的特征组成一维特征向量,然后添加一个带有BatchNormalization和Dropout的全连接层(第50-53行)。

    另一个全连接层用于匹配来自多层感知器的四个节点(第57行和第58行)。匹配节点的数量不是必需的,但它确实有助于平衡分支。

    在第61行和第62行,检查是否添加回归节点,如果需要就相应地将其添加进来。实际上,我们不会在这个分支的末尾进行回归。回归将在多输入混合数据网络的头部执行(图7的最底部)。

    最后,模型由我们的输入和组装在一起的所有层组成。我们可以将CNN分支返回到调用函数(第68行)。

    现在我们已经定义了多输入Keras模型的两个分支,让我们学习如何组合它们!

    使用Keras的多个输入

    现在,我们准备构建最终的Keras模型,该模型能够处理多个输入和混合数据。这是分支聚集的地方——“魔法”发生的地方。
    训练也将在这个脚本中进行。

    创建一个名为mixed_training.py的新文件,打开它,并插入以下代码:

    # import the necessary packages
    from pyimagesearch import datasets
    from pyimagesearch import models
    from sklearn.model_selection import train_test_split
    from keras.layers.core import Dense
    from keras.models import Model
    from keras.optimizers import Adam
    from keras.layers import concatenate
    import numpy as np
    import argparse
    import locale
    import os
     
    # construct the argument parser and parse the arguments
    ap = argparse.ArgumentParser()
    ap.add_argument("-d", "--dataset", type=str, required=True,
    	help="path to input dataset of house images")
    args = vars(ap.parse_args())
    

    首先,让我们导入必要的模块并且解析命令行参数。

    • datasets: 我们的三个方便的功能,从房屋数据集加载/处理CSV数据和加载/预处理房屋照片。
    • models: 我们的MLP和CNN输入分支,它们将作为我们的多输入混合数据服务。
    • train_test_split: 一个scikit-learn函数,用于构造我们的训练/测试数据分割。
    • concatenate: 一个特殊的Keras函数,它将接受多个输入。
    • argparse: 处理解析命令行参数。

    在第15-18行中,我们有一个命令行参数需要解析,即dataset,它是您下载房价数据集的路径。

    接下来,让我们加载我们的数值/分类数据和图像数据:

    # construct the path to the input .txt file that contains information
    # on each house in the dataset and then load the dataset
    print("[INFO] loading house attributes...")
    inputPath = os.path.sep.join([args["dataset"], "HousesInfo.txt"])
    df = datasets.load_house_attributes(inputPath)
     
    # load the house images and then scale the pixel intensities to the
    # range [0, 1]
    print("[INFO] loading house images...")
    images = datasets.load_house_images(df, args["dataset"])
    images = images / 255.0
    

    在这里,我们将房价数据集加载为panda dataframe(第23行和第24行)。然后我们加载图像并将其缩放到 [0,1] (第29-30行)。
    如果需要提醒您这些函数的底层功能,请务必查看上面的load_house_attributesload_house_images函数。
    现在我们的数据已经加载完毕,我们将构建我们的培训/测试分割,调整价格,并处理房屋属性:

    # partition the data into training and testing splits using 75% of
    # the data for training and the remaining 25% for testing
    print("[INFO] processing data...")
    split = train_test_split(df, images, test_size=0.25, random_state=42)
    (trainAttrX, testAttrX, trainImagesX, testImagesX) = split
     
    # find the largest house price in the training set and use it to
    # scale our house prices to the range [0, 1] (will lead to better
    # training and convergence)
    maxPrice = trainAttrX["price"].max()
    trainY = trainAttrX["price"] / maxPrice
    testY = testAttrX["price"] / maxPrice
     
    # process the house attributes data by performing min-max scaling
    # on continuous features, one-hot encoding on categorical features,
    # and then finally concatenating them together
    (trainAttrX, testAttrX) = datasets.process_house_attributes(df,
    	trainAttrX, testAttrX)
    

    我们的训练和测试是在第35行和第36行进行的。我们分配了75%的数据用于培训,25%的数据用于测试。

    在此基础上,我们从培训集(第41行)中找到maxPrice,并相应地调整培训和测试数据(第42行和第43行)。将价值数据调整到[0,1]范围内,可以更好地训练和收敛。

    最后,我们通过对连续特征执行最小-最大缩放和对分类特征执行一次热编码继续处理我们的房子属性。

    process_house_attributes函数处理这些操作,并将连续的和分类的特性连接在一起,返回结果(第48行和第49行)。

    准备好施魔法了吗?
    好吧,我说谎了。在下一个代码块中实际上没有任何“魔力”!但我们将连接我们的网络分支,完成我们的多输入Keras网络:

    # create the MLP and CNN models
    mlp = models.create_mlp(trainAttrX.shape[1], regress=False)
    cnn = models.create_cnn(64, 64, 3, regress=False)
     
    # create the input to our final set of layers as the *output* of both
    # the MLP and CNN
    combinedInput = concatenate([mlp.output, cnn.output])
     
    # our final FC layer head will have two dense layers, the final one
    # being our regression head
    x = Dense(4, activation="relu")(combinedInput)
    x = Dense(1, activation="linear")(x)
     
    # our final model will accept categorical/numerical data on the MLP
    # input and images on the CNN input, outputting a single value (the
    # predicted price of the house)
    model = Model(inputs=[mlp.input, cnn.input], outputs=x)
    

    当您组织好代码和模型后,使用Keras处理多个输入是非常容易的。

    在第52行和第53行,我们创建mlp和cnn模型。注意regress=False——我们的回归头出现在第62行后面。

    然后我们将连接mlp输出和cnn输出如第57行所示。我将其称为我们的combinedInput,因为它是网络其余部分的输入(从图3中可以看到,这是concatenate_1,两个分支在一起)。

    网络中最后一层的组合输入是基于MLP和CNN分支的 8-4-1 FC层的输出(因为这两个分支都输出4维 FC层,然后我们将它们连接起来创建一个8维向量)。

    我们将一个由四个神经元组成的完全连接的层固定在combinedInput上(第61行)。然后我们添加“lineractivation回归头(第62行),其输出为预测价格。

    让我们继续编译、培训和评估我们新形成的模型:

    # compile the model using mean absolute percentage error as our loss,
    # implying that we seek to minimize the absolute percentage difference
    # between our price *predictions* and the *actual prices*
    opt = Adam(lr=1e-3, decay=1e-3 / 200)
    model.compile(loss="mean_absolute_percentage_error", optimizer=opt)
     
    # train the model
    print("[INFO] training model...")
    model.fit(
    	[trainAttrX, trainImagesX], trainY,
    	validation_data=([testAttrX, testImagesX], testY),
    	epochs=200, batch_size=8)
     
    # make predictions on the testing data
    print("[INFO] predicting house prices...")
    preds = model.predict([testAttrX, testImagesX])
    

    我们的模型是用“mean_absolute_percentage_error”损失和一个Adam优化器编译的,该优化器具有学习率衰减(第72行和第73行)。

    训练在第77-80行开始。这就是所谓的模型拟合(也就是所有权重都由称为反向传播的过程进行调优的地方)。

    通过对测试数据集调用model.predict(第84行)可以获取模型预测的房屋价值来评估我们的模型。

    现在让我们进行评估:

    # compute the difference between the *predicted* house prices and the
    # *actual* house prices, then compute the percentage difference and
    # the absolute percentage difference
    diff = preds.flatten() - testY
    percentDiff = (diff / testY) * 100
    absPercentDiff = np.abs(percentDiff)
     
    # compute the mean and standard deviation of the absolute percentage
    # difference
    mean = np.mean(absPercentDiff)
    std = np.std(absPercentDiff)
     
    # finally, show some statistics on our model
    locale.setlocale(locale.LC_ALL, "en_US.UTF-8")
    print("[INFO] avg. house price: {}, std house price: {}".format(
    	locale.currency(df["price"].mean(), grouping=True),
    	locale.currency(df["price"].std(), grouping=True)))
    print("[INFO] mean: {:.2f}%, std: {:.2f}%".format(mean, std))
    

    为了评估我们的模型,我们计算了绝对百分比(第89-91行),并使用它得出了最终的度量标准(第95和96行)。
    这些度量(价格平均值、价格标准差和绝对百分比的平均值以及标准差)将以合适的格式(第100-103行)打印到终端。

    多输入和混合数据结果

    在这里插入图片描述

    图8:房地产价格预测是一项困难的任务,但是我们的Keras多输入和混合输入回归模型在我们有限的房价数据集上产生了比较好的结果。

    最后,我们在混合数据上训练我们的多输入网络!

    确保你准备好了:

    1. 根据本系列的第一个教程配置开发环境。
    2. 使用本教程的源代码。
    3. 使用上面“获取房价数据集”一节中的说明下载房价数据集。

    在此基础上,打开终端,执行以下命令,开始网络训练:

    $ python mixed_training.py --dataset Houses-dataset/Houses\ Dataset/
    [INFO] training model...
    Train on 271 samples, validate on 91 samples
    Epoch 1/200
    271/271 [==============================] - 2s 8ms/step - loss: 240.2516 - val_loss: 118.1782
    Epoch 2/200
    271/271 [==============================] - 1s 5ms/step - loss: 195.8325 - val_loss: 95.3750
    Epoch 3/200
    271/271 [==============================] - 1s 5ms/step - loss: 121.5940 - val_loss: 85.1037
    Epoch 4/200
    271/271 [==============================] - 1s 5ms/step - loss: 103.2910 - val_loss: 72.1434
    Epoch 5/200
    271/271 [==============================] - 1s 5ms/step - loss: 82.3916 - val_loss: 61.9368
    Epoch 6/200
    271/271 [==============================] - 1s 5ms/step - loss: 81.3794 - val_loss: 59.7905
    Epoch 7/200
    271/271 [==============================] - 1s 5ms/step - loss: 71.3617 - val_loss: 58.8067
    Epoch 8/200
    271/271 [==============================] - 1s 5ms/step - loss: 72.7032 - val_loss: 56.4613
    Epoch 9/200
    271/271 [==============================] - 1s 5ms/step - loss: 52.0019 - val_loss: 54.7461
    Epoch 10/200
    271/271 [==============================] - 1s 5ms/step - loss: 62.4559 - val_loss: 49.1401
    ...
    Epoch 190/200
    271/271 [==============================] - 1s 5ms/step - loss: 16.0892 - val_loss: 22.8415
    Epoch 191/200
    271/271 [==============================] - 1s 5ms/step - loss: 16.1908 - val_loss: 22.5139
    Epoch 192/200
    271/271 [==============================] - 1s 5ms/step - loss: 16.9099 - val_loss: 22.5922
    Epoch 193/200
    271/271 [==============================] - 1s 5ms/step - loss: 18.6216 - val_loss: 26.9679
    Epoch 194/200
    271/271 [==============================] - 1s 5ms/step - loss: 16.5341 - val_loss: 23.1445
    Epoch 195/200
    271/271 [==============================] - 1s 5ms/step - loss: 16.4120 - val_loss: 26.1224
    Epoch 196/200
    271/271 [==============================] - 1s 5ms/step - loss: 16.4939 - val_loss: 23.1224
    Epoch 197/200
    271/271 [==============================] - 1s 5ms/step - loss: 15.6253 - val_loss: 22.2930
    Epoch 198/200
    271/271 [==============================] - 1s 5ms/step - loss: 16.0514 - val_loss: 23.6948
    Epoch 199/200
    271/271 [==============================] - 1s 5ms/step - loss: 17.9525 - val_loss: 22.9743
    Epoch 200/200
    271/271 [==============================] - 1s 5ms/step - loss: 16.0377 - val_loss: 22.4130
    [INFO] predicting house prices...
    [INFO] avg. house price: $533,388.27, std house price: $493,403.08
    [INFO] mean: 22.41%, std: 20.11%
    

    我们的平均绝对百分比误差开始非常高,但在整个培训过程中不断下降。
    在训练结束时,我们得到了22.41%的测试集绝对误差,这意味着我们的网络对房价的预测平均会下降22%左右。

    我们将这个结果与本系列之前的两篇文章进行比较:

    1. 仅对数值/分类数据使用MLP: 26.01%
    2. 仅用CNN对图像数据:56.91%
    3. 使用混合数据:22.41%

    如你所见,处理混合数据的方法如下:

    1. 结合我们的数字/l类别数据和图像数据
    2. 对混合数据进行多输入模型的训练。
    3. 带来了一个性能更好的模型!

    总结

    在本教程中,您学习了如何定义能够接受多个输入的Keras网络。

    您还学习了如何使用Keras处理混合数据。

    为了实现这些目标,我们定义了一个能够接受的多输入神经网络:

    • 数值数据
    • 分类数据
    • 图像数据

    在训练前,将数值数据的min-max缩放到[0,1]范围。我们的类别数据是one-hot编码的(确保得到的整数向量在[0,1]范围内)。

    然后将数值和类别数据连接成一个特征向量,形成Keras网络的第一个输入。

    我们的图像数据也被缩放到范围[0,1]——这些数据作为Keras网络的第二个输入。

    模型的一个分支包含严格的全连通层(对于连接的数值和类别数据),而多输入模型的第二个分支本质上是一个小的卷积神经网络。

    将两个分支的输出组合起来,定义一个输出(回归预测)。

    通过这种方式,我们能够训练我们的多个输入网络端到端,从而获得比仅使用其中一个输入更好的准确性。

    翻译自:Keras: Multiple Inputs and Mixed Data, by Adrian Rosebrock.
    Reference :Adrian Rosebrock, “Keras: Multiple Inputs and Mixed Data”, PyImageSearch, https://www.pyimagesearch.com/2019/02/04/keras-multiple-inputs-and-mixed-data/, accessed on 03 April 2019.

    展开全文
  • 一文看懂25个神经网络模型

    万次阅读 多人点赞 2017-06-17 10:26:08
    光是知道各式各样的神经网络模型缩写(如:DCIGN、BiLSTM、DCGAN……还有哪些?),就已经让人招架不住了。因此,这里整理出一份清单来梳理所有这些架构。其中大部分是人工神经网络,也有一些完全不同的怪物。尽管...

    1. 引言

    在深度学习十分火热的今天,不时会涌现出各种新型的人工神经网络,想要实时了解这些新型神经网络的架构还真是不容易。光是知道各式各样的神经网络模型缩写(如:DCIGN、BiLSTM、DCGAN……还有哪些?),就已经让人招架不住了。

    因此,这里整理出一份清单来梳理所有这些架构。其中大部分是人工神经网络,也有一些完全不同的怪物。尽管所有这些架构都各不相同、功能独特,当我在画它们的节点图时……其中潜在的关系开始逐渐清晰起来。

    把这些架构做成节点图,会存在一个问题:它无法展示神经网络架构内部的工作原理。举例来说,变分自编码机(VAE:variational autoencoders )看起来跟自编码机(AE:autoencoders)差不多,但它们的训练过程却大不相同。训练后的模型在使用场景上差别更大:VAE是生成器,通过插入噪音数据来获取新样本;而AE仅仅是把他们所收到的任何信息作为输入,映射到“记忆中”最相似的训练样本上。

    在介绍不同模型的神经元和神经细胞层之间的连接方式前,我们一步一步来,先来了解不同的神经元节点内部是如何工作的。

    1.1 神经元

    对不同类型的神经元标记不同的颜色,可以更好地在各种网络架构之间进行区分。但是,这些神经元的工作方式却是大同小异。在下图的基本神经元结构后面,你会看到详细的讲解:

    基本的人工神经网络神经元(basic neural network cell)相当简单,这种简单的类型可以在常规的前馈人工神经网络架构里面找到。这种神经元与其它神经元之间的连接具有权重,也就是说,它可以和前一层神经网络层中的所有神经元有连接。

    每一个连接都有各自的权重,通常情况下是一些随机值(关于如何对人工神经网络的权重进行初始化是一个非常重要的话题,这将会直接影响到之后的训练过程,以及最终整个模型的性能)。这个权重可以是负值,正值,非常小,或者非常大,也可以是零。和这个神经元连接的所有神经元的值都会乘以各自对应的权重。然后,把这些值都求和。

    在这个基础上,会额外加上一个bias,它可以用来避免输出为零的情况,并且能够加速某些操作,这让解决某个问题所需要的神经元数量也有所减少。这个bias也是一个数字,有些时候是一个常量(经常是-1或者1),有些时候会有所变化。这个总和最终被输入到一个激活函数,这个激活函数的输出最终就成为这个神经元的输出。

    这里写图片描述

    1.2卷积神经元(Convolutional cells)

    和前馈神经元非常相似,除了它们只跟前一神经细胞层的部分神经元有连接。因为它们不是和某些神经元随机连接的,而是与特定范围内的神经元相连接,通常用来保存空间信息。这让它们对于那些拥有大量局部信息,比如图像数据、语音数据(但多数情况下是图像数据),会非常实用。

    1.3 解卷积神经元

    恰好相反:它们是通过跟下一神经细胞层的连接来解码空间信息。这两种神经元都有很多副本,它们都是独立训练的;每个副本都有自己的权重,但连接方式却完全相同。可以认为,这些副本是被放在了具备相同结构的不同的神经网络中。这两种神经元本质上都是一般意义上的神经元,但是,它们的使用方式却不同。

    1.4 池化神经元和插值神经元(Pooling and interpolating cells)

    经常和卷积神经元结合起来使用。它们不是真正意义上的神经元,只能进行一些简单的操作。

    池化神经元接受到来自其它神经元的输出过后,决定哪些值可以通过,哪些值不能通过。在图像领域,可以理解成是把一个图像缩小了(在查看图片的时候,一般软件都有一个放大、缩小的功能;这里的图像缩小,就相当于软件上的缩小图像;也就是说我们能看到图像的内容更加少了;在这个池化的过程当中,图像的大小也会相应地减少)。这样,你就再也不能看到所有的像素了,池化函数会知道什么像素该保留,什么像素该舍弃。

    插值神经元恰好是相反的操作:它们获取一些信息,然后映射出更多的信息。额外的信息都是按照某种方式制造出来的,这就好像在一张小分辨率的图片上面进行放大。插值神经元不仅仅是池化神经元的反向操作,而且,它们也是很常见,因为它们运行非常快,同时,实现起来也很简单。池化神经元和插值神经元之间的关系,就像卷积神经元和解卷积神经元之间的关系。

    1.5均值神经元和标准方差神经元(Mean and standard deviation cells)(作为概率神经元它们总是成对地出现)

    是一类用来描述数据概率分布的神经元。均值就是所有值的平均值,而标准方差描述的是这些数据偏离(两个方向)均值有多远。比如:一个用于图像处理的概率神经元可以包含一些信息,比如:在某个特定的像素里面有多少红色。举个例来说,均值可能是0.5,同时标准方差是0.2。当要从这些概率神经元取样的时候,你可以把这些值输入到一个高斯随机数生成器,这样就会生成一些分布在0.4和0.6之间的值;值离0.5越远,对应生成的概率也就越小。它们一般和前一神经元层或者下一神经元层是全连接,而且,它们没有偏差(bias)。

    1.6 循环神经元(Recurrent cells )

    不仅仅在神经细胞层之间有连接,而且在时间轴上也有相应的连接。每一个神经元内部都会保存它先前的值。它们跟一般的神经元一样更新,但是,具有额外的权重:与当前神经元之前值之间的权重,还有大多数情况下,与同一神经细胞层各个神经元之间的权重。当前值和存储的先前值之间权重的工作机制,与非永久性存储器(比如RAM)的工作机制很相似,继承了两个性质:

    • 第一,维持一个特定的状态;
    • 第二:如果不对其持续进行更新(输入),这个状态就会消失。

    由于先前的值是通过激活函数得到的,而在每一次的更新时,都会把这个值和其它权重一起输入到激活函数,因此,信息会不断地流失。实际上,信息的保存率非常的低,以至于仅仅四次或者五次迭代更新过后,几乎之前所有的信息都会流失掉。

    1.7 长短期记忆神经元(Long short term memory cells)

    用于克服循环神经元中信息快速流失的问题。

    LSTM是一个逻辑回路,其设计受到了计算机内存单元设计的启发。与只存储两个状态的循环神经元相比,LSTM可以存储四个状态:输出值的当前和先前值,记忆神经元状态的当前值和先前值。它们都有三个门:输入门,输出门,遗忘门,同时,它们也还有常规的输入。

    这些门它们都有各自的权重,也就是说,与这种类型的神经元细胞连接需要设置四个权重(而不是一个)。这些门的工作机制与流门(flow gates)很相似,而不是栅栏门(fence gates):它们可以让所有的信息都通过,或者只是通过部分,也可以什么都不让通过,或者通过某个区间的信息。

    这种运行机制的实现是通过把输入信息和一个在0到1之间的系数相乘,这个系数存储在当前门中。这样,输入门决定输入的信息有多少可以被叠加到当前门值。输出门决定有多少输出信息是可以传递到后面的神经网络中。遗忘门并不是和输出神经元的先前值相连接,而是,和前一记忆神经元相连接。它决定了保留多少记忆神经元最新的状态信息。因为没有和输出相连接,以及没有激活函数在这个循环中,因此只会有更少的信息流失。

    1.8 门控循环神经元(Gated recurrent units (cells))

    是LSTM的变体。它们同样使用门来抑制信息的流失,但是只用两个门:更新门和重置门。这使得构建它们付出的代价没有那么高,而且运行速度更加快了,因为它们在所有的地方使用了更少的连接。

    从本质上来说LSTM和GRU有两个不同的地方:

    • 第一:GRU神经元没有被输出门保护的隐神经元;
    • 第二:GRU把输出门和遗忘门整合在了一起,形成了更新门。核心的思想就是如果你想要一些新的信息,那么你就可以遗忘掉一些陈旧的信息(反过来也可以)。

    1.9 神经细胞层(Layers)

    形成一个神经网络,最简单的连接神经元方式是——把所有的神经元与其它所有的神经元相连接。这就好像Hopfield神经网络和玻尔兹曼机(Boltzmann machines)的连接方式。当然,这也就意味着连接数量会随着神经元个数的增加呈指数级地增加,但是,对应的函数表达力也会越来越强。这就是所谓的全连接(completely (or fully) connected)。

    经历了一段时间的发展,发现把神经网络分解成不同的神经细胞层会非常有效。神经细胞层的定义是一群彼此之间互不连接的神经元,它们仅跟其它神经细胞层有连接。这一概念在受限玻尔兹曼机(Restricted Boltzmann Machines)中有所体现。现在,使用神经网络就意味着使用神经细胞层,并且是任意数量的神经细胞层。其中一个比较令人困惑的概念是全连接(fully connected or completely connected),也就是某一层的每个神经元跟另一层的所有神经元都有连接,但真正的全连接神经网络相当罕见。

    1.10 卷积连接层(Convolutionally connected layers)

    相对于全连接层要有更多的限制:在卷积连接层中的每一个神经元只与相邻的神经元层连接。图像和声音蕴含了大量的信息,如果一对一地输入到神经网络(比如,一个神经元对应一个像素)。卷积连接的形成,受益于保留空间信息更为重要的观察。实践证明这是一个非常好的猜测,因为现在大多数基于人工神经网络的图像和语音应用都使用了这种连接方式。然而,这种连接方式所需的代价远远低于全连接层的形式。从本质上来讲,卷积连接方式起到重要性过滤的作用,决定哪些紧紧联系在一起的信息包是重要的;卷积连接对于数据降维非常有用。

    当然了,还有另外一种选择,就是随机连接神经元(randomly connected neurons)。这种形式的连接主要有两种变体:

    • 第一,允许部分神经元进行全连接。
    • 第二,神经元层之间只有部分连接。
      随机连接方式有助于线性地降低人工神经网络的性能;当全连接层遇到性能问题的时候,在大规模人工神经网络中,使用随机连接方式非常有益。拥有更多神经元且更加稀疏的神经元层在某些情况下运行效果更好,特别是很多的信息需要被存储起来,但是,需要交换的信息并不多(这与卷积连接层的运行机制很相似,但是,它们是随机的)。非常稀疏的连接网络(1%或2%)也有被使用,比如ELMs, ESNs 和LSMs。这特别适用于脉冲网络(spiking networks),因为一个神经元拥有更多的连接,它对应的权重具有的能量也就更少,这也就意味着将会有更少的扩展和重复模式。

    1.11 时间滞后连接(Time delayed connections)

    是指相连的神经元(通常是在同一个神经元层,甚至于一个神经元自己跟自己连接),它们不从前面的神经元层获取信息,而是从神经元层先前的状态获取信息。这使得暂时(时间上或者序列上)联系在一起的信息可以被存储起来。这些形式的连接经常被手工重新进行设置,从而可以清除神经网络的状态。和常规连接的主要区别是,这种连接会持续不断地改变,即便这个神经网络当前没有处于训练状态。

    下图展示了以上所介绍的神经网络及其连接方式。当我卡在哪种神经元与哪个神经细胞层该连到一起的时候,就会拿这张图出来作为参考(尤其是在处理和分析LSTM与GRU神经元时):

    这里写图片描述

    显而易见,整理一份完整的清单是不切实际的,因为新的架构正被源源不断地发明出来。所以,接下来这份清单的目的,只想带你一窥人工智能领域的基础设施。对于每一个画成节点图的架构,我都会写一个非常非常简短的描述。你会发现这些描述还是很有用的,毕竟,总还是有一些你并不是那么熟悉的架构。

    这里写图片描述

    值得一提的是,虽说大多数的简写都已被普遍接受,但总会出现一些冲突。RNNs有时表示递归神经网络(recursive neural networks),但大多时候,它们指的是循环神经网络(recurrent neural networks)。这还没完,它们在许多地方还会泛指各种循环架构,这包括在LSTMs、GRU甚至是双向变体。AEs也经常会面临同样的问题,VAEs、DAEs及其相似结构有时都被简称为AEs。很多缩写后面的“N”也常常会有所变化,因为同一个架构你既可称之为卷积神经网络(convolutional neural network),也可简称为卷积网络(convolutional network),这样就出现了CNN和CN两种形式。

    2. 前馈神经网络(FFNN)

    前馈神经感知网络与感知机(FF or FFNN:Feed forward neural networks and P:perceptrons)非常简单,信息从前往后流动(分别对应输入和输出)。

    一般在描述神经网络的时候,都是从它的层说起,即相互平行的输入层、隐含层或者输出层神经结构。单独的神经细胞层内部,神经元之间互不相连;而一般相邻的两个神经细胞层则是全连接(一层的每个神经元和另一层的每一个神经元相连)。一个最简单却最具有实用性的神经网络由两个输入神经元和一个输出神经元构成,也就是一个逻辑门模型。给神经网络一对数据集(分别是“输入数据集”和“我们期望的输出数据集”),一般通过反向传播算法来训练前馈神经网络(FFNNs)。

    这就是所谓的监督式学习。与此相反的是无监督学习:我们只给输入,然后让神经网络去寻找数据当中的规律。反向传播的误差往往是神经网络当前输出和给定输出之间差值的某种变体(比如MSE或者仅仅是差值的线性变化)。如果神经网络具有足够的隐层神经元,那么理论上它总是能够建立输入数据和输出数据之间的关系。在实践中,FFNN的使用具有很大的局限性,但是,它们通常和其它神经网络一起组合成新的架构。

    参考文献:
    Rosenblatt, Frank. “The perceptron: a probabilistic model for information storage and organization in the brain.” Psychological review 65.6 (1958): 386.

    3. 径向基神经网络(RBF)

    径向神经网络(RBF:Radial basis function)是一种以径向基核函数作为激活函数的前馈神经网络。没有更多描述了。这不是说没有相关的应用,但大多数以其它函数作为激活函数的FFNNs都没有它们自己的名字。这或许跟它们的发明年代有关系。

    参考文献:
    Broomhead, David S., and David Lowe. Radial basis functions, multi-variable functional interpolation and adaptive networks. No. RSRE-MEMO-4148. ROYAL SIGNALS AND RADAR ESTABLISHMENT MALVERN (UNITED KINGDOM), 1988.

    4. 霍普菲尔网络(HN)

    霍普菲尔网络(HN:Hopfield network)是一种每一个神经元都跟其它神经元相互连接的网络。

    这就像一盘完全搅在一起的意大利面,因为每个神经元都在充当所有角色:训练前的每一个节点都是输入神经元,训练阶段是隐神经元,输出阶段则是输出神经元。

    该神经网络的训练,是先把神经元的值设置到期望模式,然后计算相应的权重。在这以后,权重将不会再改变了。一旦网络被训练包含一种或者多种模式,这个神经网络总是会收敛于其中的某一种学习到的模式,因为它只会在某一个状态才会稳定。值得注意的是,它并不一定遵从那个期望的状态(很遗憾,它并不是那个具有魔法的黑盒子)。它之所以会稳定下来,部分要归功于在训练期间整个网络的“能量(Energy)”或“温度(Temperature)”会逐渐地减少。每一个神经元的激活函数阈值都会被设置成这个温度的值,一旦神经元输入的总和超过了这个阈值,那么就会让当前神经元选择状态(通常是-1或1,有时也是0或1)。

    可以多个神经元同步,也可以一个神经元一个神经元地对网络进行更新。一旦所有的神经元都已经被更新,并且它们再也没有改变,整个网络就算稳定(退火)了,那你就可以说这个网络已经收敛了。这种类型的网络被称为“联想记忆(associative memory)”,因为它们会收敛到和输入最相似的状态;比如,人类看到桌子的一半就可以想象出另外一半;与之相似,如果输入一半噪音+一半桌子,这个网络就能收敛到整张桌子。

    参考文献:
    Hopfield, John J. “Neural networks and physical systems with emergent collective computational abilities.” Proceedings of the national academy of sciences 79.8 (1982): 2554-2558.

    5. 马尔可夫链(MC)

    马尔可夫链(MC:Markov Chain)或离散时间马尔可夫链(DTMC:MC or discrete time Markov Chain)在某种意义上是BMs和HNs的前身。可以这样来理解:从从我当前所处的节点开始,走到任意相邻节点的概率是多少呢?它们没有记忆(所谓的马尔可夫特性):你所得到的每一个状态都完全依赖于前一个状态。尽管算不上神经网络,但它却跟神经网络类似,并且奠定了BM和HN的理论基础。跟BM、RBM、HN一样,MC并不总被认为是神经网络。此外,它也并不总是全连接的。

    参考文献:
    Hayes, Brian. “First links in the Markov chain.” American Scientist 101.2 (2013): 252.

    6. 玻尔兹曼机(BM)

    玻尔兹曼机(BM:Boltzmann machines)和霍普菲尔网络很接近,差别只是:一些神经元作为输入神经元,剩余的则是作为隐神经元。

    在整个神经网络更新过后,输入神经元成为输出神经元。刚开始神经元的权重都是随机的,通过反向传播(back-propagation)算法进行学习,或是最近常用的对比散度(contrastive divergence)算法(马尔可夫链用于计算两个信息增益之间的梯度)。

    相比HN,大多数BM的神经元激活模式都是二元的。BM由MC训练获得,因而是一个随机网络。BM的训练和运行过程,跟HN大同小异:为输入神经元设好钳位值,而后让神经网络自行学习。因为这些神经元可能会得到任意的值,我们反复地在输入和输出神经元之间来回地进行计算。激活函数的激活受全局温度的控制,如果全局温度降低了,那么神经元的能量也会相应地降低。这个能量上的降低导致了它们激活模式的稳定。在正确的温度下,这个网络会抵达一个平衡状态。
    参考文献:
    Hinton, Geoffrey E., and Terrence J. Sejnowski. “Learning and releaming in Boltzmann machines.” Parallel distributed processing: Explorations in the microstructure of cognition 1 (1986): 282-317.

    8. 受限玻尔兹曼机(RBM)

    这里写图片描述

    受限玻尔兹曼机(RBM:Restricted Boltzmann machines)与BM出奇地相似,因而也同HN相似。

    它们的最大区别在于:RBM更具实用价值,因为它们受到了更多的限制。它们不会随意在所有神经元间建立连接,而只在不同神经元群之间建立连接,因此任何输入神经元都不会同其他输入神经元相连,任何隐神经元也不会同其他隐神经元相连。

    RBM的训练方式就像稍微修改过的FFNN:前向通过数据之后再将这些数据反向传回(回到第一层),而非前向通过数据然后反向传播误差。之后,再使用前向和反向传播进行训练。

    参考文献:
    Smolensky, Paul. Information processing in dynamical systems: Foundations of harmony theory. No. CU-CS-321-86. COLORADO UNIV AT BOULDER DEPT OF COMPUTER SCIENCE, 1986.

    9. 自编码机(AE)

    多图|一文看懂25个神经网络模型

    自编码机(AE:Autoencoders)和FFNN有些相近,因为它更像是FFNN的另一种用法,而非本质上完全不同的另一种架构。

    自编码机的基本思想是自动对信息进行编码(像压缩一样,而非加密),它也因此而得名。整个网络的形状酷似一个沙漏计时器,中间的隐含层较小,两边的输入层、输出层较大。自编码机总是对称的,以中间层(一层还是两层取决于神经网络层数的奇偶)为轴。最小的层(一层或者多层)总是在中间,在这里信息压缩程度最大(整个网络的关隘口)。在中间层之前为编码部分,中间层之后为解码部分,中间层则是编码部分。

    自编码机可用反向传播算法进行训练,给定输入,将误差设为输入和输出之差。自编码机的权重也是对称的,因此编码部分权重与解码部分权重完全一样。

    参考文献:
    Bourlard, Hervé, and Yves Kamp. “Auto-association by multilayer perceptrons and singular value decomposition.” Biological cybernetics 59.4-5 (1988): 291-294.

    10. 稀疏自编码机(SAE)

    多图|一文看懂25个神经网络模型

    稀疏自编码机(SAE:Sparse autoencoders)某种程度上同自编码机相反。稀疏自编码机不是用更小的空间表征大量信息,而是把原本的信息编码到更大的空间内。因此,中间层不是收敛,而是扩张,然后再还原到输入大小。它可以用于提取数据集内的小特征。

    如果用训练自编码机的方式来训练稀疏自编码机,几乎所有的情况,都是得到毫无用处的恒等网络(输入=输出,没有任何形式的变换或分解)。为避免这种情况,需要在反馈输入中加上稀疏驱动数据。稀疏驱动的形式可以是阈值过滤,这样就只有特定的误差才会反向传播用于训练,而其它的误差则被忽略为0,不会用于反向传播。这很像脉冲神经网络(并不是所有的神经元一直都会输出)。

    Marc’Aurelio Ranzato, Christopher Poultney, Sumit Chopra, and Yann LeCun. “Efficient learning of sparse representations with an energy-based model.” Proceedings of NIPS. 2007.

    11.变分自编码机(VAE)

    多图|一文看懂25个神经网络模型

    变分自编码机(VAE:Variational autoencoders)和AE有着相同的架构,却被教会了不同的事情:输入样本的一个近似概率分布,这让它跟BM、RBM更相近。

    不过,VAE却依赖于贝叶斯理论来处理概率推断和独立(probabilistic inference and independence),以及重新参数化(re-parametrisation)来进行不同的表征。推断和独立非常直观,但却依赖于复杂的数学理论。基本原理是:把影响纳入考虑。如果在一个地方发生了一件事情,另外一件事情在其它地方发生了,它们不一定就是关联在一起的。如果它们不相关,那么误差传播应该考虑这个因素。这是一个有用的方法,因为神经网络是一个非常大的图表,如果你能在某些节点排除一些来自于其它节点的影响,随着网络深度地增加,这将会非常有用。

    Kingma, Diederik P., and Max Welling. “Auto-encoding variational bayes.” arXiv preprint arXiv:1312.6114 (2013).

    12. 去噪自编码机(DAE)

    去噪自编码机(DAE:Denoising autoencoders)是一种自编码机,它的训练过程,不仅要输入数据,还有再加上噪音数据(就好像让图像变得更加模糊一样)。

    但在计算误差的时候跟自动编码机一样,降噪自动编码机的输出也是和原始的输入数据进行对比。这种形式的训练旨在鼓励降噪自编码机不要去学习细节,而是一些更加宏观的特征,因为细微特征受到噪音的影响,学习细微特征得到的模型最终表现出来的性能总是很差。

    Vincent, Pascal, et al. “Extracting and composing robust features with denoising autoencoders.” Proceedings of the 25th international conference on Machine learning. ACM, 2008.
    http://machinelearning.org/archive/icml2008/papers/592.pdf

    13. 深度信念网络(DBN)

    多图|一文看懂25个神经网络模型

    深度信念网络(DBN:Deep belief networks)之所以取这个名字,是由于它本身几乎是由多个受限玻尔兹曼机或者变分自编码机堆砌而成。

    实践表明一层一层地对这种类型的神经网络进行训练非常有效,这样每一个自编码机或者受限玻尔兹曼机只需要学习如何编码前一神经元层的输出。这种训练技术也被称为贪婪训练,这里贪婪的意思是通过不断地获取局部最优解,最终得到一个相当不错解(但可能不是全局最优的)。可以通过对比散度算法或者反向传播算法进行训练,它会慢慢学着以一种概率模型来表征数据,就好像常规的自编码机或者受限玻尔兹曼机。一旦经过非监督式学习方式,训练或者收敛到了一个稳定的状态,那么这个模型就可以用来产生新的数据。如果以对比散度算法进行训练,那么它甚至可以用于区分现有的数据,因为那些神经元已经被引导来获取数据的不同特定。

    Bengio, Yoshua, et al. “Greedy layer-wise training of deep networks.” Advances in neural information processing systems 19 (2007): 153.
    https://papers.nips.cc/paper/3048-greedy-layer-wise-training-of-deep-networks.pdf

    14. 卷积神经网络(CNN)

    多图|一文看懂25个神经网络模型

    卷积神经网络(CNN:Convolutional neural networks)或深度卷积神经网络(DCNN:deep convolutional neural networks)跟其它类型的神经网络大有不同。它们主要用于处理图像数据,但可用于其它形式数据的处理,如语音数据。对于卷积神经网络来说,一个典型的应用就是给它输入一个图像,而后它会给出一个分类结果。也就是说,如果你给它一张猫的图像,它就输出“猫”;如果你给一张狗的图像,它就输出“狗”。

    卷积神经网络是从一个数据扫描层开始,这种形式的处理并没有尝试在一开始就解析整个训练数据。比如:对于一个大小为200X200像素的图像,你不会想构建一个40000个节点的神经元层。而是,构建一个20X20像素的输入扫描层,然后,把原始图像第一部分的20X20像素图像(通常是从图像的左上方开始)输入到这个扫描层。当这部分图像(可能是用于进行卷积神经网络的训练)处理完,你会接着处理下一部分的20X20像素图像:逐渐(通常情况下是移动一个像素,但是,移动的步长是可以设置的)移动扫描层,来处理原始数据。

    注意,你不是一次性移动扫描层20个像素(或其它任何扫描层大小的尺度),也不是把原始图像切分成20X20像素的图像块,而是用扫描层在原始图像上滑过。这个输入数据(20X20像素的图像块)紧接着被输入到卷积层,而非常规的神经细胞层——卷积层的节点不是全连接。每一个输入节点只会和最近的那个神经元节点连接(至于多近要取决于具体的实现,但通常不会超过几个)。

    这些卷积层会随着深度的增加而逐渐变小:大多数情况下,会按照输入层数量的某个因子缩小(比如:20个神经元的卷积层,后面是10个神经元的卷积层,再后面就是5个神经元的卷积层)。2的n次方(32, 16, 8, 4, 2, 1)也是一个非常常用的因子,因为它们在定义上可以简洁且完整地除尽。除了卷积层,池化层(pooling layers)也非常重要。

    池化是一种过滤掉细节的方式:一种常用的池化方式是最大池化,比如用2X2的像素,然后取四个像素中值最大的那个传递。为了让卷积神经网络处理语音数据,需要把语音数据切分,一段一段输入。在实际应用中,通常会在卷积神经网络后面加一个前馈神经网络,以进一步处理数据,从而对数据进行更高水平的非线性抽象。

    LeCun, Yann, et al. “Gradient-based learning applied to document recognition.” Proceedings of the IEEE 86.11 (1998): 2278-2324.
    http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf

    15. 解卷积网络(DN)

    多图|一文看懂25个神经网络模型

    解卷积网络(DN:Deconvolutional networks),又称为逆图形网络(IGNs:inverse graphics networks),是逆向的卷积神经网络。

    想象一下,给一个神经网络输入一个“猫”的词,就可以生成一个像猫一样的图像,通过比对它和真实的猫的图片来进行训练。跟常规CNN一样,DN也可以结合FFNN使用,但没必要为这个新的缩写重新做图解释。它们可被称为深度解卷积网络,但把FFNN放到DNN前面和后面是不同的,那是两种架构(也就需要两个名字),对于是否需要两个不同的名字你们可能会有争论。需要注意的是,绝大多数应用都不会把文本数据直接输入到神经网络,而是用二元输入向量。比如<0,1>代表猫,<1,0>代表狗,<1,1>代表猫和狗。

    CNN的池化层往往也是被对应的逆向操作替换了,主要是插值和外推(基于一个基本的假设:如果一个池化层使用了最大池化,你可以在逆操作的时候生成一些相对于最大值更小的数据)。

    Zeiler, Matthew D., et al. “Deconvolutional networks.” Computer Vision and Pattern Recognition (CVPR), 2010 IEEE Conference on. IEEE, 2010.
    http://www.matthewzeiler.com/pubs/cvpr2010/cvpr2010.pdf

    16. 深度卷积逆向图网络(DCIGN)

    多图|一文看懂25个神经网络模型

    深度卷积逆向图网络(DCIGN:Deep convolutional inverse graphics networks),这个名字具有误导性,因为它们实际上是VAE,但分别用CNN、DNN来作编码和解码的部分。

    这些网络尝试在编码过程中对“特征“进行概率建模,这样一来,你只要用猫和狗的独照,就能让它们生成一张猫和狗的合照。同理,你可以输入一张猫的照片,如果猫旁边有一只恼人的邻家狗,你可以让它们把狗去掉。很多演示表明,这种类型的网络能学会基于图像的复杂变换,比如灯光强弱的变化、3D物体的旋转。一般也是用反向传播算法来训练此类网络。

    Kulkarni, Tejas D., et al. “Deep convolutional inverse graphics network.” Advances in Neural Information Processing Systems. 2015.
    https://arxiv.org/pdf/1503.03167v4.pdf

    17. 生成式对抗网络(GAN)

    多图|一文看懂25个神经网络模型

    生成式对抗网络(GAN:Generative adversarial networks)是一类不同的网络,它们有一对“双胞胎”:两个网络协同工作。

    GAN可由任意两种网络组成(但通常是FF和CNN),其中一个用于生成内容,另一个则用于鉴别生成的内容。

    鉴别网络(discriminating network)同时接收训练数据和生成网络(generative network)生成的数据。鉴别网络的准确率,被用作生成网络误差的一部分。这就形成了一种竞争:鉴别网络越来越擅长于区分真实的数据和生成数据,而生成网络也越来越善于生成难以预测的数据。这种方式非常有效,部分是因为:即便相当复杂的类噪音模式最终都是可预测的,但跟输入数据有着极为相似特征的生成数据,则很难区分。

    训练GAN极具挑战性,因为你不仅要训练两个神经网络(其中的任何一个都会出现它自己的问题),同时还要平衡两者的运行机制。如果预测或生成相比对方表现得过好,这个GAN就不会收敛,因为它会内部发散。

    Goodfellow, Ian, et al. “Generative adversarial nets.” Advances in Neural Information Processing Systems. 2014.
    https://arxiv.org/pdf/1406.2661v1.pdf

    18. 循环神经网络(RNN)

    多图|一文看懂25个神经网络模型

    循环神经网络(RNN:Recurrent neural networks)是具有时间联结的前馈神经网络:它们有了状态,通道与通道之间有了时间上的联系。神经元的输入信息,不仅包括前一神经细胞层的输出,还包括它自身在先前通道的状态。

    这就意味着:你的输入顺序将会影响神经网络的训练结果:相比先输入“曲奇饼”再输入“牛奶”,先输入“牛奶”再输入“曲奇饼”后,或许会产生不同的结果。RNN存在一大问题:梯度消失(或梯度爆炸,这取决于所用的激活函数),信息会随时间迅速消失,正如FFNN会随着深度的增加而失去信息一样。

    直觉上,这不算什么大问题,因为这些都只是权重,而非神经元的状态,但随时间变化的权重正是来自过去信息的存储;如果权重是0或1000000,那之前的状态就不再有信息价值。

    原则上,RNN可以在很多领域使用,因为大部分数据在形式上不存在时间线的变化,(不像语音或视频),它们能以某种序列的形式呈现出来。一张图片或一段文字可以一个像素或者一个文字地进行输入,因此,与时间相关的权重描述了该序列前一步发生了什么,而不是多少秒之前发生了什么。一般来说,循环神经网络是推测或补全信息很好的选择,比如自动补全。

    Elman, Jeffrey L. “Finding structure in time.” Cognitive science 14.2 (1990): 179-211.
    https://crl.ucsd.edu/~elman/Papers/fsit.pdf

    19. 长短期记忆(LSTM)

    多图|一文看懂25个神经网络模型

    长短期记忆(LSTM:Long / short term memory)网络试图通过引入门结构与明确定义的记忆单元来解决梯度消失/爆炸的问题。

    这更多的是受电路图设计的启发,而非生物学上某种和记忆相关机制。每个神经元都有一个记忆单元和三个门:输入门、输出门、遗忘门。这三个门的功能就是通过禁止或允许信息流动来保护信息。

    输入门决定了有多少前一神经细胞层的信息可留在当前记忆单元,输出层在另一端决定下一神经细胞层能从当前神经元获取多少信息。遗忘门乍看很奇怪,但有时候遗忘部分信息是很有用的:比如说它在学习一本书,并开始学一个新的章节,那遗忘前面章节的部分角色就很有必要了。

    实践证明,LSTM可用来学习复杂的序列,比如像莎士比亚一样写作,或创作全新的音乐。值得注意的是,每一个门都对前一神经元的记忆单元赋有一个权重,因此会需要更多的计算资源。

    Hochreiter, Sepp, and Jürgen Schmidhuber. “Long short-term memory.” Neural computation 9.8 (1997): 1735-1780.
    http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf

    20. 门循环单元(GRU)

    多图|一文看懂25个神经网络模型

    门循环单元(GRU : Gated recurrent units)是LSTM的一种轻量级变体。它们少了一个门,同时连接方式也稍有不同:它们采用了一个更新门(update gate),而非LSTM所用的输入门、输出门、遗忘门。

    更新门决定了保留多少上一个状态的信息,还决定了收取多少来自前一神经细胞层的信息。重置门(reset gate)跟LSTM遗忘门的功能很相似,但它存在的位置却稍有不同。它们总是输出完整的状态,没有输出门。多数情况下,它们跟LSTM类似,但最大的不同是:GRU速度更快、运行更容易(但函数表达力稍弱)。

    在实践中,这里的优势和劣势会相互抵消:当你你需要更大的网络来获取函数表达力时,这样反过来,性能优势就被抵消了。在不需要额外的函数表达力时,GRU的综合性能要好于LSTM。

    Chung, Junyoung, et al. “Empirical evaluation of gated recurrent neural networks on sequence modeling.” arXiv preprint arXiv:1412.3555 (2014).
    https://arxiv.org/pdf/1412.3555v1.pdf

    21. 神经图灵机(NTM)

    多图|一文看懂25个神经网络模型

    神经图灵机(NTM: Neural Turing machines)可以理解为对LSTM的抽象,它试图把神经网络去黑箱化(以窥探其内部发生的细节)。

    NTM不是把记忆单元设计在神经元内,而是分离出来。NTM试图结合常规数字信息存储的高效性、永久性与神经网络的效率及函数表达能力。它的想法是设计一个可作内容寻址的记忆库,并让神经网络对其进行读写操作。NTM名字中的“图灵(Turing)”是表明,它是图灵完备(Turing complete)的,即具备基于它所读取的内容来读取、写入、修改状态的能力,也就是能表达一个通用图灵机所能表达的一切。

    Graves, Alex, Greg Wayne, and Ivo Danihelka. “Neural turing machines.” arXiv preprint arXiv:1410.5401 (2014).
    https://arxiv.org/pdf/1410.5401v2.pdf

    22. BiRNN、BiLSTM、BiGRU

    双向循环神经网络(BiRNN:Bidirectional recurrent neural networks)、双向长短期记忆网络(BiLSTM:bidirectional long / short term memory networks )和双向门控循环单元(BiGRU:bidirectional gated recurrent units)在图表中并未呈现出来,因为它们看起来与其对应的单向神经网络结构一样。

    所不同的是,这些网络不仅与过去的状态有连接,而且与未来的状态也有连接。比如,通过一个一个地输入字母,训练单向的LSTM预测“鱼(fish)”(在时间轴上的循环连接记住了过去的状态值)。在BiLSTM的反馈通路输入序列中的下一个字母,这使得它可以了解未来的信息是什么。这种形式的训练使得该网络可以填充信息之间的空白,而不是预测信息。因此,它在处理图像时不是扩展图像的边界,而是填补一张图片中的缺失。

    Schuster, Mike, and Kuldip K. Paliwal. “Bidirectional recurrent neural networks.” IEEE Transactions on Signal Processing 45.11 (1997): 2673-2681.
    http://www.di.ufpe.br/~fnj/RNA/bibliografia/BRNN.pdf

    23. 深度残差网络(DRN)

    多图|一文看懂25个神经网络模型

    深度残差网络(DRN: Deep residual networks)是非常深的FFNN网络,它有一种特殊的连接,可以把信息从某一神经细胞层传至后面几层(通常是2到5层)。

    该网络的目的不是要找输入数据与输出数据之间的映射,而是致力于构建输入数据与输出数据+输入数据之间的映射函数。本质上,它在结果中增加一个恒等函数,并跟前面的输入一起作为后一层的新输入。结果表明,当层数超过150后,这一网络将非常擅于学习模式,这比常规的2到5层要多得多。然而,有证据表明这些网络本质上只是没有时间结构的RNN,它们总是与没有门结构的LSTM相提并论。

    He, Kaiming, et al. “Deep residual learning for image recognition.” arXiv preprint arXiv:1512.03385 (2015).
    https://arxiv.org/pdf/1512.03385v1.pdf

    24. 回声状态网络(ESN)

    多图|一文看懂25个神经网络模型

    回声状态网络(ESN:Echo state networks)是另一种不同类型的(循环)网络。

    它的不同之处在于:神经元之间的连接是随机的(没有整齐划一的神经细胞层),其训练过程也有所不同。不同于输入数据后反向传播误差,ESN先输入数据、前馈、而后更新神经元状态,最后来观察结果。它的输入层和输出层在这里扮演的角色不太常规,输入层用来主导网络,输出层作为激活模式的观测器随时间展开。在训练过程中,只有观测和隐藏单元之间连接会被改变。

    Jaeger, Herbert, and Harald Haas. “Harnessing nonlinearity: Predicting chaotic systems and saving energy in wireless communication.” science 304.5667 (2004): 78-80.
    https://pdfs.semanticscholar.org/8922/17bb82c11e6e2263178ed20ac23db6279c7a.pdf

    25. 极限学习机(ELM)

    多图|一文看懂25个神经网络模型

    极限学习机(ELM:Extreme learning machines)本质上是拥有随机连接的FFNN。

    它们与LSM、ESN极为相似,除了循环特征和脉冲性质,它们还不使用反向传播。相反,它们先给权重设定随机值,然后根据最小二乘法拟合来一次性训练权重(在所有函数中误差最小)。这使ELM的函数拟合能力较弱,但其运行速度比反向传播快多了。

    Cambria, Erik, et al. “Extreme learning machines [trends & controversies].” IEEE Intelligent Systems 28.6 (2013): 30-59.
    http://www.ntu.edu.sg/home/egbhuang/pdf/ieee-is-elm.pdf

    26. 液态机(LSM)

    多图|一文看懂25个神经网络模型

    液态机(LSM:Liquid state machines)换汤不换药,跟ESN同样相近。

    区别在于,LSM是一种脉冲神经网络(spiking neural networks),用阈值激活函数(threshold functions)取代了sigmoid激活函数,每个神经元同时也是具有累加性质的记忆单元。因此,当神经元状态更新时,其值不是相邻神经元的累加值,而是它自身状态值的累加。一旦累加到阈值,它就释放能量至其它神经元。这就形成了一种类似于脉冲的模式:神经元不会进行任何操作,直至到达阈值的那一刻。

    Maass, Wolfgang, Thomas Natschläger, and Henry Markram. “Real-time computing without stable states: A new framework for neural computation based on perturbations.” Neural computation 14.11 (2002): 2531-2560.
    https://web.archive.org/web/20120222154641/http://ramsesii.upf.es/seminar/Maass_et_al_2002.pdf

    27. 支持向量机(SVM)

    多图|一文看懂25个神经网络模型

    支持向量机(SVM:Support vector machines)能为分类问题找出最优方案。

    传统意义上,它们只能处理线性可分的数据;比如找出哪张图片是加菲猫、哪张是史努比,此外就无法做其它输出了。

    训练过程中,SVM可以理解为:先在平面图表上标绘所有数据(加菲猫、史努比),然后找出到那条能够最好区分这两类数据点的线。这条线能把数据分为两部分,线的这边全是史努比,线的那边全是加菲猫。而后移动并优化该直线,令两边数据点到直线的距离最大化。分类新的数据,则将该数据点画在这个图表上,然后察看这个数据点在分隔线的哪一边(史努比一侧,还是加菲猫一侧)。

    通过使用核方法,SVM便可用来分类n维空间的数据。这就引出了在3维空间中标绘数据点,从而让SVM可以区分史努比、加菲猫与西蒙,甚至在更高的维度对更多卡通人物进行分类。SVM并不总被视为神经网络。

    Cortes, Corinna, and Vladimir Vapnik. “Support-vector networks.” Machine learning 20.3 (1995): 273-297.
    http://image.diku.dk/imagecanon/material/cortes_vapnik95.pdf

    28. Kohonen 网络

    多图|一文看懂25个神经网络模型

    最后,我们来介绍一下Kohonen网络(KN,也称之为自组织(特征)映射(SOM/SOFM:self organising (feature) map))。

    KN利用竞争学习来对数据进行分类,不需要监督。先给神经网络一个输入,而后它会评估哪个神经元最匹配该输入。然后这个神经元会继续调整以更好地匹配输入数据,同时带动相邻的神经元。相邻神经元移动的距离,取决于它们与最佳匹配单元之间的距离。KN有时也不被认为是神经网络。

    参考文献:
    Kohonen, Teuvo. “Self-organized formation of topologically correct feature maps.” Biological cybernetics 43.1 (1982): 59-69.
    http://cioslab.vcu.edu/alg/Visualize/kohonen-82.pdf
    原文链接:

    展开全文
  • 图|一文看懂25个神经网络模型

    万次阅读 多人点赞 2017-07-03 08:20:46
    光是知道各式各样的神经网络模型缩写(如:DCIGN、BiLSTM、DCGAN……还有哪些?),就已经让人招架不住了。 因此,这里整理出一份清单来梳理所有这些架构。其中大部分是人工神经网络,也有一些完全不同的怪物。...

    在深度学习十分火热的今天,不时会涌现出各种新型的人工神经网络,想要实时了解这些新型神经网络的架构还真是不容易。光是知道各式各样的神经网络模型缩写(如:DCIGN、BiLSTM、DCGAN……还有哪些?),就已经让人招架不住了。

    因此,这里整理出一份清单来梳理所有这些架构。其中大部分是人工神经网络,也有一些完全不同的怪物。尽管所有这些架构都各不相同、功能独特,当我在画它们的节点图时……其中潜在的关系开始逐渐清晰起来。

    把这些架构做成节点图,会存在一个问题:它无法展示神经网络架构内部的工作原理。举例来说,变分自编码机(VAE:variational autoencoders )看起来跟自编码机(AE:autoencoders)差不多,但它们的训练过程却大不相同。训练后的模型在使用场景上差别更大:VAE是生成器,通过插入噪音数据来获取新样本;而AE仅仅是把他们所收到的任何信息作为输入,映射到“记忆中”最相似的训练样本上。

    在介绍不同模型的神经元和神经细胞层之间的连接方式前,我们一步一步来,先来了解不同的神经元节点内部是如何工作的。

    神经元

    对不同类型的神经元标记不同的颜色,可以更好地在各种网络架构之间进行区分。但是,这些神经元的工作方式却是大同小异。在下图的基本神经元结构后面,你会看到详细的讲解:

    基本的人工神经网络神经元(basic neural network cell)相当简单,这种简单的类型可以在常规的前馈人工神经网络架构里面找到。这种神经元与其它神经元之间的连接具有权重,也就是说,它可以和前一层神经网络层中的所有神经元有连接。

    每一个连接都有各自的权重,通常情况下是一些随机值(关于如何对人工神经网络的权重进行初始化是一个非常重要的话题,这将会直接影响到之后的训练过程,以及最终整个模型的性能)。这个权重可以是负值,正值,非常小,或者非常大,也可以是零。和这个神经元连接的所有神经元的值都会乘以各自对应的权重。然后,把这些值都求和。

    在这个基础上,会额外加上一个bias,它可以用来避免输出为零的情况,并且能够加速某些操作,这让解决某个问题所需要的神经元数量也有所减少。这个bias也是一个数字,有些时候是一个常量(经常是-1或者1),有些时候会有所变化。这个总和最终被输入到一个激活函数,这个激活函数的输出最终就成为这个神经元的输出。

    多图|一文看懂25个神经网络模型

    卷积神经元(Convolutional cells)和前馈神经元非常相似,除了它们只跟前一神经细胞层的部分神经元有连接。因为它们不是和某些神经元随机连接的,而是与特定范围内的神经元相连接,通常用来保存空间信息。这让它们对于那些拥有大量局部信息,比如图像数据、语音数据(但多数情况下是图像数据),会非常实用。

    解卷积神经元恰好相反:它们是通过跟下一神经细胞层的连接来解码空间信息。这两种神经元都有很多副本,它们都是独立训练的;每个副本都有自己的权重,但连接方式却完全相同。可以认为,这些副本是被放在了具备相同结构的不同的神经网络中。这两种神经元本质上都是一般意义上的神经元,但是,它们的使用方式却不同。

    池化神经元和插值神经元(Pooling and interpolating cells)经常和卷积神经元结合起来使用。它们不是真正意义上的神经元,只能进行一些简单的操作

    池化神经元接受到来自其它神经元的输出过后,决定哪些值可以通过,哪些值不能通过。在图像领域,可以理解成是把一个图像缩小了(在查看图片的时候,一般软件都有一个放大、缩小的功能;这里的图像缩小,就相当于软件上的缩小图像;也就是说我们能看到图像的内容更加少了;在这个池化的过程当中,图像的大小也会相应地减少)。这样,你就再也不能看到所有的像素了,池化函数会知道什么像素该保留,什么像素该舍弃。

    插值神经元恰好是相反的操作它们获取一些信息,然后映射出更多的信息。额外的信息都是按照某种方式制造出来的,这就好像在一张小分辨率的图片上面进行放大。插值神经元不仅仅是池化神经元的反向操作,而且,它们也是很常见,因为它们运行非常快,同时,实现起来也很简单。池化神经元和插值神经元之间的关系,就像卷积神经元和解卷积神经元之间的关系。

    均值神经元和标准方差神经元(Mean and standard deviation cells)(作为概率神经元它们总是成对地出现)是一类用来描述数据概率分布的神经元。均值就是所有值的平均值,而标准方差描述的是这些数据偏离(两个方向)均值有多远。比如:一个用于图像处理的概率神经元可以包含一些信息,比如:在某个特定的像素里面有多少红色。举个例来说,均值可能是0.5,同时标准方差是0.2。当要从这些概率神经元取样的时候,你可以把这些值输入到一个高斯随机数生成器,这样就会生成一些分布在0.4和0.6之间的值;值离0.5越远,对应生成的概率也就越小。它们一般和前一神经元层或者下一神经元层是全连接,而且,它们没有偏差(bias)。

    循环神经元(Recurrent cells )不仅仅在神经细胞层之间有连接,而且在时间轴上也有相应的连接。每一个神经元内部都会保存它先前的值。它们跟一般的神经元一样更新,但是,具有额外的权重:与当前神经元之前值之间的权重,还有大多数情况下,与同一神经细胞层各个神经元之间的权重。当前值和存储的先前值之间权重的工作机制,与非永久性存储器(比如RAM)的工作机制很相似,继承了两个性质:

    • 第一,维持一个特定的状态;

    • 第二:如果不对其持续进行更新(输入),这个状态就会消失。

    由于先前的值是通过激活函数得到的,而在每一次的更新时,都会把这个值和其它权重一起输入到激活函数,因此,信息会不断地流失。实际上,信息的保存率非常的低,以至于仅仅四次或者五次迭代更新过后,几乎之前所有的信息都会流失掉。

    长短期记忆神经元(Long short term memory cells)用于克服循环神经元中信息快速流失的问题。

    LSTM是一个逻辑回路,其设计受到了计算机内存单元设计的启发。与只存储两个状态的循环神经元相比,LSTM可以存储四个状态:输出值的当前和先前值,记忆神经元状态的当前值和先前值它们都有三个门:输入门,输出门,遗忘门,同时,它们也还有常规的输入

    这些门它们都有各自的权重,也就是说,与这种类型的神经元细胞连接需要设置四个权重(而不是一个)。这些门的工作机制与流门(flow gates)很相似,而不是栅栏门(fence gates):它们可以让所有的信息都通过,或者只是通过部分,也可以什么都不让通过,或者通过某个区间的信息。

    这种运行机制的实现是通过把输入信息和一个在0到1之间的系数相乘,这个系数存储在当前门中。这样,输入门决定输入的信息有多少可以被叠加到当前门值。输出门决定有多少输出信息是可以传递到后面的神经网络中。遗忘门并不是和输出神经元的先前值相连接,而是,和前一记忆神经元相连接。它决定了保留多少记忆神经元最新的状态信息。因为没有和输出相连接,以及没有激活函数在这个循环中,因此只会有更少的信息流失。

    门控循环神经元(Gated recurrent units (cells))是LSTM的变体。它们同样使用门来抑制信息的流失,但是只用两个门:更新门和重置门。这使得构建它们付出的代价没有那么高,而且运行速度更加快了,因为它们在所有的地方使用了更少的连接。

    从本质上来说LSTM和GRU有两个不同的地方:

    • 第一:GRU神经元没有被输出门保护的隐神经元;

    • 第二:GRU把输出门和遗忘门整合在了一起,形成了更新门。核心的思想就是如果你想要一些新的信息,那么你就可以遗忘掉一些陈旧的信息(反过来也可以)。

    神经细胞层(Layers)

    形成一个神经网络,最简单的连接神经元方式是——把所有的神经元与其它所有的神经元相连接。这就好像Hopfield神经网络和玻尔兹曼机(Boltzmann machines)的连接方式。当然,这也就意味着连接数量会随着神经元个数的增加呈指数级地增加,但是,对应的函数表达力也会越来越强。这就是所谓的全连接(completely (or fully) connected)

    经历了一段时间的发展,发现把神经网络分解成不同的神经细胞层会非常有效。神经细胞层的定义是一群彼此之间互不连接的神经元,它们仅跟其它神经细胞层有连接。这一概念在受限玻尔兹曼机(Restricted Boltzmann Machines)中有所体现。现在,使用神经网络就意味着使用神经细胞层,并且是任意数量的神经细胞层。其中一个比较令人困惑的概念是全连接(fully connected or completely connected),也就是某一层的每个神经元跟另一层的所有神经元都有连接,但真正的全连接神经网络相当罕见。

    卷积连接层(Convolutionally connected layers)相对于全连接层要有更多的限制:在卷积连接层中的每一个神经元只与相邻的神经元层连接。图像和声音蕴含了大量的信息,如果一对一地输入到神经网络(比如,一个神经元对应一个像素)。卷积连接的形成,受益于保留空间信息更为重要的观察。实践证明这是一个非常好的猜测,因为现在大多数基于人工神经网络的图像和语音应用都使用了这种连接方式。然而,这种连接方式所需的代价远远低于全连接层的形式。从本质上来讲,卷积连接方式起到重要性过滤的作用,决定哪些紧紧联系在一起的信息包是重要的;卷积连接对于数据降维非常有用。

    当然了,还有另外一种选择,就是随机连接神经元(randomly connected neurons)。这种形式的连接主要有两种变体:

    • 第一,允许部分神经元进行全连接。

    • 第二,神经元层之间只有部分连接。

    随机连接方式有助于线性地降低人工神经网络的性能;当全连接层遇到性能问题的时候,在大规模人工神经网络中,使用随机连接方式非常有益。拥有更多神经元且更加稀疏的神经元层在某些情况下运行效果更好,特别是很多的信息需要被存储起来,但是,需要交换的信息并不多(这与卷积连接层的运行机制很相似,但是,它们是随机的)。非常稀疏的连接网络(1%或2%)也有被使用,比如ELMs, ESNs 和LSMs。这特别适用于脉冲网络(spiking networks),因为一个神经元拥有更多的连接,它对应的权重具有的能量也就更少,这也就意味着将会有更少的扩展和重复模式。

    时间滞后连接(Time delayed connections)是指相连的神经元(通常是在同一个神经元层,甚至于一个神经元自己跟自己连接),它们不从前面的神经元层获取信息,而是从神经元层先前的状态获取信息。这使得暂时(时间上或者序列上)联系在一起的信息可以被存储起来。这些形式的连接经常被手工重新进行设置,从而可以清除神经网络的状态。和常规连接的主要区别是,这种连接会持续不断地改变,即便这个神经网络当前没有处于训练状态。

    下图展示了以上所介绍的神经网络及其连接方式。当我卡在哪种神经元与哪个神经细胞层该连到一起的时候,就会拿这张图出来作为参考(尤其是在处理和分析LSTM与GRU神经元时):

    多图|一文看懂25个神经网络模型

    显而易见,整理一份完整的清单是不切实际的,因为新的架构正被源源不断地发明出来。所以,接下来这份清单的目的,只想带你一窥人工智能领域的基础设施。对于每一个画成节点图的架构,我都会写一个非常非常简短的描述。你会发现这些描述还是很有用的,毕竟,总还是有一些你并不是那么熟悉的架构。

    以下内容将详细介绍25个神经网络模型,如果你想阅读关于它们的原始论文,请在微信中回复“神经网络”,即可获得打包的PDF文件。

    多图|一文看懂25个神经网络模型

    值得一提的是,虽说大多数的简写都已被普遍接受,但总会出现一些冲突。RNNs有时表示递归神经网络(recursive neural networks),但大多时候,它们指的是循环神经网络(recurrent neural networks)。这还没完,它们在许多地方还会泛指各种循环架构,这包括在LSTMs、GRU甚至是双向变体。AEs也经常会面临同样的问题,VAEs、DAEs及其相似结构有时都被简称为AEs。很多缩写后面的“N”也常常会有所变化,因为同一个架构你既可称之为卷积神经网络(convolutional neural network),也可简称为卷积网络(convolutional network),这样就出现了CNN和CN两种形式。

    前馈神经网络(FFNN)

    前馈神经感知网络与感知机(FF or FFNN:Feed forward neural networks and P:perceptrons)非常简单,信息从前往后流动(分别对应输入和输出)。

    一般在描述神经网络的时候,都是从它的层说起,即相互平行的输入层、隐含层或者输出层神经结构。单独的神经细胞层内部,神经元之间互不相连;而一般相邻的两个神经细胞层则是全连接(一层的每个神经元和另一层的每一个神经元相连)。一个最简单却最具有实用性的神经网络由两个输入神经元和一个输出神经元构成,也就是一个逻辑门模型。给神经网络一对数据集(分别是“输入数据集”和“我们期望的输出数据集”),一般通过反向传播算法来训练前馈神经网络(FFNNs)。

    这就是所谓的监督式学习。与此相反的是无监督学习:我们只给输入,然后让神经网络去寻找数据当中的规律。反向传播的误差往往是神经网络当前输出和给定输出之间差值的某种变体(比如MSE或者仅仅是差值的线性变化)。如果神经网络具有足够的隐层神经元,那么理论上它总是能够建立输入数据和输出数据之间的关系。在实践中,FFNN的使用具有很大的局限性,但是,它们通常和其它神经网络一起组合成新的架构。

    Rosenblatt, Frank. “The perceptron: a probabilistic model for information storage and organization in the brain.” Psychological review 65.6 (1958): 386.

    http://www.ling.upenn.edu/courses/cogs501/Rosenblatt1958.pdf

    径向基神经网络(RBF)

    径向神经网络(RBF:Radial basis function)是一种以径向基核函数作为激活函数的前馈神经网络。没有更多描述了。这不是说没有相关的应用,但大多数以其它函数作为激活函数的FFNNs都没有它们自己的名字。这或许跟它们的发明年代有关系。

    Broomhead, David S., and David Lowe. Radial basis functions, multi-variable functional interpolation and adaptive networks. No. RSRE-MEMO-4148. ROYAL SIGNALS AND RADAR ESTABLISHMENT MALVERN (UNITED KINGDOM), 1988.

    http://www.dtic.mil/cgi-bin/GetTRDoc?AD=ADA196234

    霍普菲尔网络(HN)

    霍普菲尔网络(HN:Hopfield network)是一种每一个神经元都跟其它神经元相互连接的网络。

    这就像一盘完全搅在一起的意大利面,因为每个神经元都在充当所有角色:训练前的每一个节点都是输入神经元,训练阶段是隐神经元,输出阶段则是输出神经元。

    该神经网络的训练,是先把神经元的值设置到期望模式,然后计算相应的权重。在这以后,权重将不会再改变了。一旦网络被训练包含一种或者多种模式,这个神经网络总是会收敛于其中的某一种学习到的模式,因为它只会在某一个状态才会稳定。值得注意的是,它并不一定遵从那个期望的状态(很遗憾,它并不是那个具有魔法的黑盒子)。它之所以会稳定下来,部分要归功于在训练期间整个网络的“能量(Energy)”或“温度(Temperature)”会逐渐地减少。每一个神经元的激活函数阈值都会被设置成这个温度的值,一旦神经元输入的总和超过了这个阈值,那么就会让当前神经元选择状态(通常是-1或1,有时也是0或1)。

    可以多个神经元同步,也可以一个神经元一个神经元地对网络进行更新。一旦所有的神经元都已经被更新,并且它们再也没有改变,整个网络就算稳定(退火)了,那你就可以说这个网络已经收敛了。这种类型的网络被称为“联想记忆(associative memory)”,因为它们会收敛到和输入最相似的状态;比如,人类看到桌子的一半就可以想象出另外一半;与之相似,如果输入一半噪音+一半桌子,这个网络就能收敛到整张桌子。

    Hopfield, John J. “Neural networks and physical systems with emergent collective computational abilities.” Proceedings of the national academy of sciences 79.8 (1982): 2554-2558.

    https://bi.snu.ac.kr/Courses/g-ai09-2/hopfield82.pdf

    马尔可夫链(MC)

    马尔可夫链(MC:Markov Chain)或离散时间马尔可夫链(DTMC:MC or discrete time Markov Chain)在某种意义上是BMs和HNs的前身。可以这样来理解:从从我当前所处的节点开始,走到任意相邻节点的概率是多少呢?它们没有记忆(所谓的马尔可夫特性):你所得到的每一个状态都完全依赖于前一个状态。尽管算不上神经网络,但它却跟神经网络类似,并且奠定了BM和HN的理论基础。跟BM、RBM、HN一样,MC并不总被认为是神经网络。此外,它也并不总是全连接的。

    Hayes, Brian. “First links in the Markov chain.” American Scientist 101.2 (2013): 252.

    http://www.americanscientist.org/libraries/documents/201321152149545-2013-03Hayes.pdf

    玻尔兹曼机(BM)

    玻尔兹曼机(BM:Boltzmann machines)和霍普菲尔网络很接近,差别只是:一些神经元作为输入神经元,剩余的则是作为隐神经元。

    在整个神经网络更新过后,输入神经元成为输出神经元。刚开始神经元的权重都是随机的,通过反向传播(back-propagation)算法进行学习,或是最近常用的对比散度(contrastive divergence)算法(马尔可夫链用于计算两个信息增益之间的梯度)。

    相比HN,大多数BM的神经元激活模式都是二元的。BM由MC训练获得,因而是一个随机网络。BM的训练和运行过程,跟HN大同小异:为输入神经元设好钳位值,而后让神经网络自行学习。因为这些神经元可能会得到任意的值,我们反复地在输入和输出神经元之间来回地进行计算。激活函数的激活受全局温度的控制,如果全局温度降低了,那么神经元的能量也会相应地降低。这个能量上的降低导致了它们激活模式的稳定。在正确的温度下,这个网络会抵达一个平衡状态。

    Hinton, Geoffrey E., and Terrence J. Sejnowski. “Learning and releaming in Boltzmann machines.” Parallel distributed processing: Explorations in the microstructure of cognition 1 (1986): 282-317.

    https://www.researchgate.net/profile/Terrence_Sejnowski/publication/242509302_Learning_and_relearning_in_Boltzmann_machines/links/54a4b00f0cf256bf8bb327cc.pdf

    受限玻尔兹曼机(RBM)

    多图|一文看懂25个神经网络模型

    受限玻尔兹曼机(RBM:Restricted Boltzmann machines)与BM出奇地相似,因而也同HN相似。

    它们的最大区别在于:RBM更具实用价值,因为它们受到了更多的限制。它们不会随意在所有神经元间建立连接,而只在不同神经元群之间建立连接,因此任何输入神经元都不会同其他输入神经元相连,任何隐神经元也不会同其他隐神经元相连。

    RBM的训练方式就像稍微修改过的FFNN:前向通过数据之后再将这些数据反向传回(回到第一层),而非前向通过数据然后反向传播误差。之后,再使用前向和反向传播进行训练。

    Smolensky, Paul. Information processing in dynamical systems: Foundations of harmony theory. No. CU-CS-321-86. COLORADO UNIV AT BOULDER DEPT OF COMPUTER SCIENCE, 1986.

    http://www.dtic.mil/cgi-bin/GetTRDoc?Location=U2&doc=GetTRDoc.pdf&AD=ADA620727

    自编码机(AE)

    多图|一文看懂25个神经网络模型

    自编码机(AE:Autoencoders)和FFNN有些相近,因为它更像是FFNN的另一种用法,而非本质上完全不同的另一种架构。

    自编码机的基本思想是自动对信息进行编码(像压缩一样,而非加密),它也因此而得名。整个网络的形状酷似一个沙漏计时器,中间的隐含层较小,两边的输入层、输出层较大。自编码机总是对称的,以中间层(一层还是两层取决于神经网络层数的奇偶)为轴。最小的层(一层或者多层)总是在中间,在这里信息压缩程度最大(整个网络的关隘口)。在中间层之前为编码部分,中间层之后为解码部分,中间层则是编码部分。

    自编码机可用反向传播算法进行训练,给定输入,将误差设为输入和输出之差。自编码机的权重也是对称的,因此编码部分权重与解码部分权重完全一样。

    Bourlard, Hervé, and Yves Kamp. “Auto-association by multilayer perceptrons and singular value decomposition.” Biological cybernetics 59.4-5 (1988): 291-294.

    https://pdfs.semanticscholar.org/f582/1548720901c89b3b7481f7500d7cd64e99bd.pdf

    稀疏自编码机(SAE)

    多图|一文看懂25个神经网络模型

    稀疏自编码机(SAE:Sparse autoencoders)某种程度上同自编码机相反。稀疏自编码机不是用更小的空间表征大量信息,而是把原本的信息编码到更大的空间内。因此,中间层不是收敛,而是扩张,然后再还原到输入大小。它可以用于提取数据集内的小特征。

    如果用训练自编码机的方式来训练稀疏自编码机,几乎所有的情况,都是得到毫无用处的恒等网络(输入=输出,没有任何形式的变换或分解)。为避免这种情况,需要在反馈输入中加上稀疏驱动数据。稀疏驱动的形式可以是阈值过滤,这样就只有特定的误差才会反向传播用于训练,而其它的误差则被忽略为0,不会用于反向传播。这很像脉冲神经网络(并不是所有的神经元一直都会输出)。

    Marc’Aurelio Ranzato, Christopher Poultney, Sumit Chopra, and Yann LeCun. “Efficient learning of sparse representations with an energy-based model.” Proceedings of NIPS. 2007.

    https://papers.nips.cc/paper/3112-efficient-learning-of-sparse-representations-with-an-energy-based-model.pdf

    变分自编码机(VAE)

    多图|一文看懂25个神经网络模型

    变分自编码机(VAE:Variational autoencoders)和AE有着相同的架构,却被教会了不同的事情:输入样本的一个近似概率分布,这让它跟BM、RBM更相近。

    不过,VAE却依赖于贝叶斯理论来处理概率推断和独立(probabilistic inference and independence),以及重新参数化(re-parametrisation)来进行不同的表征。推断和独立非常直观,但却依赖于复杂的数学理论。基本原理是:把影响纳入考虑。如果在一个地方发生了一件事情,另外一件事情在其它地方发生了,它们不一定就是关联在一起的。如果它们不相关,那么误差传播应该考虑这个因素。这是一个有用的方法,因为神经网络是一个非常大的图表,如果你能在某些节点排除一些来自于其它节点的影响,随着网络深度地增加,这将会非常有用。

    Kingma, Diederik P., and Max Welling. “Auto-encoding variational bayes.” arXiv preprint arXiv:1312.6114 (2013).

    https://arxiv.org/pdf/1312.6114v10.pdf

    去噪自编码机(DAE)

    去噪自编码机(DAE:Denoising autoencoders)是一种自编码机,它的训练过程,不仅要输入数据,还有再加上噪音数据(就好像让图像变得更加模糊一样)。

    但在计算误差的时候跟自动编码机一样,降噪自动编码机的输出也是和原始的输入数据进行对比。这种形式的训练旨在鼓励降噪自编码机不要去学习细节,而是一些更加宏观的特征,因为细微特征受到噪音的影响,学习细微特征得到的模型最终表现出来的性能总是很差。

    Vincent, Pascal, et al. “Extracting and composing robust features with denoising autoencoders.” Proceedings of the 25th international conference on Machine learning. ACM, 2008.

    http://machinelearning.org/archive/icml2008/papers/592.pdf

    深度信念网络(DBN)

    多图|一文看懂25个神经网络模型

    深度信念网络(DBN:Deep belief networks)之所以取这个名字,是由于它本身几乎是由多个受限玻尔兹曼机或者变分自编码机堆砌而成。

    实践表明一层一层地对这种类型的神经网络进行训练非常有效,这样每一个自编码机或者受限玻尔兹曼机只需要学习如何编码前一神经元层的输出。这种训练技术也被称为贪婪训练,这里贪婪的意思是通过不断地获取局部最优解,最终得到一个相当不错解(但可能不是全局最优的)。可以通过对比散度算法或者反向传播算法进行训练,它会慢慢学着以一种概率模型来表征数据,就好像常规的自编码机或者受限玻尔兹曼机。一旦经过非监督式学习方式,训练或者收敛到了一个稳定的状态,那么这个模型就可以用来产生新的数据。如果以对比散度算法进行训练,那么它甚至可以用于区分现有的数据,因为那些神经元已经被引导来获取数据的不同特定。

    Bengio, Yoshua, et al. “Greedy layer-wise training of deep networks.” Advances in neural information processing systems 19 (2007): 153.

    https://papers.nips.cc/paper/3048-greedy-layer-wise-training-of-deep-networks.pdf

    卷积神经网络(CNN)

    多图|一文看懂25个神经网络模型

    卷积神经网络(CNN:Convolutional neural networks)或深度卷积神经网络(DCNN:deep convolutional neural networks)跟其它类型的神经网络大有不同。它们主要用于处理图像数据,但可用于其它形式数据的处理,如语音数据。对于卷积神经网络来说,一个典型的应用就是给它输入一个图像,而后它会给出一个分类结果。也就是说,如果你给它一张猫的图像,它就输出“猫”;如果你给一张狗的图像,它就输出“狗”。

    卷积神经网络是从一个数据扫描层开始,这种形式的处理并没有尝试在一开始就解析整个训练数据。比如:对于一个大小为200X200像素的图像,你不会想构建一个40000个节点的神经元层。而是,构建一个20X20像素的输入扫描层,然后,把原始图像第一部分的20X20像素图像(通常是从图像的左上方开始)输入到这个扫描层。当这部分图像(可能是用于进行卷积神经网络的训练)处理完,你会接着处理下一部分的20X20像素图像:逐渐(通常情况下是移动一个像素,但是,移动的步长是可以设置的)移动扫描层,来处理原始数据。

    注意,你不是一次性移动扫描层20个像素(或其它任何扫描层大小的尺度),也不是把原始图像切分成20X20像素的图像块,而是用扫描层在原始图像上滑过。这个输入数据(20X20像素的图像块)紧接着被输入到卷积层,而非常规的神经细胞层——卷积层的节点不是全连接。每一个输入节点只会和最近的那个神经元节点连接(至于多近要取决于具体的实现,但通常不会超过几个)。

    这些卷积层会随着深度的增加而逐渐变小:大多数情况下,会按照输入层数量的某个因子缩小(比如:20个神经元的卷积层,后面是10个神经元的卷积层,再后面就是5个神经元的卷积层)。2的n次方(32, 16, 8, 4, 2, 1)也是一个非常常用的因子,因为它们在定义上可以简洁且完整地除尽。除了卷积层,池化层(pooling layers)也非常重要。

    池化是一种过滤掉细节的方式:一种常用的池化方式是最大池化,比如用2X2的像素,然后取四个像素中值最大的那个传递。为了让卷积神经网络处理语音数据,需要把语音数据切分,一段一段输入。在实际应用中,通常会在卷积神经网络后面加一个前馈神经网络,以进一步处理数据,从而对数据进行更高水平的非线性抽象。

    LeCun, Yann, et al. “Gradient-based learning applied to document recognition.” Proceedings of the IEEE 86.11 (1998): 2278-2324.

    http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf

    解卷积网络(DN)

    多图|一文看懂25个神经网络模型

    解卷积网络(DN:Deconvolutional networks),又称为逆图形网络(IGNs:inverse graphics networks),是逆向的卷积神经网络。

    想象一下,给一个神经网络输入一个“猫”的词,就可以生成一个像猫一样的图像,通过比对它和真实的猫的图片来进行训练。跟常规CNN一样,DN也可以结合FFNN使用,但没必要为这个新的缩写重新做图解释。它们可被称为深度解卷积网络,但把FFNN放到DNN前面和后面是不同的,那是两种架构(也就需要两个名字),对于是否需要两个不同的名字你们可能会有争论。需要注意的是,绝大多数应用都不会把文本数据直接输入到神经网络,而是用二元输入向量。比如<0,1>代表猫,<1,0>代表狗,<1,1>代表猫和狗。

    CNN的池化层往往也是被对应的逆向操作替换了,主要是插值和外推(基于一个基本的假设:如果一个池化层使用了最大池化,你可以在逆操作的时候生成一些相对于最大值更小的数据)。

    Zeiler, Matthew D., et al. “Deconvolutional networks.” Computer Vision and Pattern Recognition (CVPR), 2010 IEEE Conference on. IEEE, 2010.

    http://www.matthewzeiler.com/pubs/cvpr2010/cvpr2010.pdf

    深度卷积逆向图网络(DCIGN)

    多图|一文看懂25个神经网络模型

    深度卷积逆向图网络(DCIGN:Deep convolutional inverse graphics networks),这个名字具有误导性,因为它们实际上是VAE,但分别用CNN、DNN来作编码和解码的部分。

    这些网络尝试在编码过程中对“特征“进行概率建模,这样一来,你只要用猫和狗的独照,就能让它们生成一张猫和狗的合照。同理,你可以输入一张猫的照片,如果猫旁边有一只恼人的邻家狗,你可以让它们把狗去掉。很多演示表明,这种类型的网络能学会基于图像的复杂变换,比如灯光强弱的变化、3D物体的旋转。一般也是用反向传播算法来训练此类网络。

    Kulkarni, Tejas D., et al. “Deep convolutional inverse graphics network.” Advances in Neural Information Processing Systems. 2015.

    https://arxiv.org/pdf/1503.03167v4.pdf

    生成式对抗网络(GAN)

    多图|一文看懂25个神经网络模型

    生成式对抗网络(GAN:Generative adversarial networks)是一类不同的网络,它们有一对“双胞胎”:两个网络协同工作。

    GAN可由任意两种网络组成(但通常是FF和CNN),其中一个用于生成内容,另一个则用于鉴别生成的内容

    鉴别网络(discriminating network)同时接收训练数据和生成网络(generative network)生成的数据。鉴别网络的准确率,被用作生成网络误差的一部分。这就形成了一种竞争:鉴别网络越来越擅长于区分真实的数据和生成数据,而生成网络也越来越善于生成难以预测的数据。这种方式非常有效,部分是因为:即便相当复杂的类噪音模式最终都是可预测的,但跟输入数据有着极为相似特征的生成数据,则很难区分。

    训练GAN极具挑战性,因为你不仅要训练两个神经网络(其中的任何一个都会出现它自己的问题),同时还要平衡两者的运行机制。如果预测或生成相比对方表现得过好,这个GAN就不会收敛,因为它会内部发散。

    Goodfellow, Ian, et al. “Generative adversarial nets.” Advances in Neural Information Processing Systems. 2014.

    https://arxiv.org/pdf/1406.2661v1.pdf

    循环神经网络(RNN)

    多图|一文看懂25个神经网络模型

    循环神经网络(RNN:Recurrent neural networks)是具有时间联结的前馈神经网络:它们有了状态,通道与通道之间有了时间上的联系。神经元的输入信息,不仅包括前一神经细胞层的输出,还包括它自身在先前通道的状态。

    这就意味着:你的输入顺序将会影响神经网络的训练结果:相比先输入“曲奇饼”再输入“牛奶”,先输入“牛奶”再输入“曲奇饼”后,或许会产生不同的结果。RNN存在一大问题:梯度消失(或梯度爆炸,这取决于所用的激活函数),信息会随时间迅速消失,正如FFNN会随着深度的增加而失去信息一样。

    直觉上,这不算什么大问题,因为这些都只是权重,而非神经元的状态,但随时间变化的权重正是来自过去信息的存储;如果权重是0或1000000,那之前的状态就不再有信息价值。

    原则上,RNN可以在很多领域使用,因为大部分数据在形式上不存在时间线的变化,(不像语音或视频),它们能以某种序列的形式呈现出来。一张图片或一段文字可以一个像素或者一个文字地进行输入,因此,与时间相关的权重描述了该序列前一步发生了什么,而不是多少秒之前发生了什么。一般来说,循环神经网络是推测或补全信息很好的选择,比如自动补全。

    Elman, Jeffrey L. “Finding structure in time.” Cognitive science 14.2 (1990): 179-211.

    https://crl.ucsd.edu/~elman/Papers/fsit.pdf

    长短期记忆(LSTM)

    多图|一文看懂25个神经网络模型

    长短期记忆(LSTM:Long / short term memory)网络试图通过引入门结构与明确定义的记忆单元来解决梯度消失/爆炸的问题。

    这更多的是受电路图设计的启发,而非生物学上某种和记忆相关机制。每个神经元都有一个记忆单元和三个门:输入门、输出门、遗忘门。这三个门的功能就是通过禁止或允许信息流动来保护信息。

    输入门决定了有多少前一神经细胞层的信息可留在当前记忆单元,输出层在另一端决定下一神经细胞层能从当前神经元获取多少信息。遗忘门乍看很奇怪,但有时候遗忘部分信息是很有用的:比如说它在学习一本书,并开始学一个新的章节,那遗忘前面章节的部分角色就很有必要了。

    实践证明,LSTM可用来学习复杂的序列,比如像莎士比亚一样写作,或创作全新的音乐。值得注意的是,每一个门都对前一神经元的记忆单元赋有一个权重,因此会需要更多的计算资源。

    Hochreiter, Sepp, and Jürgen Schmidhuber. “Long short-term memory.” Neural computation 9.8 (1997): 1735-1780.

    http://deeplearning.cs.cmu.edu/pdfs/Hochreiter97_lstm.pdf

    门循环单元(GRU)

    多图|一文看懂25个神经网络模型

    门循环单元(GRU : Gated recurrent units)是LSTM的一种轻量级变体。它们少了一个门,同时连接方式也稍有不同:它们采用了一个更新门(update gate),而非LSTM所用的输入门、输出门、遗忘门。

    更新门决定了保留多少上一个状态的信息,还决定了收取多少来自前一神经细胞层的信息。重置门(reset gate)跟LSTM遗忘门的功能很相似,但它存在的位置却稍有不同。它们总是输出完整的状态,没有输出门。多数情况下,它们跟LSTM类似,但最大的不同是:GRU速度更快、运行更容易(但函数表达力稍弱)。

    在实践中,这里的优势和劣势会相互抵消:当你你需要更大的网络来获取函数表达力时,这样反过来,性能优势就被抵消了。在不需要额外的函数表达力时,GRU的综合性能要好于LSTM。

    Chung, Junyoung, et al. “Empirical evaluation of gated recurrent neural networks on sequence modeling.” arXiv preprint arXiv:1412.3555 (2014).

    https://arxiv.org/pdf/1412.3555v1.pdf

    神经图灵机(NTM)

    多图|一文看懂25个神经网络模型

    神经图灵机(NTM: Neural Turing machines)可以理解为对LSTM的抽象,它试图把神经网络去黑箱化(以窥探其内部发生的细节)。

    NTM不是把记忆单元设计在神经元内,而是分离出来。NTM试图结合常规数字信息存储的高效性、永久性与神经网络的效率及函数表达能力。它的想法是设计一个可作内容寻址的记忆库,并让神经网络对其进行读写操作。NTM名字中的“图灵(Turing)”是表明,它是图灵完备(Turing complete)的,即具备基于它所读取的内容来读取、写入、修改状态的能力,也就是能表达一个通用图灵机所能表达的一切。

    Graves, Alex, Greg Wayne, and Ivo Danihelka. “Neural turing machines.” arXiv preprint arXiv:1410.5401 (2014).

    https://arxiv.org/pdf/1410.5401v2.pdf

    BiRNN、BiLSTM、BiGRU

    双向循环神经网络(BiRNN:Bidirectional recurrent neural networks)、双向长短期记忆网络(BiLSTM:bidirectional long / short term memory networks )和双向门控循环单元(BiGRU:bidirectional gated recurrent units)在图表中并未呈现出来,因为它们看起来与其对应的单向神经网络结构一样。

    所不同的是,这些网络不仅与过去的状态有连接,而且与未来的状态也有连接。比如,通过一个一个地输入字母,训练单向的LSTM预测“鱼(fish)”(在时间轴上的循环连接记住了过去的状态值)。在BiLSTM的反馈通路输入序列中的下一个字母,这使得它可以了解未来的信息是什么。这种形式的训练使得该网络可以填充信息之间的空白,而不是预测信息。因此,它在处理图像时不是扩展图像的边界,而是填补一张图片中的缺失。

    Schuster, Mike, and Kuldip K. Paliwal. “Bidirectional recurrent neural networks.” IEEE Transactions on Signal Processing 45.11 (1997): 2673-2681.

    http://www.di.ufpe.br/~fnj/RNA/bibliografia/BRNN.pdf

    深度残差网络(DRN)

    多图|一文看懂25个神经网络模型

    深度残差网络(DRN: Deep residual networks)是非常深的FFNN网络,它有一种特殊的连接,可以把信息从某一神经细胞层传至后面几层(通常是2到5层)。

    该网络的目的不是要找输入数据与输出数据之间的映射,而是致力于构建输入数据与输出数据+输入数据之间的映射函数。本质上,它在结果中增加一个恒等函数,并跟前面的输入一起作为后一层的新输入。结果表明,当层数超过150后,这一网络将非常擅于学习模式,这比常规的2到5层要多得多。然而,有证据表明这些网络本质上只是没有时间结构的RNN,它们总是与没有门结构的LSTM相提并论。

    He, Kaiming, et al. “Deep residual learning for image recognition.” arXiv preprint arXiv:1512.03385 (2015).

    https://arxiv.org/pdf/1512.03385v1.pdf

    回声状态网络(ESN)

    多图|一文看懂25个神经网络模型

    回声状态网络(ESN:Echo state networks)是另一种不同类型的(循环)网络。

    它的不同之处在于:神经元之间的连接是随机的(没有整齐划一的神经细胞层),其训练过程也有所不同。不同于输入数据后反向传播误差,ESN先输入数据、前馈、而后更新神经元状态,最后来观察结果。它的输入层和输出层在这里扮演的角色不太常规,输入层用来主导网络,输出层作为激活模式的观测器随时间展开。在训练过程中,只有观测和隐藏单元之间连接会被改变。

    Jaeger, Herbert, and Harald Haas. “Harnessing nonlinearity: Predicting chaotic systems and saving energy in wireless communication.” science 304.5667 (2004): 78-80.

    https://pdfs.semanticscholar.org/8922/17bb82c11e6e2263178ed20ac23db6279c7a.pdf

    极限学习机(ELM)

    多图|一文看懂25个神经网络模型

    极限学习机(ELM:Extreme learning machines)本质上是拥有随机连接的FFNN。

    它们与LSM、ESN极为相似,除了循环特征和脉冲性质,它们还不使用反向传播。相反,它们先给权重设定随机值,然后根据最小二乘法拟合来一次性训练权重(在所有函数中误差最小)。这使ELM的函数拟合能力较弱,但其运行速度比反向传播快多了。

    Cambria, Erik, et al. “Extreme learning machines [trends & controversies].” IEEE Intelligent Systems 28.6 (2013): 30-59.

    http://www.ntu.edu.sg/home/egbhuang/pdf/ieee-is-elm.pdf

    液态机(LSM)

    多图|一文看懂25个神经网络模型

    液态机(LSM:Liquid state machines)换汤不换药,跟ESN同样相近。

    区别在于,LSM是一种脉冲神经网络(spiking neural networks),用阈值激活函数(threshold functions)取代了sigmoid激活函数,每个神经元同时也是具有累加性质的记忆单元。因此,当神经元状态更新时,其值不是相邻神经元的累加值,而是它自身状态值的累加。一旦累加到阈值,它就释放能量至其它神经元。这就形成了一种类似于脉冲的模式:神经元不会进行任何操作,直至到达阈值的那一刻。

    Maass, Wolfgang, Thomas Natschläger, and Henry Markram. “Real-time computing without stable states: A new framework for neural computation based on perturbations.” Neural computation 14.11 (2002): 2531-2560.

    https://web.archive.org/web/20120222154641/http://ramsesii.upf.es/seminar/Maass_et_al_2002.pdf

    支持向量机(SVM)

    多图|一文看懂25个神经网络模型

    支持向量机(SVM:Support vector machines)能为分类问题找出最优方案。

    传统意义上,它们只能处理线性可分的数据;比如找出哪张图片是加菲猫、哪张是史努比,此外就无法做其它输出了。

    训练过程中,SVM可以理解为:先在平面图表上标绘所有数据(加菲猫、史努比),然后找出到那条能够最好区分这两类数据点的线。这条线能把数据分为两部分,线的这边全是史努比,线的那边全是加菲猫。而后移动并优化该直线,令两边数据点到直线的距离最大化。分类新的数据,则将该数据点画在这个图表上,然后察看这个数据点在分隔线的哪一边(史努比一侧,还是加菲猫一侧)。

    通过使用核方法,SVM便可用来分类n维空间的数据。这就引出了在3维空间中标绘数据点,从而让SVM可以区分史努比、加菲猫与西蒙,甚至在更高的维度对更多卡通人物进行分类。SVM并不总被视为神经网络。

    Cortes, Corinna, and Vladimir Vapnik. “Support-vector networks.” Machine learning 20.3 (1995): 273-297.

    http://image.diku.dk/imagecanon/material/cortes_vapnik95.pdf

    Kohonen 网络

    多图|一文看懂25个神经网络模型

    最后,我们来介绍一下Kohonen网络(KN,也称之为自组织(特征)映射(SOM/SOFM:self organising (feature) map))

    KN利用竞争学习来对数据进行分类,不需要监督。先给神经网络一个输入,而后它会评估哪个神经元最匹配该输入。然后这个神经元会继续调整以更好地匹配输入数据,同时带动相邻的神经元。相邻神经元移动的距离,取决于它们与最佳匹配单元之间的距离。KN有时也不被认为是神经网络。

    Kohonen, Teuvo. “Self-organized formation of topologically correct feature maps.” Biological cybernetics 43.1 (1982): 59-69.

    http://cioslab.vcu.edu/alg/Visualize/kohonen-82.pdf

    原文链接:

    http://www.asimovinstitute.org/neural-network-zoo/

    http://www.asimovinstitute.org/neural-network-zoo-prequel-cells-layers/

    展开全文
  • 神经网络模型

    千次阅读 2015-07-30 17:25:48
    神经网络(Neural Networks,NN)是由大量的、简单的处理单元(称为神经元)广泛地互相连接而形成的复杂网络系统,它反映了人脑功能的许多基本特征,是一高度复杂的非线性动力学习系统。神经网络具有大规模并行、...



    什么是神经网络

       神经网络(Neural Networks,NN)是由大量的、简单的处理单元(称为神经元)广泛地互相连接而形成的复杂网络系统,它反映了人脑功能的许多基本特征,是一个高度复杂的非线性动力学习系统。


       神经网络具有大规模并行、分布式存储和处理、自组织、自适应和自学能力,特别适合处理需要同时考虑许多因素和条件的、不精确和模糊的信息处理问题。


       神经网络的发展与神经科学、数理科学、认知科学、计算机科学、人工智能、信息科学、控制论、机器人学、微电子学、心理学、光计算、分子生物学等有关,是一门新兴的边缘交叉学科。


    通俗的说:神经网络就是模拟人的神经系统而实现的一种算法。我们都知道计算机擅长处理精确的事情,要么1,要么0.而神经网络算法可以让计算机像人一样去思考。处理一些不精确的事情。



    工作原理

    模型图


    人工神经网络是由大量的简单基本元件——神经元相互联接而成的自适应非线性动态系统。每个神经元的结构和功能比较简单,但大量神经元组合产生的系统行为却非常复杂。


    人工神经网络反映了人脑功能的若干基本特性,但并非生物系统的逼真描述,只是某种模仿、简化和抽象。


    与数字计算机比较,人工神经网络在构成原理和功能特点等方面更加接近人脑,它不是按给定的程序一步一步地执行运算,而是能够自身适应环境、总结规律、完成某种运算、识别或过程控制。


    人工神经网络首先要以一定的学习准则进行学习,然后才能工作。



    通过例子理解原理

    其实神经网络的工作过程就是 根据少部分具有代表性的样本学习,不断调整自身权重的过程。


    现以人工神经网络对于写“A”、“B”两个字母的识别为例进行说明,规定当“A”输入网络时,应该输出“1”,而当输入为“B”时,输出为“0”。


    所以网络学习的准则应该是:如果网络作出错误的的判决,则通过网络的学习,应使得网络减少下次犯同样错误的可能性。


    首先,给网络的各连接权值赋予(0,1)区间内的随机值,将“A”所对应的图象模式输入给网络,网络将输入模式加权求和、与门限比较、再进行非线性运算,得到网络的输出。

    在此情况下,网络输出为“1”和“0”的概率各为50%,也就是说是完全随机的。这时如果输出为“1”(结果正确),则使连接权值增大,以便使网络再次遇到“A”模式输入时,仍然能作出正确的判断。


    如果输出为“0”(即结果错误),则把网络连接权值朝着减小综合输入加权值的方向调整,其目的在于使网络下次再遇到“A”模式输入时,减小犯同样错误的可能性。


    如此操作调整,当给网络轮番输入若干个手写字母“A”、“B”后,经过网络按以上学习方法进行若干次学习后,网络判断的正确率将大大提高。


    这说明网络对这两个模式的学习已经获得了成功,它已将这两个模式分布地记忆在网络的各个连接权值上。当网络再次遇到其中任何一个模式时,能够作出迅速、准确的判断和识别。一般说来,网络中所含的神经元个数越多,则它能记忆、识别的模式也就越多。




    特点


    自适应与自组织

    人类大脑有很强的自适应与自组织特性,后天的学习与训练可以开发许多各具特色的活动功能。


    如盲人的听觉和触觉非常灵敏;聋哑人善于运用手势;训练有素的运动员可以表现出非凡的运动技巧等等。


    普通计算机的功能取决于程序中给出的知识和能力。显然,对于智能活动要通过总结编制程序将十分困难。


    人工神经网络也具有初步的自适应与自组织能力。在学习或训练过程中改变突触权重值,以适应周围环境的要求。


    同一网络因学习方式及内容不同可具有不同的功能。


    人工神经网络是一个具有学习能力的系统,可以发展知识,以致超过设计者原有的知识水平。


    通常,它的学习训练方式可分为两种,一种是有监督或称有导师的学习,这时利用给定的样本标准进行分类或模仿;另一种是无监督学习或称无为导师学习,这时,只规定学习方式或某些规则,则具体的学习内容随系统所处环境 (即输入信号情况)而异,系统可以自动发现环境特征和规律性,具有更近似人脑的功能。


    泛化能力

    泛化能力指对没有训练过的样本,有很好的预测能力和控制能力。特别是,当存在一些有噪声的样本,网络具备很好的预测能力。


    非线性映射能力

    当对系统对于设计人员来说,很透彻或者很清楚时,则一般利用数值分析,偏微分方程等数学工具建立精确的数学模型。


    但当对系统很复杂,或者系统未知,系统信息量很少时,建立精确的数学模型很困难时,神经网络的非线性映射能力则表现出优势,因为它不需要对系统进行透彻的了解,但是同时能达到输入与输出的映射关系,这就大大简化设计的难度


    高度并行性

    并行性具有一定的争议性。

    承认具有并行性理由:神经网络是根据人的大脑而抽象出来的数学模型,由于人可以同时做一些事,所以从功能的模拟角度上看,神经网络也应具备很强的并行性。


    多少年以来,人们从医学、生物学、生理学、哲学、信息学、计算机科学、认知学、组织协同学等各个角度企图认识并解答上述问题


    在寻找上述问题答案的研究过程中,这些年来逐渐形成了一个新兴的多学科交叉技术领域,称之为“神经网络”。


    神经网络的研究涉及众多学科领域,这些领域互相结合、相互渗透并相互推动。不同领域的科学家又从各自学科的兴趣与特色出发,提出不同的问题,从不同的角度进行研究。


    人工神经网络与通用的计算机对比

    下面将人工神经网络与通用的计算机工作特点来对比一下:


    若从速度的角度出发,人脑神经元之间传递信息的速度要远低于计算机,前者为毫秒量级,而后者的频率往往可达几百兆赫。


    但是,由于人脑是一个大规模并行与串行组合处理系统,因而,在许多问题上可以作出快速判断、决策和处理,其速度则远高于串行结构的普通计算机。


    人工神经网络的基本结构模仿人脑,具有并行处理特征,可以大大提高工作速度。


    人脑存贮信息的特点为利用突触效能的变化来调整存贮内容,也即信息存贮在神经元之间连接强度的分布上,存贮区与计算机区合为一体。


    虽然人脑每日有大量神经细胞死亡 (平均每小时约一千个),但不影响大脑的正常思维活动。


    普通计算机是具有相互独立的存贮器和运算器,知识存贮与数据运算互不相关,只有通过人编出的程序使之沟通,这种沟通不能超越程序编制者的预想。元器件的局部损坏及程序中的微小错误都可能引起严重的失常。




    应用场景

    场景

    以我完成的一个场景为例:

    房屋建筑中的建筑形态    分为 独栋别墅  双拼别墅  叠拼别墅  联排别墅   花园洋房   多层   小高层   中高层    高层   超高层

    之前每调查一个楼盘  都需要人工去判断它的建筑形态。

    因为 它涉及的元素比较多。

    要综合 最高楼层  是否有商业  总套数   住宅套数     4个元素才能判断  出 建筑形态

    计算机不可能收集到所有的 可能性 再去判断

    所以我们打算使用   神经网路 

    也就是 通过 少量的 标准样本学习   

    实现对大量样本的 预测判断

    最后设计了如下程序

    最终实现了    准确率 100%的预测

    软件样式



    学习样本




    预测结果



    具体的关键步骤在下一篇文章中记录。



    展开全文
  • DNA双螺旋(已对齐)合并神经网络(黄色) ...我从那篇论文中得到了灵感,在这里我想解释一下建立神经网络来解决这类问题的基本原理。要阅读这篇博客,不需要生物学方面的背景知识;为了直接进入计算部分,我将.
  • 25个神经网络模型

    千次阅读 2018-09-07 14:34:58
    1. 引言 1.1 神经元 1.2卷积神经元(Convolutional cells) ...1.5均值神经元和标准方差神经元(Mean and standard deviation cells)(作为概率神经元它们总是成对地出现) 1.6 循环神经元(Recurrent cell...
  • 机器学习-预测之BP神经网络模型原理及实战

    万次阅读 多人点赞 2019-03-17 15:14:39
    BP神经网络模型
  • BP神经网络模型

    千次阅读 2020-05-01 10:27:14
    在我看来BP神经网络就是一”万能的模型+误差修正函数“,每次根据训练得到的结果与预想结果进行误差分析,进而修改权值和阈值,一步一步得到能输出和预想结果一致的模型。举一例子:比如某厂商生产一种产品,...
  • 神经网络模型分类

    千次阅读 2014-12-08 18:48:00
    本文主要介绍一下几种不同类型的神经网络模型,主要有前馈神经网络,反馈神经网络,自组织神经网络,随机神经网络 1.前馈神经网络 1)自适应线性神经网络(Adaline) 自适应线性神经网络(Adaptive Linear,简称...
  • 德国资深机器学习专家Andrey Bulezyuk说到,“神经网络正在彻底改变机器学习,因为它们能够有效地模拟各种学科和行业的复杂抽象,且无需太人工参与。” 大体上,人工神经网络基本包含以下组件: 接收数据并传递...
  • 这一章不涉及太神经网络的原理,重点是介绍如何使用Torch7 神经网络    首先require(相当于c语言的include)nn包,该包是神经网络的依赖包,记得在语句最后加上“;”,这跟matlab一样不加的话会打印出来...
  • 神经网络模型简述 实例:交通运输能力预测设计 MATLAB程序及仿真结果 由于货物运输、地方经济及企业发展的紧密联系,因此作为反映货物运输需求的一项重要指标, 货运量预测研究和分析具有较强的实际意义。 常用的...
  • 视觉注意力的循环神经网络模型

    千次阅读 2017-05-31 21:27:59
    有选择地分配注意力,就能选择性地从图片或视频中提取一系列的区域,每次只对提取的区域进行处理,再逐渐地把这些信息结合起来,建立场景或者环境的动态内部表示,这就是本文所要讲述的循环神经网络注意力模型
  • (十四)深度神经网络模型用于评分卡模型(理论) 本篇文章主要讲解以下两内容 神经网络的概述 深度神经网络模型用于违约概率预测(代码实现看下一篇博客) 神经网络的概述 什么是人工神经网络 神经网络...
  • 机器学习笔记(四)BP神经网络模型

    千次阅读 2021-01-26 21:49:02
    标题1、基础概念2、结构特点3、网络模型4、人工神经网络简介4.1、神经元4.2、单层神经网络4.3、双层神经网络4.4、多层神经网络5、Bp神经网络6、实战 1、基础概念 人工神经网络的概念:其从信息处理角度对人脑神经元...
  • keras:构建多输入多输出模型多输入单输出模型

    万次阅读 多人点赞 2019-09-10 10:58:51
    一个具有两个输入和两个输出的模型: 我们试图预测 Twitter 上的一条新闻标题有多少转发和点赞数。模型的主要输入将是新闻标题本身,即一系列词语,但是为了增添趣味,我们的模型还添加了其他的辅助输入来接收额外的...
  • 语言:matlab(2019b) 需求:建立标准模型+生成独立运行的app 我用的是神经网络模型,...点击MATLAB Function生成一mat文件,里面有神经网络模型的确定好的参数以及计算过程,可以用来sim(预测新数据),保...
  • Keras 为支持快速实验而生,能够将我们的一些想法和方案迅速转换为结果,是一高层神经网络 API,由纯 Python 编写而成,以TensorFlow和Theano 为后端。 Keras 有以下一些特点: 简易和快速的模型设计; 极简...
  • tensorflow:使用TensorFlow实现神经网络模型的创建

    千次阅读 多人点赞 2020-10-19 19:57:54
    文章目录神经网络1.全连接层1.1 张量方式实现1.2 层方式实现2.神经网络2.1 张量方式实现2.2 层方式实现3.激活函数3.1 Sigmoid3.2 ReLU3.3 LeakyReLU3.4 Tanh4.输出层设计4.1Softmax5.误差计算5.1 均方差误差函数5.2 ...
  • 常用神经网络模型及其应用评述

    千次阅读 2017-05-23 20:04:08
    神经网络是由大量处理单元(神经元)互相连接而成的...神经网络的信息处理通过神经元的相互作用来实现,知识与信息的存贮表现在网络元件互连的分布式结构与联系,神经网络的学习和识别各神经元连接权系数的动态演化
  • 之前向大家介绍了一种基于Python第三方ann_visualizer模块的神经网络可视化方法,大家可以直接点击博客:基于Python的神经网络模型结构框架可视化绘图简便方法...这一基于代码的方法可以适用于 ...
  • 常见的神经网络模型大总结

    万次阅读 多人点赞 2018-08-20 11:12:24
    下表包含了大部分常用的模型(大部分是神经网络还有一些其他的模型)。虽然这些架构都是新奇独特的,但当我开始把它们的结果画下来的时候,每种架构的底层关系就会清晰。 显然这些节点图并不能显示各个模型的内部...
  • 目前的深层卷积神经网络模型非常耗费计算资源和内存,面临着在终端部署和低延迟需求场景下难以应用的问题。因此,一种很自然的解决方案就是在保证分类准确率不显著下降的前提下对深层卷积神经网络进行压缩和加速。
  • 偶然翻了一下微博,发现了@爱可可-爱生活老师转的,Hinton教授今年六月末在剑桥的一讲座。 视频度娘链接:http://pan.baidu.com/s/1eQjj0rS 整个讲座前半部分基本在回顾DL目前的几成就:RBM、DNN、CNN、RNN...
  • 《Pytorch - BP全连接神经网络模型

    千次阅读 2020-10-05 01:19:43
    这一次我想把之前自己手写的matlab实现的简易的传统的BP神经网络在Pytorch上重新实现一遍,想看看对比和效果差异。 这一次我设计的是一层的全连接网络[784, 400, 200, 100, 10]的网络,输入层是400节点,...
  • 如何提高卷积神将网络模型的泛化能力 在做工程的时候如何提高自己训练出来的模型的泛化能力是一项具有挑战性同时也是一件充满"玄学"的事情。回想我这一年半载训练的那么几任务的调参来讲,大概可以总结为下面这几...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,743
精华内容 21,497
关键字:

多个输入的神经网络模型建立