初识神经网络

举报
lwq1228 发表于 2021/07/28 08:55:34 2021/07/28
【摘要】 神经网络是存在于人脑中的生物神经网络的人工表示。人工神经网络是由深度学习模型结合而成的框架,已经被证明越来越有效和准确。

1、神经网络架构

神经网络架构指的是构成神经网络的构件。虽然有几种不同类型的神经网络,但其基本结构和基础保持不变。该架构包括:
层:只有三种类型的层,每层由单个节点组成,这些节点的数量取决于该层和整个神经网络的要求。一个节点可以被认为是一个神经元
	输入层:是由输入神经网络的输入数据组成的层,必须得有的层,这一层在神经网络中只能出现一次。每个输入节点都连接到前一层中的每个节点
	隐藏层:是进行实际计算的层,它在输入层之后,因为它作用于输入层提供的输入,而在输出层之前,因为它产生输出层提供的输出。
		隐藏层由被称为“激活节点”的节点组成。每个节点都有一个激活函数,这是一个对激活节点接收的输入执行的数学函数,以生成输出。
		这是唯一一种可以出现多次的层,因此在深层神经网络中,可能存在多达数百个隐藏层。隐藏层的数量取决于手头的任务。
	输出层:这是神经网络的最后一层,由提供所有处理和计算最终结果的节点组成。这也是一个必要层,因为神经网络必须基于输入数据产生输出。
节点:每个激活节点或神经元具有以下组成部分:
	激活:这是节点的当前状态,无论它是否处于活动状态。
	阈值(可选):如果存在,这将根据加权和是高于还是低于该阈值来确定神经元是否被激活。
	激活函数:这是根据输入和加权和为激活节点计算新激活的方法。
	输出函数:这基于激活函数为特定激活节点生成输出。
边:来自两个不同层的两个节点之间的连接被称为边。
偏置:偏置是一个节点,神经网络的每一层都有自己的偏置节点,输出层除外。偏置节点保存一个值,称为偏置。
	偏置是神经网络的一个重要方面,因为它允许激活函数向左或向右移动。这有助于模型更好地拟合数据,从而产生准确的输出。
激活函数:激活函数是神经网络隐藏层中激活节点的一部分。
	计算加权和、应用激活函数和产生激活值的过程称为前馈。
	激活函数有很多(Logistic、TanH、ReLU等)。sigmoid函数是目前最流行和简单的激活函数之一。

2、训练神经网络

深度学习模型的三个部分对模型产生的输出有影响:输入、连接权重和偏置以及激活函数

2.1、计算权重

权重在多层神经网络中起着非常重要的作用,因为改变单个连接的权重可以完全改变分配给其他连接的权重,从而改变由执行层产生的输出。因此,拥有最佳权重对于创建精确的深度学习模型是必要的。

2.2、损失函数

损失函数有时也被称为成本函数。

均方误差函数计算实际值和预测值之间的差值,对该差值求平方,然后对整个数据集取平均值。

对数损失用于分类模型,其输出是0到1范围内的概率值。预测概率和实际类别之间的差异越大,对数损失就越高。

2.3、梯度下降算法

在神经网络中,梯度下降算法和损失函数一起运行,以找到作为权重和偏置分配给连接的值。

常用两种:随机梯度下降、批量梯度下降

2.4、反向传播

线性回归基本上是一个神经网络,它没有隐藏层,具有身份激活函数(这是一个线性函数,因此是线性的)。

然而,当处理更大、更复杂的非线性神经网络时,计算出的损失通过网络返回每一层,然后再开始权重更新过程。损失向后传播,因此这被称为反向传播。

反向传播的过程就是使用梯度下降算法和损失函数更新权重的过程。

2.5、神经网络的设计及其应用

在训练和设计神经网络时,通常使用机器学习技术。神经网络可以分为:有监督神经网络、无监督神经网络

1、有监督神经网络:

有两种类型的有监督学习方法:

分类:是针对以离散类别或类作为目标输出的问题,例如Iris数据集。神经网络从样本输入和输出中学习如何正确分类新数据。

回归:是针对具有一系列连续数值作为目标输出的问题,例如房价。神经网络描述输入和输出之间的因果关系。

2、无监督神经网络

此类神经网络是在没有任何目标输出的数据上训练的,因此能够从数据中识别和得出模式和推论。这使得它们非常适合于识别类别关系和发现数据中的自然分布等任务。

聚类分析:是相似输入的组合。这些神经网络可用于基因序列分析和物体识别等。

创建神经网络

# 接下来,导入pandas
import pandas as pd

# 将数据存储在数据帧中
df = pd.read_csv('train_comment_small_50.csv', sep=',')
# df

# 导入正则表达式包
import re

# 创建一个函数,通过删除HTML标签、转义引号和普通引号来预处理评论:
def clean_comment(text):
    # 删除HTML标签
    text = re.sub('<[^<]+?>', ' ', text)
    # 删除转义的引号
    text = text.replace('\\"', '')
    # 删除普通引号
    text = text.replace('"', '')
    # 返回结果
    return text

# 将此功能应用于当前存储在数据框中的评论
df['cleaned_comment'] = df['comment_text'].apply(clean_comment)
# df

# 从scikit-learn导入train_test_split来将此数据分为训练集和验证集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(df['cleaned_comment'], df['toxic'], test_size=0.2)

# 从nltk库中导入nltk和stopwords
import nltk
# 现在机器学习模型和深度学习模型需要数值数据作为输入,目前我们的数据是文本形式的。
# 因此,我们将使用一种叫作计数向量器的算法将评论中出现的单词转换成单词计数向量
from sklearn.feature_extraction.text import CountVectorizer
from nltk.corpus import stopwords

vectorizer = CountVectorizer(binary=True, stop_words=stopwords.words('english'), lowercase=True, min_df=3, max_df=0.9, max_features=5000)
# 书中代码x_train_onehot = vectorizer.fit_transform(x_train)
# 得到的是scipy.sparse.csr.csr_matrix类型的数据,在训练模型fit时报错,
# 需要将scipy.sparse.csr.csr_matrix 转换为 ndarray类型,直接通过.A即可转换
x_train_onehot = vectorizer.fit_transform(x_train).A

# 我们将创建一个双层神经网络。
# 当定义神经网络时,层数不包括输入层,因为输入层是存在的,并且输入层不是计算过程的一部分。
# 因此,两层神经网络包括输入层、隐藏层和输出层。
# 从Keras导入模型和层
from keras.models import Sequential
from keras.layers import Dense

# 初始化神经网络
nn = Sequential()

# 添加隐藏层。指定层将具有的节点(节点拥有的激活函数)数量以及层的输入内容
nn.add(Dense(units=500, activation='relu', input_dim=len(vectorizer.get_feature_names())))

# 添加输出层。再次指定节点数量和激活函数。我们将在这里使用sigmoid函数,
# 因为这是一个二元分类问题(预测评论是正面的还是负面的)。我们将只有一个输出节点,因为输出只有一个值——1或0
nn.add(Dense(units=1, activation='sigmoid'))

# 我们现在要编译神经网络,并决定我们要使用哪个损失函数、优化算法和性能度量。
# 由于问题是二进制分类问题,我们将使用二进制交叉熵作为损失函数。优化算法基本上是梯度下降算法。
# 梯度下降存在不同的版本和修改。在这种情况下,我们将使用Adam算法,它是随机梯度下降的扩展
nn.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# 现在,让我们总结一下我们的模型,看看发生了什么
nn.summary()

# 现在,是时候训练模型了。将神经网络应用于我们之前划分的X-train和y-train数据
nn.fit(x_train_onehot[:-20], y_train[:-20], epochs=5, batch_size=128, verbose=1, validation_data=(x_train_onehot[-20:], y_train[-20:]))

# 将输入验证数据转换成字数向量并评估神经网络。打印精度分数,了解你的网络运行情况
scores = nn.evaluate(vectorizer.transform(x_test).A, y_test, verbose=1)
print("Accuracy: ", scores[1])

# 保存模型
# model.save('nn.hd5')

2.6、部署模型即服务的基础

模型部署有不同的类型,这取决于你最初创建模型的原因,具体有三种类型:

流式模型:一种随着不断输入数据而不断学习,然后做出预测的模型
分析即服务模型:AaAS——一种对任何人开放的交互模型
在线模型:一种只有在同一公司工作的人才能访问的模型

展示作品最常见的方式是通过网络应用程序。有多种部署平台可以帮助并允许你通过它们部署你的模型,例如深度认知、多层流和其他平台

Flask是在不使用现有平台的情况下部署你自己的模型的最简单的微网络框架。它是用Python写的。使用这个框架,你可以为你的模型构建一个Python应用程序接口,它将很容易地生成预测并为你显示它们。

流程如下:

1)为应用程序接口创建一个目录。
2)将你预先训练的神经网络模型复制到此目录。
3)编写一个加载该模型的程序,预处理输入,使其与模型的训练输入相匹配,使用该模型进行预测,并准备、发送、显示该预测。

举例:

# 导入numpy、panands和matplotlib.pyplot
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 将数据集加载到数据帧中
dataset = pd.read_csv('train_comment_small_100.csv', sep=',')
dataset

# 下一步是清理和准备数据。导入re和nltk。从nltk.corpus导入停止词。从nltk.stem.porter导入PorterStemmer。为要存储的已清理文本创建一个数组
import re
import nltk
from nltk.corpus import stopwords
from nltk.stem.porter import PorterStemmer
corpus = []

# 使用for循环,遍历每个实例(每次检查)。用“”(空白)替换所有非字母。将所有字母转换成小写。
# 将每个评论分成单独的单词。启动PorterStemmer。如果单词不是停止词,对单词执行词干。
# 把所有的单词连在一起,形成一个清晰的评论。将此清理后的检查附加到你创建的数组中。
for i in range(0, dataset.shape[0]-1):
    # 将句子中所有非字母的字符替换成空格字符
    review = re.sub('[^a-zA-Z]', ' ', dataset['comment_text'][i])
    # 将所有字母转换成小写
    review = review.lower()
    # 用空格拆分句子
    review = review.split()
    ps = PorterStemmer()
    # ps.stem 获取词干
    review = [ps.stem(word) for word in review if not word in set(stopwords.words('english'))]
    review = ' '.join(review)
    corpus.append(review)
    
# 导入CountVectorizer。用CountVectorizer将评论转换为字数向量
from sklearn.feature_extraction.text import CountVectorizer
# max_features:默认为None,可设为int,对所有关键词的term frequency进行降序排序,只取前max_features个作为关键词集
cv = CountVectorizer(max_features=20)

# 创建数组,将每个唯一的单词存储为自己的列,从而使它们成为独立变量
x = cv.fit_transform(corpus).toarray()
# 选取dataset中的第一列数据
y = dataset.iloc[:, 0]
# 取得前99行数据
y1 = y[:99]
y1

# 从sklearn.preprocessing导入LabelEncoder。在目标输出(y)上使用LabelEncoder
from sklearn import preprocessing
labelencoder_y = preprocessing.LabelEncoder()
y = labelencoder_y.fit_transform(y1)

# 导入train_test_split。将数据集分为训练集和验证集
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.20, random_state=0)

# 从sklearn.preprocessing导入StandardScaler。预处理。在训练集和验证集(X)的特征上使用StandardScaler
from sklearn.preprocessing import StandardScaler
# 标准化数据,保证每个维度的特征数据方差为1,均值为0,使得预测结果不会被某些维度过大的特征值而主导 
sc = StandardScaler()
# fit_transform()先拟合数据,再标准化  
x_train = sc.fit_transform(x_train)
# transform()数据标准化  
x_test = sc.transform(x_test)

# 现在下一个任务是创建神经网络。导入keras。从keras.models导入Sequential,从Keras层导入Dense
from keras.models import Sequential
from keras.layers import Dense

# 初始化神经网络。添加第一个隐藏层,以“relu”作为激活函数。
# 对第二个隐藏层重复步骤。添加带有“softmax”激活函数的输出层。
# 编译神经网络,使用“adam”作为优化器,“binary_crossentropy”作为损失函数,“精度”作为性能度量。
classifier = Sequential()
classifier.add(Dense(units=20, activation='relu', input_dim=20))
classifier.add(Dense(units=20, activation='relu'))
classifier.add(Dense(units=1, activation='softmax'))
classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 现在我们开始训练这个模型。将神经网络拟合到batch_size为3、nb_epoch为5的训练数据集中。
classifier.fit(x_train, y_train, batch_size=3, epochs=5)

# 验证模型。评估神经网络并打印准确度分数,看看精度怎么样了
y_pred = classifier.predict(x_test)
scores = classifier.evaluate(x_test, y_pred, verbose=1)
print("Accuracy: ", scores[1])

# (可选)通过从sklearn.metrics导入confusion_matrix来打印混淆矩阵。
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
scores
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200