DNN(Deep-Learning Neural Network)
DNN(Deep-Learning Neural Network)
接下来介绍较为常见的全连接神经网络(fully connected neural network)
名词解释
首先介绍一下神经网络的基本架构,以一个神经元为例

输入是一个向量 ,权重(weights)也是一个 矩阵
把两个矩阵进行相乘,最后加上偏差(bias) ,即 w1 * x1 + w2 * x2 + b

在神经元内部会存在一个被称为**激活函数(activation)**的组件。例如,在[activation.md]中定义了sigmoid和ReLU等常用激活函数。接着将其计算结果视为该神经元所代表的函数模型的输入变量。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-y0shDSoS-1618453973490)(https://github.com/sherlcok314159/ML/blob/main/Images/neuron_3.png)]
人工神经网络依次包括三个层次:输入层、隐含层和输出层。其中属于基本的人工神经网络架构,在输出前还需经过 softmax 函数处理。至于输入与输出两层,则无需过多阐述。通常情况下,每个隐含层拥有大量神经元(neuron),而你可调节其数量作为模型参数。
何为 全连接(fully-connected) 呢?
每一个输入跟神经元必定两两相连

该系统采用了一种高效的新技术架构来实现数据处理功能
那么,肯定有人问了
Deep or not?
Universality Theorem
Each Multi-layered Neuron Network is capable of being substituted with a single-hidden-layer Neuron Network.
有人这样认为:可以用单一层数量替代多层结构。那么为什么要采用Deep技术呢?显得没有必要。
Why Deep?
确实一个很宽的隐含层可以代替很多层,但是效率必须纳入比较范围
当比较浅层与深层时,在应用控制变量法的情况下(即采用控制变量法进行比较),确保两组参数的数量相等是必要的;如果不这样做,则可能导致结果出现偏差。
举个例子,接下来我要通过图片来分辨长发男,短发男,长发女,短发女。
浅层做法:

当我们深入现实世界时,在现实中难以寻觅这样的"长发男"。这表明这类数据样本数量极少,在训练过程中效果欠佳。
我们都知道,在处理复杂的问题时,可以通过将问题分解为多个较小的问题来实现有效的解决方案。这一思维在算法设计中被广泛采用。在这里,请简要介绍一下模块化。
继续上面的例子,我们可以先分辨是男是女和是长发还是短发

该视频展示了...
这样的话,数据量都是够的,train出的结果不会很糟

该视频为本课程的重要组成部分之一,在课程的第十二讲中进行了深入介绍这一视频的核心概念以及相关技术原理的具体应用方法与思路分析过程。
此份学习材料旨在帮助观众更好地理解和掌握这些技术原理所对应的实现方案与优化策略的具体实现细节。
通过观看此视频的学习者能够更加深入地理解相关的知识点并在此过程中获取到一份较为全面的技术实现方案参考文档。
通过分阶段构建包含两层神经网络的体系结构,能够有效缓解数据量不足的问题。这样的训练结果相比单层神经网络提升了显著程度。
这也说明了当我们在面对数据不足的情况时,采用Deep Neuron Network实际上能够训练出相对更好的结果。
而且令人惊叹的是,在深度学习(DeepLearning)过程中能够通过模块化设计从训练数据中自动生成模块化架构(Modularization)。该系统能够将复杂问题划分为多个简单功能模块(Simple Function),每个模块各自独立完成特定任务。类似于编写代码时创建单个功能模块的过程,在需要调用时只需通过调用函数名称即可完成整个流程的操作。
Deep is necessary.
接下来,以手写数字识别(Mnist)为例代码实操一下
import matplotlib.pyplot as plt
import numpy as np
from tensorflow import keras
from tensorflow.keras import layers
import sys
import matplotlib as mpl
import tensorflow as tf
# 不同库版本,使用本代码需要查看
print(sys.version_info)
for module in mpl,np,tf,keras:
print(module.__name__,module.__version__)
'''
sys.version_info(major=3, minor=6, micro=9, releaselevel='final', serial=0)
matplotlib 3.3.4
numpy 1.16.0
tensorflow 1.14.0
tensorflow.python.keras.api._v1.keras 2.2.4-tf
'''
# If you get numpy futurewarning,then try numpy 1.16.0
# Load train and test
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
# Reshape to dense standard input
x_train = x_train.reshape(60000, 784)
x_test = x_test.reshape(10000, 784)
# Scale images to the [0, 1] range
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
# convert class vectors to binary class matrices
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
model = keras.Sequential(
[
keras.Input(shape=(28 * 28)),
layers.Dense(128, activation="relu"),
layers.Dense(128, activation="relu"),
layers.Dense(128, activation="relu"),
layers.Dense(10, activation="softmax"),
]
)
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.summary()
history = model.fit(x_train, y_train, batch_size=128, epochs=15, validation_split=0.2)
score = model.evaluate(x_test, y_test)
print("Test Loss:", score[0])
print("Test Accuracy", score[1])
# Test Loss: 0.11334700882434845
# Test Accuracy 0.9750999808311462
# 注意天下几乎没有两个相同的准确率,因为你是random出来的,在epoch之前会randomly initialize parameters
# visualize accuracy and loss
def plot_(history,label):
plt.plot(history.history[label])
plt.plot(history.history["val_" + label])
plt.title("model " + label)
plt.ylabel(label)
plt.xlabel("epoch")
plt.legend(["train","test"],loc = "upper left")
plt.show()
plot_(history,"acc")
plot_(history,"loss")
'''
@Tool : Tensorflow 2.x
Transform acc,val_acc above into accuracy,val_accuracy
'''


这里跟CNN 实际上形状处理上存在差异。\n其中,在CNN中为了表示通道数量必须增加一个维度;而在DNN中则无需这样做。\n观察到的数据总数为6万条(条目)。\n每个图像对应的像素数量应等于28乘以28得到784个像素值。\n在开始阶段即对原始数据进行重塑为(6万行×784列)的形状。\n这样做的目的是为了与后续处理一致
注意 :千万别把 28 * 28 写出 (28,28)!否则会报错
ValueError: Input 0 of layer sequential is incompatible with the layer: expected axis -1 of input shape to have value 28 but received input with shape (128, 784)
