神经网络(Neural network,NN)机器学习是一种基于人工神经网络的机器学习方法,它模拟了人类神经系统的工作原理。神经网络是由多个人工神经元组成的网络结构,每个神经元都接收输入信号、进行计算并生成输出信号。
首先了解一下神经元和层的概念:
神经元Neuron是神经网络的基本单元,模拟了生物神经系统中的神经元的功能。每个神经元接收来自其他神经元的输入信号,并通过计算生成输出信号。神经元具有权重weights和偏置bias,它们用于调节输入信号的影响力。
层Layer是神经网络中神经元的组织方式。神经网络通常由多个层次组成,包括输入层、隐藏层和输出层。输入层接收外部输入数据,隐藏层在输入层和输出层之间进行信息处理,输出层产生最终的输出结果。隐藏层可以有多层,每一层都由多个神经元组成。
神经网络Neural Network是由多个神经元和层次组成的网络结构。神经网络中的神经元通过连接connections相互关联,并进行信息传递和处理。每个神经元的输出作为其他神经元的输入,并通过权重和激活函数进行计算。神经网络通过调整权重来学习输入和输出之间的复杂关系。神经网络的层之间存在前向连接和反向连接。在前向传播过程中,输入信号从输入层开始向前传播,经过隐藏层的处理,最终到达输出层。在反向传播过程中,通过比较网络输出与目标输出的差异,计算梯度并反向传播,以更新神经网络中的权重,从而使得网络的输出更接近目标输出。
优点:
学习能力强:神经网络能够通过训练学习复杂的非线性关系,具有很强的模式识别和特征提取能力。它可以从大量数据中自动学习并发现隐藏在数据中的规律。
适应性好:神经网络对于输入数据的变化和噪声具有一定的容忍度,能够适应不同类型的数据和问题。它可以处理多种数据类型,如图像、文本、声音等,并且在不同领域具有广泛的应用。
并行处理能力:神经网络中的神经元和层次之间可以进行并行计算,充分利用多核处理器和图形处理器等硬件设备的并行处理能力,提高计算效率和速度。
泛化能力强:经过训练的神经网络具有较强的泛化能力,即可以对未见过的数据进行准确预测和分类。它能够从训练数据中学习到一般规律,并将这些规律应用于新的数据。
缺点:
数据需求量大:神经网络通常需要大量的训练数据来达到较好的性能。对于某些领域和任务,获取大规模的标注数据可能是困难和昂贵的。
训练时间长:训练神经网络需要较长的时间,特别是在深层网络和大规模数据集的情况下。对于复杂的网络结构和大规模的数据,训练过程可能需要数小时甚至数天。
参数调节困难:神经网络中的参数数量较多,调节和优化这些参数需要一定的经验和技巧。不合适的参数选择可能导致网络性能下降或过拟合现象的发生。
解释性差:由于神经网络的复杂性和黑盒特性,它们往往难以提供可解释的结果。神经网络往往被视为一种黑盒模型,难以解释其决策过程和内部工作原理。
区别于基础机器学习算法,神经网络算法可以泛化到深度学习,因此可应用的领域有很多:
计算机视觉:神经网络在图像识别、目标检测、人脸识别、图像生成和图像分割等计算机视觉任务中被广泛应用。例如,卷积神经网络CNN在图像分类任务中取得了重大突破,如使用深度学习进行图像分类的应用。
自然语言处理:神经网络在文本分类、情感分析、机器翻译、语音识别和自然语言生成等自然语言处理任务中具有重要作用。递归神经网络RNN和变压器网络Transformer是常用的神经网络架构。
语音和音频处理:神经网络在语音识别、语音合成、音频分类和音乐生成等领域发挥着关键作用。循环神经网络RNN和卷积神经网络CNN在语音和音频处理中得到广泛应用。
强化学习:神经网络在强化学习中用于构建智能体Agent,使其能够通过与环境的交互学习最优策略。深度强化学习算法如深度Q网络DQN和策略梯度方法在游戏玩法、机器人控制和自动驾驶等领域取得了显著进展。
推荐系统:神经网络可用于构建个性化推荐系统,根据用户的历史行为和兴趣进行推荐。深度学习模型如卷积神经网络CNN和循环神经网络RNN在推荐系统中被广泛应用。
医疗和生物学:神经网络在医学图像分析、疾病诊断、药物研发和基因组学等医疗和生物学领域具有重要应用。深度学习模型被用于解析医学图像,如肿瘤检测和病变分析。
金融和投资:神经网络可应用于金融市场预测、风险管理、信用评估和交易策略优化等领域。例如,用于股票价格预测和高频交易的神经网络模型。
艺术和创作:神经网络在艺术和创意领域有创造性的应用。例如,生成对抗网络GAN可用于生成艺术作品、图像合成和风格转换等任务。
深度学习Deep Learning是一种基于神经网络的机器学习方法,强调多层次的网络结构。深度学习通过增加网络的深度(层数)来提高网络的表达能力,使其能够学习到更复杂的特征和模式。
深度学习利用多层神经网络进行特征提取和抽象表示,层与层之间的信息传递和计算通过前向传播进行。训练过程中,深度学习使用反向传播算法Backpropagation来计算梯度并调整网络中的权重,以最小化预测结果与目标结果之间的差异。
特别注意,深度学习是神经网络的一个重要分支,但并不是唯一的方法。还存在其他类型的神经网络,如卷积神经网络CNN用于图像处理,循环神经网络RNN用于序列数据处理等。因此,深度学习是神经网络的一种重要实现方式,具有更深的网络结构和更强的表达能力,可以更好地处理复杂的任务和数据。
import tensorflow as tf
import matplotlib.pyplot as plt
MNIST
数据集,由 60,000 张训练图像和 10,000 张测试图像以及表示图像中存在的数字的标签组成。每个图像由 28×28 个灰度像素表示,这里直接调用API即可。
mnist = tf.keras.datasets.mnist
(train_images, train_labels) , (test_images, test_labels) = mnist.load_data()
# 查看整体情况
print("train_images shape: ", train_images.shape)
print("train_labels shape: ", train_labels.shape)
print("test_images shape: ", test_images.shape)
print("test_labels shape: ", test_labels.shape)
# 展示前9个图像
fig = plt.figure(figsize=(10,10))
nrows=3
ncols=3
for i in range(9):
fig.add_subplot(nrows, ncols, i+1)
plt.imshow(train_images[i])
plt.title("Digit: {}".format(train_labels[i]))
plt.axis(False)
plt.show()
因为里面有数字,防止模型将数字当作数值处理,我们的目的是识别数字而非有大小之分的数值因此标记独一标签
# 归一化
train_images = train_images / 255
test_images = test_images / 255
print("First Label before conversion:")
print(train_labels[0])
# 转换成One-hot标签
train_labels = tf.keras.utils.to_categorical(train_labels)
test_labels = tf.keras.utils.to_categorical(test_labels)
print("First Label after conversion:")
print(train_labels[0])
先了解下概念:
展平层:我们的输入图像是 2D 数组。展平层通过逐行解堆叠将 2D 数组(28 x 28 像素)转换为 1D 数组(像素)。该层只是更改数据形状,不会学习任何参数/权重。28*28=784;隐藏层:我们唯一的隐藏层由一个完全连接的节点(或神经元)密集层组成,每个节点(或神经元)都有激活功能。512relu
;输出层:神经网络的输出层由一个具有 10 个输出神经元的密集层组成,每个神经元输出 10 个概率,每个概率为 0 – 9,表示图像是相应数字的概率。输出层被赋予激活函数,以将输入激活转换为概率。softmax
损失函数:这告诉我们的模型如何找到实际标签和模型预测的标签之间的误差。该指标衡量我们的模型在训练期间的准确性。我们希望模型最小化此函数值。我们将为我们的模型使用损失函数。categorical_crossentropy
;优化:这告诉我们的模型如何通过查看数据和损失函数值来更新模型的权重/参数。我们将为我们的模型使用优化器adam
;指标(可选):它包含用于监视训练和测试步骤的指标列表。我们将使用准确性或模型正确分类的图像数量。
### 设置图层
model = tf.keras.Sequential([
# 展平层
tf.keras.layers.Flatten(),
# 隐藏层
tf.keras.layers.Dense(units=512, activation='relu'),
# 输出层
tf.keras.layers.Dense(units=10, activation='softmax')
])
### 编译模型
model.compile(
loss = 'categorical_crossentropy',
optimizer = 'adam',
metrics = ['accuracy']
)
训练数据:在这种情况下,我们将使用由将馈送到神经网络的图像组成。train_images
;
训练标签:在这里,我们将使用由代表训练图像输出的标签组成。train_labels
;
Epochs:Epochs是我们的模型将迭代所有训练示例的次数。例如,如果我们指定 10 个 epoch,那么我们的模型将在所有 60,000 张训练图像上运行 10 次。
history = model.fit(
x = train_images,
y = train_labels,
epochs = 10
)
可以看到准确率还是特别高的
可视化损失性和准确性
# loss
plt.plot(history.history['loss'])
plt.xlabel('epochs')
plt.legend(['loss'])
plt.show()
# accuracy
plt.plot(history.history['accuracy'], color='orange')
plt.xlabel('epochs')
plt.legend(['accuracy'])
plt.show()
# 测试准确率
test_loss, test_accuracy = model.evaluate(
x = test_images,
y = test_labels
)
print("Test Loss: %.4f"%test_loss)
print("Test Accuracy: %.4f"%test_accuracy)
# 可修改索引
index=12
# 图像
plt.imshow(test_images[index])
# 准确性
print("Probabilities predicted for image at index", index)
print(predicted_probabilities[index])
print()
# 预测类别
print("Probabilities class for image at index", index)
print(predicted_classes[index])
通读看个两三遍顺利掌握神经网络入门,有同学会说这个不是挺简单的吗用肉眼也能看出,好像意义不大,神经网络最大的特点就是可以深!MINIST
这个手写数字图像数据集确实是简单,图像相对较为规整和清晰,数字通常位于图像中心且无明显的噪声。因此,即使是相对简单的网络结构,也可以在这个数据集上表现出很好的准确性。然而,对于更复杂、多样化和嘈杂的图像数据集,简单的网络结构可能无法捕捉到更细微的特征和模式,因此需要更复杂的神经网络模型来提高预测的准确性。
这个简单的神经网络仅包含一个隐藏层和一个输出层,对于更复杂的问题和数据集,通常需要更深层和更复杂的网络结构才能获得更准确的预测结果。
识别包含多个物体的复杂场景或区分具有相似外观的物体。在这种情况下,简单的神经网络可能无法有效地捕捉到图像中的复杂特征和模式。通过使用更深层和更复杂的神经网络,例如深度卷积神经网络(CNN),可以获得更好的性能。深度CNN通常包含多个卷积层和池化层,用于提取图像中的局部特征,并在更高层次上进行抽象和表示。这样的网络结构能够处理更复杂和多样化的图像数据集,并获得更准确的分类结果。