深度神经网络原理及其应用


图1为深度神经网络(DNN)的示意图。如图所示,该网络一共有三层,分别是输入层、隐藏层和输出层。其中,输入层为输入神经网络的数据,每个隐藏层由一定的神经元组成,输出层是神经网络最终的输出。


深度神经网络原理及其应用_java

图1 DNN网络示意图


对于神经网络的第k-1层和k层而言,k-1层的任意一个神经元,都和第k层所有节点相连,即第k层的每个神经元由第k-1层加权求和得到。设

深度神经网络原理及其应用_java_02

为DNN网络的第k-1层的输出矢量。
因此第k层神经网络上每一个神经元的输出为

深度神经网络原理及其应用_java_03

其中,Wkbk分别为第k层隐藏层的权重矩阵和偏置矢量,故第k层隐藏层的输出为深度神经网络原理及其应用_java_04
采用Tanh激活函数,其表达式为

深度神经网络原理及其应用_java_05


因此,整个神经网络的输出为输入的数据的非线性变换的级联,其数学表达式为

深度神经网络原理及其应用_java_06

其中,L表示神经网络的网络层数,θ表示学习网络中的所有参数。模型的参数是神经元的权重和偏置,这些参数通过随机初始化,然后通过训练学习不断更新。

实例

/ CASE


采用全连接层来搭建DenseNet。首先,原始的样本数据是28×28的灰度值图像。对其做数据的预处理,使其重整为784×1的0-1的实值向量。接着将其通过两个全连接层,输出维度分别为512,10。激活函数分别采用ReLu和Softmax。输出为10×1的概率值向量。

深度神经网络原理及其应用_java_07

图2  DenseNet网络结构


网络训练部分,batch size,epochs和学习率分别设置为128,10,0.0001。计算机配置:CPU intel i7-100875H,GPU RTX 2060。训练结果如下:


深度神经网络原理及其应用_java_08

图3 损失和准确率曲线


代码如下:

from tensorflow.keras.datasets import mnist

from tensorflow.keras import layers

from tensorflow.keras import models

from tensorflow.keras.utils import to_categorical

import matplotlib.pyplot as plt

# 数据处理

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = train_images.reshape((60000, 28 * 28))

train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))

test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)

test_labels = to_categorical(test_labels)

# 网络搭建

network = models.Sequential()

network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))

network.add(layers.Dense(10, activation='softmax'))

network.summary()

network.compile(optimizer='rmsprop',

loss='categorical_crossentropy',

metrics=['accuracy'])

# 结果图

history = network.fit(train_images, train_labels, epochs=10, batch_size=128)

test_loss, test_acc = network.evaluate(test_images, test_labels)

history_dict = history.history

loss_values = history_dict['loss']

accuracy = history_dict['accuracy']

epochs = range(1, len(loss_values) + 1)

plt.plot(epochs, loss_values, 'bo', label='Training loss')

plt.plot(epochs, accuracy, 'b', label='accuracy')

plt.title('Loss and Accuracy')

plt.xlabel('Epochs')

plt.ylabel('Loss/Accuracy')

plt.legend()

plt.show()

END

深度神经网络原理及其应用_java_09  


深度神经网络原理及其应用_java_10

  



扫描二维码

获取更多精彩

WCTL@CQU

深度神经网络原理及其应用_java_11