0x00 卷积神经网络
卷积神经网络(CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(Deep Learning)的代表算法之一
卷积神经网络具有权值共享的特性,降低了模型的复杂程度,并且一定程度的减少了权值的数量,自动提取特征
神经网络(NN)包含:输入层、隐藏层、输出层
△ 图片来源:
https://www.intechopen.com/media/chapter/72399/media/F1.png
卷积神经网络将隐藏层分为卷基层与池化层,卷基层通过卷积核在原始图像上通过平移进行特征提取,每一个特征为一个特征映射;池化层通过汇聚特征后稀疏参数来减少要学习的参数,从来达到降低网络复杂度的目的
包含最大值池化(max pooling)和平均值池化(average pooling)
△ 图片来源:
https://www.researchgate.net/figure/Structure-of-the-convolutional-neural-network_fig3_323227084
卷积神经网络发展从神经认知机(Neocognitron)模型开始,1989年出现第一个卷积神经网络模型LeCun,1998年提出LeNet,在2012年出现AlexNet
LeNet后出现4个方向的演变,分别为VGG 16(网络加深)、NIN(增强卷基层的功能)、KCNN(从分类任务到检测功能)、FCN(增加新的功能模块)
△ 图片来源:
参考中国科学院计算技术研究所刘昕博士卷机神经网络结构演化的历史
网络加深
LeNet
△ 图片来源:
https://www.researchgate.net/figure/Architecture-of-CNN-by-LeCun-et-al-LeNet5_fig1_308788359
LeNet包含组件如下:
输入层:对图像做了预处理reshape操作,输入图像
卷积层:使原信号特征增强,并降低噪音
降采样层:降低网络训练参数及模型的过拟合程度,有两种方式:最大池化(max pooling)和平均值池化(mean pooling)
全连接层:计算输入向量和权重向量的点积,再加上一个偏置,随后传给sigmoid函数
输出层:10个类别,每个类别对应一个径向基函数单元
2. AlexNet
△ 图片来源:
https://bmk.sh/2019/12/31/The-Decade-of-Deep-Learning/
使用非线性激活函数ReLU,能够训练大量数据并可以防止过拟合
防止过拟合有两种方法:
数据增强:增加训练数据,提升算法的准确率
Dropout:使收敛所需的迭代次数增加一倍
增强卷基层的功能
NIN在每次卷积完之后使用,目的是为了在进入下一层的时候合并更多的特征参数。同样NIN层也是违背LeNet的设计原则,但却有效地合并卷积特征,减少网络参数、同样的内存可以存储更大的网络,能够提高CNN的局部感知区域
分类任务到检测任务
演化过程从R-CNN到Fast R-CNN,到最终的Faster R-CNN
增加新的功能模块
涉及到FCN、STNet、CNN与RNN/LSTM混合架构
0x01 循环神经网络
循环神经网络在网络中引入了定性循环,让信号从一个神经元传递到另一个神经元,隐藏层的输入不仅包含上一层的输出,还包括上一个时刻该隐藏层的输出
△ 图片来源:
https://pic1.zhimg.com/v2-d7def494c33b79be4826fcf50366fc98_b.jpg
0x02 TensorFlow运行
TensorFlow运行方式
加载数据及定义超参数
构建网络
训练模型
评估模型和进行预期
我们来看一个简单的神经网络的例子
加载数据及定义超参数
import tensorflow as tf
import numpy as np
#构造函数
x_data=np.linspace(-1,1,300)[:,np.newaxis]
noise=np.random.normal(0,0.05,x_data.shape)#噪声,使它与x_data的维度一直,并且拟合为均值为0、方差为0.05的正态分布
y_data=np.square(x_data)-0.5+moise#y=x^2-0.5+噪声
#定义占位符作为将要输入神经网络的变量
xs=tf.placeholder(tf.float32,[None,1])
ys=tf.placeholder(tf.float32,[None,1])
构建网络
#定义隐藏层和输出层
def add_layer(inputs,in_size,out_size,activation_function=None):
#构建权重
weights=tf.Variable(tf.random_normal([in_size,out_size])
#构建偏置
biases=tf.Variable(tf.zeros([1,out_size])+0.1)
#矩阵相乘
Wx_plus_b=tf.matmul(inputs,weights)+biases
if activation_function is None:
outputs=Wx_plus_b
else:
outputs=activation_function(Wx_plus_b)
return outputs
#构建隐藏层,假设隐藏层油20个神经元
h1=add_layer(xs,1,20,activation_function=tf.nn.relu)
#构建输出层,假设输出层和输入层一样,有1个神经元
prediction=add_layer(h1,20,1,activation_function=None)
#构建损失函数,计算输出层的预测值与真实值间的误差
loss=tf.reduce_mean(tf.reduce_sun(tf.square(ys-prediction),reduction_indices=[1]))
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)
训练模型
#初始化变量
init=tf.global_variables_initializer()
sess=tf.Session()
sess.run(init)
for i in range(1000):
sess.run(train_step), feed_dict={xs:x_data,ys:y_data})
if i%50==0;
print(sess.run(loss,feed_dict={xs;x_data,ys:y_data}))
0x03 MNIST手写数字识别
接下来看一个MNIST手写数字识别的例子
MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)
数据集由来自 250 个不同人手写的数字构成, 其中50%是高中学生, 50%来自人口普查局 (the Census Bureau) 的工作人员,数字已经做了预处理和格式化
其中包含:
训练集55000:用于训练模型的子集
验证集5000:使用测试集再次检查评估结果
测试集10000:用于测试模型的子集
测试集需要满足:
规模足够大,可产生具有统计意义的结果
能代表整个数据集,测试集的特征应该与训练集的特征相同
MNIST 数据集获取地址:
http://yann.lecun.com/exdb/mnist/
利用TensorFlow读取数据
import tensorflow as tf
import tensorflow.examples.tutorials.mnist.input_data as input_data
mnist=input_data.read_data_sets("MNIST_data/",one_hot=True)
print('训练集train数量:',mnist.train.num_examples,
'验证集validation数量:',mnist.validation.num_examples,
',测试集test数量:',mnist.test.num_examples)
四个文件分别为:
训练集图片文件
训练集标记文件
测试集图片文件
测试集标记文件
看其中一张图的数据
mnist.train.images[10]
数字可视化
import matplotlib.pyplot as plt
def plot_image(image):
plt.imshow(image.reshape(28,28),cmap='binary')
plt.show()
plot_image(mnist.train.images[10])
标签数据,我们知道10是‘0’,得到如下
mnist.train.labels[10]
继续往下学习之前,先了解一下什么是独热编码
独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候,其中只有一位有效
独热编码常用于表示拥有有限个可能值的字符串或标识符
将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点
机器学习算法中,特征之间距离的计算或相似度的常用计算方法都是基于欧式空间的
将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理
#定义输入数据占位符
x=tf.placeholder(tf.float32,[None,784],name="X")
y=tf.placeholder(tf.float32,[None,10],name="Y")
#定义变量
W=tf.Variable(tf.random_normal([784,10]),name="W")
b=tf.Variable(tf.zeros([10]),name="b")
norm=tf.random_normal([100])
with tf.Session() as sess:
norm_data=norm.eval()
print(norm_data[:10])
定义前向计算并进行Softmax分类
forward=tf.matmul(x,W)+b
pred=tf.nn.softmax(forward)
loss_function=tf.reduce_mean(tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
定义准确率
correct_prediction=tf.equal(tf.argmax(pred,1),tf.argmax(y,1))
accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
声明会话,初始化变量
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
超参数的设定
train_epochs = 50
batch_size = 50
total_batch = int(mnist.train.num_examples/batch_size)
display_step = 1
learning_rate = 0.01
优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
训练模型
for epoch in range(train_epochs):
for batch in range(total_batch):
xs,ys=mnist.train.next_batch(batch_size)
sess.run(optimizer,feed_dict={x:xs,y:ys})
loss,acc=sess.run([loss_function,accuracy],
feed_dict={x:mnist.validation.images,y:mnist.validation.labels})
if (epoch+1)%display_step==0:
print("Train Epoch:",'%02d'%(epoch+1),"Loss:","{:.9f}".format(loss),"Accuracy=","{:.4f}".format(acc))
print("finish")
随着Train Epoch的递增,Loss逐渐减小,准确率Accuracy逐渐增加
模型应用的可视化
若准确率可以接受则可使用此模型进行预测
prediction_result=sess.run(tf.argmax(pred,1),
feed_dict={x:mnist.test.images})
prediction_result[0:10]
import matplotlib.pyplot as plt
import numpy as np
def plot_images_labels_prediction(images,labels,prediction,index,num=10):
fig=plt.gcf()
fig.set_size_inches(10,12)
if num>25:
num=25
for i in range(0,num):
ax=plt.subplot(5,5,i+1)
ax.imshow(np.reshape(images[index],(28,28)),
cmap='binary')
title='label='+str(np.argmax(labels[index]))
if len(prediction)>0:
title+='.predict='+str(prediction[index])
ax.set_title(title,fontsize=10)
ax.set_xticks([])
ax.set_yticks([])
index+=1
plt.show()
plot_images_labels_prediction(mnist.test.images,mnist.test.labels,prediction_result,10,20)
0x04 人脸识别
△ 图片来源:
https://www.computerworld.com/article/3182269/its-time-to-face-the-ugly-reality-of-face-recognition.html
人脸图像采集检测
采集静态图像、动态图像、不同位置的图像及不同表情的图像等等,对检测的目标对象进行概率统计,得到带检测对象的一些特征,建立目标检测模型,然后用得到的对象匹配输入的对象
人脸识别预处理
通过对图像进行预处理筛选出各种特征,例如方图特征、颜色特征、结构特征等,需要进行缩放、旋转、拉伸、光线补偿规范化、几何校正等图像处理
人脸识别特征提取
将图像数字化,利用特征点的欧式距离、曲率和角度进行提取
人脸图像匹配与识别
把提取的特征提取的人脸图像的特征数据与数据库中存储的人脸特征模版进行匹配,根据相似程度对爽身粉信息进行判断
0x05 自然语言处理
△ 图片来源:
https://www.bold360.com/learn/what-is-natural-language-processing
首先是模型选择:
一对一:从固定大小的输入得到固定大小的输入,通常应用于图像分类
一对多:以序列输出,通常应用于图像和语言相结合
多对一:以序列输入,通常应用于情感分析
多对多:异步的序列输入和序列输出应用于机器翻译,同步的序列输入和序列输出应用于食品分类
智能聊天机器人的发展经历的三种不同技术:
基于特征工程:有大量的逻辑判断
基于检索库:给定已有的问题和聊天,从检索中找到相匹配的答案
基于深度学习:通过大量训练生成相应的输出
参考书籍及文章:
《TensorFlow技术解析与实战》
https://blog.csdn.net/p_lart/article/details/83821743
https://www.cnblogs.com/zongfa/p/9305657.html
https://blog.csdn.net/iqdutao/article/details/107464739
https://michaelbeechan.blog.csdn.net/article/details/89737573?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-2.control
E
N
D
关
于
我
们
Tide安全团队正式成立于2019年1月,是新潮信息旗下以互联网攻防技术研究为目标的安全团队,团队致力于分享高质量原创文章、开源安全工具、交流安全技术,研究方向覆盖网络攻防、系统安全、Web安全、移动终端、安全开发、物联网/工控安全/AI安全等多个领域。
团队作为“省级等保关键技术实验室”先后与哈工大、齐鲁银行、聊城大学、交通学院等多个高校名企建立联合技术实验室,近三年来在网络安全技术方面开展研发项目60余项,获得各类自主知识产权30余项,省市级科技项目立项20余项,研究成果应用于产品核心技术研究、国家重点科技项目攻关、专业安全服务等。对安全感兴趣的小伙伴可以加入或关注我们。