1.1 四层全连接网络如下:
网络参数量的计算:
输入为n个节点,输出为m个节点。每个连接具有一个权重w(n*m个权重),且要加上一个常量b(m个)。因此一层的总参数量为n*m+m。
构建模型程序如下:
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers,Sequential,losses,optimizers,datasets
#......# 此处插入内存按需分配代码
# 创建 4 层全连接网络
model = keras.Sequential([
layers.Dense(256, activation='relu'),
layers.Dense(256, activation='relu'),
layers.Dense(256, activation='relu'),
layers.Dense(10),
])
# build 模型,并打印模型信息
model.build(input_shape=(4, 784))
model.summary()
将TensorFlow 的显存使用方式设置为按需分配 :
该部分代码需要插入上述代码的建模前面!!!
# 将TensorFlow 的显存使用方式设置为按需分配
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
try:
# 设置 GPU 显存占用为按需分配
for gpu in gpus:
tf.config.experimental.set_memory_growth(gpu, True)
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPUs")
except RuntimeError as e:
# 异常处理
print(e)
运行结果如下:
1.2 局部相关性
全连接示意图如下:
这种全连接方式无疑增大了就算计内存的使用,深度学习无法向更深层次进行下去。
局部连接方式:
原理就是仅对一定欧氏距离范围内的节点进行连接。如下式:
1.3 权值共享
如下图所示,在计算左上角位置的输出像素时,使用下式权值参数与对应感受野内部的像素相乘累加,作为左上角像素的输出值。在计算右下方感受野区域时,共享权值参数 W,即使用相同的权值参数 W 相乘累加,得到右下角像素的输出值,此时网络层的参数量只有 3*3=9 个,且与输入、输出节点数无关。
上述这种局部连接、权值共享的网络其实就是卷积神经网络。
数学角度分析卷积神经网络:
1.4 卷积
基于2D图片函数f(m,n)和2D卷积核g(m,n)卷积运算如下式:
2D离散卷积运算可以用下面几幅图形象的描述:
[f*g](-1,-1)=2*5+3*-1+5*0+0*-1=7,将卷积核函数图向左和向上平移一格如下图所示:
最终结果如下图所示:
至此成功完成一个图片与卷积核的卷积运算,得到一个新的图片。 在深度学习中,权值函数g(m,n)称为卷积核(Kernel)。正是基于卷积运算,卷积神经网络才能如此得名。
1.5 卷积神经网络
单通道输入,单卷积核:
对应元素相乘再相加放入对应位置,这里要注意起始红色框位置的移动,作为特征值得输入位置。卷积核矩阵的移动不超过图片有效像素矩阵的边界边界。
最终结果如下所示:
结论:卷积运算的输出矩阵大小由卷积核的大小 k,输入 X 的高宽 h/w,移动步长s,是否填充等因素决定。