版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Web安全之深度学习实战目录\h第1章打造深度学习工具箱\h1.1TensorFlow\h1.1.1安装\h1.1.2使用举例\h1.2TFLearn\h1.3PaddlePaddle\h1.3.1安装\h1.3.2使用举例\h1.4Karas\h1.5本章小结\h第2章卷积神经网络\h2.1传统的图像分类算法\h2.2基于CNN的图像分类算法\h2.2.1局部连接\h2.2.2参数共享\h2.2.3池化\h2.2.4典型的CNN结构及实现\h2.2.5AlexNet的结构及实现\h2.2.6VGG的结构及实现\h2.3基于CNN的文本处理\h2.3.1典型的CNN结构\h2.3.2典型的CNN代码实现\h2.4本章小结\h第3章循环神经网络\h3.1循环神经算法概述\h3.2单向循环神经网络结构与实现\h3.3双向循环神经网络结构与实现\h3.4循环神经网络在序列分类的应用\h3.5循环神经网络在序列生成的应用\h3.6循环神经网络在序列标记的应用\h3.7循环神经网络在序列翻译的应用\h3.8本章小结\h第4章基于OpenSOC的机器学习框架\h4.1OpenSOC框架\h4.2数据源系统\h4.3数据收集层\h4.4消息系统层\h4.5实时处理层\h4.6存储层\h4.6.1HDFS\h4.6.2HBase\h4.6.3Elasticsearch\h4.7分析处理层\h4.8计算系统\h4.9实战演练\h4.10本章小结\h第5章验证码识别\h5.1数据集\h5.2特征提取\h5.3模型训练与验证\h5.3.1K近邻算法\h5.3.2支持向量机算法\h5.3.3深度学习算法之MLP\h5.3.4深度学习算法之CNN\h5.4本章小结\h第6章垃圾邮件识别\h6.1数据集\h6.2特征提取\h6.2.1词袋模型\h6.2.2TF-IDF模型\h6.2.3词汇表模型\h6.3模型训练与验证\h6.3.1朴素贝叶斯算法\h6.3.2支持向量机算法\h6.3.3深度学习算法之MLP\h6.3.4深度学习算法之CNN\h6.3.5深度学习算法之RNN\h6.4本章小结\h第7章负面评论识别\h7.1数据集\h7.2特征提取\h7.2.1词袋和TF-IDF模型\h7.2.2词汇表模型\h7.2.3Word2Vec模型和Doc2Vec模型\h7.3模型训练与验证\h7.3.1朴素贝叶斯算法\h7.3.2支持向量机算法\h7.3.3深度学习算法之MLP\h7.3.4深度学习算法之CNN\h7.4本章小结\h第8章骚扰短信识别\h8.1数据集\h8.2特征提取\h8.2.1词袋和TF-IDF模型\h8.2.2词汇表模型\h8.2.3Word2Vec模型和Doc2Vec模型\h8.3模型训练与验证\h8.3.1朴素贝叶斯算法\h8.3.2支持向量机算法\h8.3.3XGBoost算法\h8.3.4深度学习算法之MLP\h8.4本章小结\h第9章Linux后门检测\h9.1数据集\h9.2特征提取\h9.3模型训练与验证\h9.3.1朴素贝叶斯算法\h9.3.2XGBoost算法\h9.3.3深度学习算法之多层感知机\h9.4本章小结\h第10章用户行为分析与恶意行为检测\h10.1数据集\h10.2特征提取\h10.2.1词袋和TF-IDF模型\h10.2.2词袋和N-Gram模型\h10.2.3词汇表模型\h10.3模型训练与验证\h10.3.1朴素贝叶斯算法\h10.3.2XGBoost算法\h10.3.3隐式马尔可夫算法\h10.3.4深度学习算法之MLP\h10.4本章小结\h第11章WebShell检测\h11.1数据集\h11.1.1WordPress\h11.1.2PHPCMS\h11.1.3phpMyAdmin\h11.1.4Smarty\h11.1.5Yii\h11.2特征提取\h11.2.1词袋和TF-IDF模型\h11.2.2opcode和N-Gram模型\h11.2.3opcode调用序列模型\h11.3模型训练与验证\h11.3.1朴素贝叶斯算法\h11.3.2深度学习算法之MLP\h11.3.3深度学习算法之CNN\h11.4本章小结\h第12章智能扫描器\h12.1自动生成XSS攻击载荷\h12.1.1数据集\h12.1.2特征提取\h12.1.3模型训练与验证\h12.2自动识别登录界面\h12.2.1数据集\h12.2.2特征提取\h12.2.3模型训练与验证\h12.3本章小结\h第13章DGA域名识别\h13.1数据集\h13.2特征提取\h13.2.1N-Gram模型\h13.2.2统计特征模型\h13.2.3字符序列模型\h13.3模型训练与验证\h13.3.1朴素贝叶斯算法\h13.3.2XGBoost算法\h13.3.3深度学习算法之多层感知机\h13.3.4深度学习算法之RNN\h13.4本章小结\h第14章恶意程序分类识别\h14.1数据集\h14.2特征提取\h14.3模型训练与验证\h14.3.1支持向量机算法\h14.3.2XGBoost算法\h14.3.3深度学习算法之多层感知机\h14.4本章小结\h第15章反信用卡欺诈\h15.1数据集\h15.2特征提取\h15.2.1标准化\h15.2.2标准化和降采样\h15.2.3标准化和过采样\h15.3模型训练与验证\h15.3.1朴素贝叶斯算法\h15.3.2XGBoost算法\h15.3.3深度学习算法之多层感知机\h15.4本章小结第1章打造深度学习工具箱在本系列图书的第一本《Web安全之机器学习入门》中,我们以常见安全问题为背景介绍了常见的机器学习算法,主要以KNN、SVM、朴素贝叶斯等浅层学习算法为主。以Scikit-Learn为代表的机器学习开发库帮助我们可以很便捷地在单机环境下验证我们的想法。近几年深度学习发展迅速,以TensorFlow为代表的一批优秀的深度学习开发库大大降低了大家学习使用深度学习技术的门槛。作为本书的第1章,本章将帮助大家打造自己的深度学习工具箱,并结合实际例子介绍TensorFlow、TFLearn、PaddlePaddle以及Karas的使用方法。本章代码请参考本书配套GitHub中的tools.py。1.1TensorFlowTensorFlow是谷歌的第二代人工智能学习系统,其名称来源于本身的运行原理。Tensor意味着N维数组,Flow意味着基于数据流图的计算,TensorFlow为Tensor从流图的一端流动到另一端计算过程。所以也可以把TensorFlow当做将复杂的数据结构传输至人工智能神经网中进行分析和处理的系统。TensorFlow可用于语音识别或图像识别等多项机器深度学习领域,是对2011年开发的深度学习基础架构DistBelief进行了各方面的改进,它可在小到一部智能手机、大到数千台数据中心服务器的各种设备上运行。1.1.1安装TensorFlow支持非常丰富的安装方式\h[1]。1.Ubuntu/Linux。#仅使用CPU的版本
$pipinstall/tensorflow/linux/cpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl
#开启GPU支持的版本(安装该版本的前提是已经安装了CUDAsdk)
$pipinstall/tensorflow/linux/gpu/tensorflow-0.5.0-cp27-none-linux_x86_64.whl2.MacOSX。在MacOSX系统上,我们推荐先安装homebrew,然后执行brewinstallpython,以便能够使用homebrew中的Python安装TensorFlow:#当前版本只支持CPU
$pipinstall/tensorflow/mac/tensorflow-0.5.0-py2-none-any.whl3.基于Docker的安装。$dockerrun-itb.gcr.io/tensorflow/tensorflow该命令将启动一个已经安装好TensorFlow及相关依赖的容器:4.基于VirtualEnv的安装。官方文档推荐使用VirtualEnv创建一个隔离的容器来安装TensorFlow,这是可选的,但是这样做能使排查安装问题变得更容易。VirtualEnv通过创建独立Python开发环境的工具,来解决依赖、版本以及间接权限问题。比如,一个项目依赖Django1.3,而当前全局开发环境为Django1.7,版本跨度过大,导致的不兼容使项目无法正常运行,使用VirtualEnv可以解决这些问题\h[2]。首先,安装所有必备工具:#在Linux上:
$sudoapt-getinstallpython-pippython-devpython-virtualenv
#在Mac上:
#如果还没有安装pip
$sudoeasy_installpip
$sudopipinstall--upgradevirtualenv接下来,建立一个全新的VirtualEnv环境。为了将环境建在~/tensorflow目录下,执行如下代码:$virtualenv--system-site-packages~/tensorflow
$cd~/tensorflow然后,激活VirtualEnv:$sourcebin/activate
#如果使用bash$sourcebin/activate.csh
#如果使用csh(tensorflow)$
#终端提示符应该发生变化在VirtualEnv内,安装TensorFlow:(tensorflow)$pipinstall--upgrade<$url_to_binary.whl>接下来,使用类似命令运行TensorFlow程序:(tensorflow)$cdtensorflow/models/image/mnist
(tensorflow)$pythonconvolutional.py
#当使用完TensorFlow
(tensorflow)$deactivate\h[1]/tfdoc/get_started/os_setup.html\h[2]/p/08c657bd34f11.1.2使用举例TensorFlow的API使用起来比较繁琐,通常直接使用针对其API的高层封装TFLearn即可,具体实现请参考下节TFLearn的使用举例。1.2TFLearnTFLearn是一个模块化和透明的深度学习库,构建在TensorFlow之上,它为TensorFlow提供高层次API,目的是快速搭建试验环境,同时保持对TensorFlow的完全透明和兼容性。TFLearn具有以下特点\h[1]:·容易使用和易于理解的高层次API用于实现深度神经网络,附带教程和例子。·通过高度模块化的内置神经网络层、正则化器、优化器等进行快速原型设计。·强大的辅助函数,训练任意TensorFlow图,支持多输入、多输出和优化器。·简单而美观的图可视化,具有关于权值、梯度、特征图等细节。·无需人工干预,可使用多CPU、多GPU。本书的主要代码都是基于TFLearn开发的。1.安装。TFLearn的安装推荐使用使用pip工具:pipinstalltflearn如果需要使用源码安装,可以直接从GitHub上下载对应源码:/tflearn然后进入TFLearn目录安装即可:pythonsetup.pyinstall2.使用举例。TFLearn自带MNIST数据,使用函数mnist.load_data接口,并且可以通过指定one_hot=True直接获取使用独热编码的标签:X,Y,testX,testY=mnist.load_data(one_hot=True)构造一个隐藏层为2层,每层核数分别为64、64,输出层核数为10的多层感知机,使用fully_connected函数即可完成构造全连接网络的工作,使用tflearn.input_data定义输入数据大小。为了避免过拟合,每层之间使用Dropout函数进行部分丢失处理:#Buildingdeepneuralnetwork
input_layer=tflearn.input_data(shape=[None,784])
dense1=tflearn.fully_connected(input_layer,64,activation='tanh',
regularizer='L2',weight_decay=0.001)
dropout1=tflearn.dropout(dense1,0.8)
dense2=tflearn.fully_connected(dropout1,64,activation='tanh',
regularizer='L2',weight_decay=0.001)
dropout2=tflearn.dropout(dense2,0.8)
softmax=tflearn.fully_connected(dropout2,10,activation='softmax')使用多层感知机进行训练,通过n_epoch设置训练的轮数:#Training
model=tflearn.DNN(net,tensorboard_verbose=0)
model.fit(X,Y,n_epoch=20,validation_set=(testX,testY),
show_metric=True,run_id="dense_model")经过20轮的训练后,准确率达到了99.54%:TrainingStep:17200|totalloss:0.43454|time:5.444s
|SGD|epoch:020|loss:0.43454-top3:0.9685|val_loss:0.10618-val_acc:0.9954--iter:55000/55000\h[1]/p/253220661.3PaddlePaddlePaddlePaddle是百度开源的深度学习库,2016年9月27日,百度宣布其全新的深度学习开源平台PaddlePaddle在开源社区GitHub及百度大脑平台开放,供广大开发者下载使用。百度成为继Google、Facebook、IBM后另一个将人工智能技术开源的科技巨头,同时也是国内首个开源深度学习平台的科技公司。PaddlePaddle的前身是百度于2013年自主研发的深度学习平台Paddle(ParallelDistributedDeepLearning,并行分布式深度学习),且一直为百度内部工程师研发使用。全球各大科技巨头开源的深度学习平台都极具各自的技术特点。百度由于其自身在搜索、图像识别、语音语义识别理解、情感分析、机器翻译、用户画像推荐等多领域都有业务应用,PaddlePaddle则表现得更加全面,是一个相对全功能的深度学习框架。目前,PaddlePaddle已实现CPU/GPU单机和分布式模式,同时支持海量数据训练、数百台机器并行运算,以应对大规模的数据训练。此外,PaddlePaddle具备高质量GPU代码,提供了机器翻译、推荐、图像分类、情感分析等功能。目前,PaddlePaddle已在百度30多项主要产品和服务之中发挥着作用,如外卖的预估出餐时间、预判网盘故障时间点、精准推荐用户所需信息、海量图像识别分类、字符识别、病毒和垃圾信息检测、机器翻译和自动驾驶等领域。以外卖行业为例,外卖员等待商家出餐的时间耗时严重,百度将不同时段商家的客流量、菜品的制作时间和订单量等数据交给了PaddlePaddle,经过对海量数据的深度学习处理,如今,百度外卖的内部系统可以预估每个商家菜品出餐时间,及时告知外卖员,提高了送餐效率,系统也可以更加合理地规划取餐和送餐的路线\h[1]。\h[1]/i/2016-09-27/doc-ifxwevmc5593979.shtml1.3.1安装PaddlePaddle提供数个预编译的二进制文件来进行安装,包括Docker镜像和Ubuntu的deb安装包等。1.基于Docker容器使用方式PaddlePaddle的编译环境打包成了一个镜像,称为开发镜像,里面涵盖了PaddlePaddle需要的所有编译工具。编译出来的PaddlePaddle也打包成一个镜像,称为生产镜像,里面涵盖了运行所需的所有环境。每次发布新版本的时候都会发布对应版本的生产镜像以及开发镜像。运行镜像包括纯CPU版本和GPU版本及其对应的非AVX版本\h[1]。交互方式运行开发镜像:dockerrun-it--rmpaddlepaddle/paddle:<version>-dev/bin/bash后台进程方式运行容器:dockerrun-d-p2202:22-p8888:8888paddledev/paddle:<version>-dev然后用密码rootSSH进入容器:ssh-p2202root@localhost2.Ubuntu部署PaddlePaddle安装包的下载地址是:/PaddlePaddle/Paddle/releases它包含4个版本:·CPU版本:支持主流X86处理器平台,使用了AVX指令集。·CPU-NOAVX版本:支持主流X86处理器平台,没有使用AVX指令集。·GPU版本:支持主流X86处理器平台,支持NVIDIACUDA平台,使用了AVX指令集。·GPU-NOAVX版本:支持主流X86处理器平台,支持NVIDIACUDA平台,没有使用AVX指令集。下载完相关安装包后,执行如下命令:sudoapt-getinstallgdebigdebipaddle-*-cpu.deb或者如下命令:dpkg-ipaddle-*-cpu.debapt-getinstall-f在用dpkg-i的时候如果报一些依赖未找到的错误是正常的,在apt-getinstall-f里会继续安装PaddlePaddle。安装完成后,可以使用命令paddleversion查看安装后的Paddle版本\h[2]:PaddlePaddle0.8.0b1,compiledwith
with_avx:ON
with_gpu:OFF
with_double:OFF
with_python:ON
with_rdma:OFF
with_timer:OFF
with_predict_sdk:\h[1]/doc_cn/getstarted/build_and_install/docker_install_cn.html\h[2]/doc_cn/getstarted/build_and_install/ubuntu_install_cn.html1.3.2使用举例以识别MNIST数据集为例,关于MNIST数据集的详细介绍请参考本书第5章。下面代码实现了一个含有两个隐藏层的多层感知器,其中两个隐藏层的激活函数均采用ReLU,输出层的激活函数用Softmax:defmultilayer_perceptron(img):
hidden1=paddle.layer.fc(input=img,size=128,
act=paddle.activation.Relu())
hidden2=paddle.layer.fc(input=hidden1,size=64,
act=paddle.activation.Relu())
predict=paddle.layer.fc(input=hidden2,
size=10,act=paddle.activation.Softmax())
returnpredict通过layer.data调用来获取数据,然后调用分类器得到分类结果。训练时,对该结果计算其损失函数,分类问题常常选择交叉熵损失函数:paddle.init(use_gpu=False,trainer_count=1)
images=paddle.layer.data(name='pixel',type=paddle.data_type.dense_vector(784))
label=paddle.layer.data(name='label',type=paddle.data_eger_value(10))
predict=multilayer_perceptron(images)#多层感知器
cost=paddle.layer.classification_cost(input=predict,label=label)训练过程是完全自动的,event_handler里打印的日志如下所示,最后准确率为97.66%:#Pass0,Batch0,Cost2.780790,{'classification_error_evaluator':0.9453125}#Pass0,Batch100,Cost0.635356,{'classification_error_evaluator':0.2109375}#Pass0,Batch200,Cost0.326094,{'classification_error_evaluator':0.1328125}#Pass0,Batch300,Cost0.361920,{'classification_error_evaluator':0.1015625}#Pass0,Batch400,Cost0.410101,{'classification_error_evaluator':0.125}#TestwithPass0,Cost0.326659,{'classification_error_evaluator':0.09470000118017197}1.4KarasKeras是一个高级别的Python神经网络框架,能在TensorFlow或者Theano上运行。Keras的作者、谷歌AI研究员FrancoisChollet宣布了一条激动人心的消息,Keras将会成为第一个被添加到TensorFlow核心中的高级别框架,这将会使Keras变成Tensorflow的默认API。Keras的特点是:·可以快速简单地设计出原型。·同时支持卷积网络和循环网络,以及两者的组合。·支持任意的连接方案(包括多输入和多输出)。Keras的在线文档内容非常丰富,地址为:https://keras.io/1.安装Keras的安装非常简便,使用pip工具即可:pipinstallkeras如果需要使用源码安装,可以直接从GitHub上下载对应源码:/fchollet/keras然后进入Keras目录安装即可:pythonsetup.pyinstall2.使用举例以识别MNIST数据集为例,关于MNIST数据集的详细介绍请参考本书第5章。本章主要是给大家概要介绍如何使用Keras。Keras自带了MNIST数据集,使用mnist.load_data()加载即可:#thedata,shuffledandsplitbetweentrainandtestsets
(x_train,y_train),(x_test,y_test)=mnist.load_data()MNIST中的图片大小为28×28的矩阵,为了处理方便,把28×28的矩阵转换成长度为784的向量:x_train=x_train.reshape(60000,784)
x_test=x_test.reshape(10000,784)
x_train=x_train.astype('float32')
x_test=x_test.astype('float32')
x_train/=255
x_test/=255图片识别的结果是0~9这10个数字。通常神经网络算法在处理时,习惯将输出以独热编码的形式展现,即所谓One-Hot编码,又称“一位有效编码”。其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。比如以二分类问题为例,结果为真表示为1,反之为0;使用独热编码,结果为真表示为10,反之为01。在Karas中可以使用keras.utils.to_categorical很方便地进行转换:#convertclassvectorstobinaryclassmatrices
y_train=keras.utils.to_categorical(y_train,num_classes)
y_test=keras.utils.to_categorical(y_test,num_classes)下面是整个环节的重点,构造一个隐藏层为2层,每层节点数分别为512、512,输出层节点数为10的多层感知机,使用Dense函数即可完成构造全连接网络的工作,其中第一层需要定义输入数据的形状,具体定义方式在input_shape属性指定。为了避免过拟合,每层之间使用Dropout函数进行部分丢失处理,适度的丢失数据不会影响分类识别效果,就好比识别一张照片时适度遮住一部分,不会影响分类识别结果:model=Sequential()
model.add(Dense(512,activation='relu',input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(512,activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(10,activation='softmax'))完成多层感知机的结构定义后,就可以使用compile函数“编译”整个网络,让其工作:model.summary()
pile(loss='categorical_crossentropy',
optimizer=RMSprop(),
metrics=['accuracy'])整个训练过程需要定义训练数据集和测试数据集,同时定义训练的轮数,通常认为训练轮数为5~20比较合适,轮数太少训练不充分,轮数太多则训练时间过长:history=model.fit(x_train,y_train,
batch_size=batch_size,
epochs=epochs,
verbose=1,
validation_data=(x_test,y_test))最后评估整个训练的效果,经过20轮训练,准确率为98.12%:score=model.evaluate(x_test,y_test,verbose=0)
print('Testloss:',score[0])
print('Testaccuracy:',score[1])输出结果为:Epoch20/20
60000/60000[==============================]-11s-loss:0.0201-acc:0.9950-val_loss:0.1224-val_acc:0.9812
('Testloss:',0.12236141463853964)
('Testaccuracy:',0.98119999999999996)1.5本章小结本章介绍了如何打造自己的深度学习工具箱,介绍了TensorFlow、TFLearn、Paddle-Paddle以及Karas的安装方法,并结合常见的MNIST数据集介绍了以上工具箱的使用方式,各种工具箱识别准确率不同,这不代表工具本身的优劣。这里只是给大家一个基本的演示,初次接触这些代码可能会非常茫然,相信通过后面章节的介绍,大家最后会熟练掌握这些代码。第2章卷积神经网络深度学习模型中的卷积神经网络(ConvolutionNeuralNetwork,CNN)近年来在图像领域取得了惊人的成绩,CNN直接利用图像像素信息作为输入,最大程度保留了输入图像的所有信息,通过卷积操作进行特征的提取和高层抽象,模型输出直接是图像识别的结果。这种基于“输入-输出”直接端到端的学习方法取得了非常好的效果,得到了广泛的应用。本章重点介绍CNN的基本原理、常见的CNN结构以及代码实现,还介绍了基于CNN的文本分类处理。本章涉及的代码请参考本书GitHub的cnn.py文件。2.1传统的图像分类算法图像分类是根据图像的原始信息将不同类别图像区分开来,是计算机视觉中重要的基本问题,也是图像检测、图像分割、物体跟踪、行为分析等其他高层视觉任务的基础。图像分类在很多领域有广泛应用,包括安防领域的人脸识别和智能视频分析,交通领域的交通场景识别,互联网领域基于内容的图像检索和相册自动归类,医学领域的图像识别等\h[1],如图2-1所示。在CNN出现之前,图像分类算法依赖于复杂的特征工程。常用的特征提取方法包括SIFT(Scale-InvariantFeatureTransform,尺度不变特征转换)、HOG(HistogramofOrientedGradient,方向梯度直方图)、LBP(LocalBianrayPattern,局部二值模式)等,常用的分类算法为SVM。图2-1图像分类识别花的不同品种\h[1]/.html2.2基于CNN的图像分类算法人们尝试直接把原始图像作为输入,通过深度学习算法直接进行图像分类,从而绕过复杂的特征工程。下面介绍几个重要技术点。2.2.1局部连接常见的深度学习算法都是全连接形式,所谓全连接,就是第n-1层的任意一个节点,都和第n层所有节点有连接,如图2-2所示。图2-2隐藏层内部全连接形式同时,临近输入层的隐藏层的任意节点与输入层的全部节点都有连接,如图2-3所示。图2-3输入层与隐藏层全连接形式以一个大小为1000×1000的灰度图像为例,输入层节点数量为1000×1000=1000000,隐藏层节点数量也为1000×1000=1000000,仅输入层与隐藏层的连接就需要1000000×1000000=1012,几乎是个天文数字,如此巨大的计算量阻碍了深度学习在图像分类方向的应用。事情的转机来自于生物学的一个发现。人们在研究猫的视觉神经细胞时发现,一个视觉神经元只负责处理视觉图像的一小块,这一小块称为感受野(ReceptiveField),类比在图像分类领域,识别一个图像是何种物体时,一个点与距离近的点之间的关联非常紧密,但是和距离远的点之间关系就不大了,甚至足够远的时候就可以忽略不计\h[1],如图2-4所示。图2-4全连接与局部连接具体到深度学习算法上,隐藏层与输入层之间,隐藏层的一个节点只处理一部分输入层结点的数据,形成局部连接。还是接上面的例子,假设每个隐藏层的节点只处理10×10大小的数据,也就是说每个隐藏层的节点只与输入层的100个节点连接,这样在隐藏层节点数量和输入层节点数量不变的情况下,输入层与隐藏层的连接需要1000000×100=108,是全连接的万分之一。虽然计算量下降不少,但是依然十分巨大。局部连接不会减少隐藏层的节点数量,减少的是隐藏层和输入层之间的连接数。\h[1]/stdcoutzyx/article/details/415966632.2.2参数共享本质上隐藏层的一个节点与输入层一个节点的连接,对应的就是一个连接参数,大量的连接也就意味着大量的参数需要计算,仅依靠局部连接技术是无法进一步减少计算量的,于是人们又提出了参数共享方法。所谓的参数共享是基于这样一个假设:一部分图像的统计特性与完整图像的特性相同。回到上面的例子,每个隐藏层的节点只与输入层的100个节点连接,这样每个隐藏层节点就具有100个参数,全部隐藏层就具有1000000×100=108个参数,使用参数共享后,每个隐藏层的节点都具有完全相同的参数,全部隐藏层就只有100个参数需要计算了,这大大减少了计算量,而且即使处理更大的图像,只要单一隐藏层节点与输入层连接的个数不变,全部隐藏层的参数个数也不变。这种共享参数的机制,可以理解为针对图像的卷积操作。假设如图2-5所示,具有一个4×4大小的图像和一个2×2大小的卷积核。图2-5原始图像与卷积核大小为2×2的卷积核对原始图像第1个2×2的图像块进行卷积操作,得到卷积结果为2,如图2-6所示。图2-6卷积核对原始图像第1个2×2的块进行处理大小为2×2的卷积核对原始图像第2个2×2的图像块进行卷积操作,得到卷积结果为1,如图2-7所示。图2-7卷积核对原始图像第2个2×2的块进行处理如果大小为2×2的卷积核依次对原始图像进行卷积操作,移动的步长为2,最终获得一个2×2的新图像,如图2-8所示。图2-8卷积核对原始图像处理后的结果可见卷积处理后图像的大小与卷积核的大小无关,仅与步长有关,对应的隐藏层的节点个数也仅与步长有关。另外需要说明的是,卷积核处理图像边际时会出现数据缺失,这时候需要将图像补全,常见的补全方式有两种,same模式和valid模式,same模式会使用0数据补全,而且保持生成图像与原始图像大小一致。如果使用same模式,大小为2×2的卷积核依次对原始图像进行卷积操作,移动的步长为1,最终获得一个4×4的新图像,如图2-9所示。这里需要再次强调,当步长为1时,无论卷积核大小如何,处理前后图像大小不变;只有当步长大于1时,处理后的图像才会变小。图2-9卷积核使用same模式对原始图像处理后的结果2.2.3池化通过局部连接和参数共享后,我们针对1000×1000的图像,使用卷积核大小为10×10,卷积步长为1,处理后得到的隐藏层节点个数为1000×1000=106,计算量还是太大。为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像具有一种“静态性”的属性,这也就意味着在一个图像区域有用的特征极有可能在另一个区域同样适用。因此,为了描述大的图像,一个很自然的想法就是对不同位置的特征进行聚合统计,例如,人们可以计算图像一个区域上的某个特定特征的平均值(或最大值)。这种聚合的操作就叫做池化。常见的池化大小为2×2、3×3等,假设隐藏层节点个数为4×4,使用2×2大小池化,取最大值,过程如图2-10所示。图2-10池化处理隐藏层节点个数为1000×1000的神经网络,经过2×2池化后,得到的隐藏层节点个数为500×500=25×104。2.2.4典型的CNN结构及实现典型的CNN包含卷积层、全连接层等组件,并采用softmax多类别分类器和多类交叉熵损失函数,一个典型的卷积神经网络如图2-11所示。我们先介绍用来构造CNN的常见组件。图2-11典型的CNN结构·卷积层,执行卷积操作提取底层到高层的特征,发掘图片局部关联性质和空间不变性质。·池化层,通过抽取卷积输出特征图中局部区块的最大值或者均值,执行降采样操作。降采样也是图像处理中常见的一种操作,可以过滤掉一些不重要的高频信息。·全连接层,输入层到隐藏层的神经元是全部连接的。·非线性变化,卷积层、全连接层后面一般都会接非线性变化层,例如Sigmoid、Tanh、ReLu等来增强网络的表达能力,在CNN里最常使用的是ReLu激活函数。·Dropout,在模型训练阶段随机让一些隐层节点不工作,提高神经网络的泛化能力,一定程度上可防止过拟合。这一点就好比人眼在识别图的时候,适当遮住一部分图像并不会影响识别结果一样。相对于浅层学习的SVM、KNN和朴素贝叶斯等,深度学习由于参数众多,更容易出现过拟合的现象,所以一般都需要使用Dropout的机制。以处理经典的MNIST数据集为例,MNIST数据集作为一个简单的计算机视觉数据集,包含一系列如图2-12所示的手写数字图片和对应的标签。图片是28×28的像素矩阵,标签则对应着0~9的10个数字。每张图片都经过了大小归一化和居中处理。图2-12MNIST图片示例处理MNIST的CNN结构如图2-13所示,这是一个TensorFlow的结构输出图。图2-13典型的CNN结构(TensorFlow)简化表示的结构图如图2-14所示,TensorFlow中将处理的数据统一抽象为张量,即所谓的Tensor,原始大小为28×28的图像可以抽象成大小为28×28张量,张量依次经过:1)卷积核大小为3×3数量为32的卷积处理。2)池化大小为2×2的池化处理。3)卷积核大小为3×3数量为64的卷积处理。4)池化大小为2×2的池化处理以及最后的全连接处理。5)最后得到长度为10的一维张量,对应正好是图像识别后的结果,即数字0~9。图2-14简化的典型CNN结构完整的处理流程如图2-15所示,其中Dropout合并到全连接处理中没有画出来。图2-15典型的CNN结构完整处理流程下面我们基于TensorFlow一步一步使用代码实现上述过程。每张图片大小为28×28,可以当做一个28×28的矩阵,CNN输入层的大小为28×28,由于图像是灰度图像,每个像素取值为0或者1,定义输入为[None,28,28,1],这样就获得了大小为28×28的张量:network=input_data(shape=[None,28,28,1],name='input')使用卷积处理,卷积核大小为3×3,卷积核数量为32,可以理解为通过3×3大小的卷积操作,提取32种特征,处理后的张量大小为28×28×32,激活函数使用relu:network=conv_2d(network,32,3,activation='relu',regularizer="L2")使用池化处理,池化大小为2×2,处理后的张量大小为14×14×32:network=max_pool_2d(network,2)使用卷积处理,卷积核大小为3×3,卷积核数量为64,可以理解为通过3×3大小的卷积操作,提取64种特征,处理后的张量大小为14×14×64:network=conv_2d(network,64,3,activation='relu',regularizer="L2")使用池化处理,池化大小为2×2,处理后的张量大小为7×7×64:network=max_pool_2d(network,2)标准化处理张量,将大小为7×7×64的张量转化为长度为3136的一维张量,并与节点数为128的隐藏层进行全连接,为了避免过拟合,使用Dropout让部分节点临时失效。其中函数local_response_normalization即localresponsenormalization最早是由Krizhevsky和Hinton在关于ImageNet的论文里面使用的一种数据标准化方法:network=local_response_normalization(network)
network=fully_connected(network,128,activation='tanh')
network=dropout(network,0.8)再与节点数为256的隐藏层进行全连接,为了避免过拟合,继续使用Dropout让部分节点临时失效:network=fully_connected(network,256,activation='tanh')
network=dropout(network,0.8)最后再与节点数为10的输出层进行全连接,获得长度为10的一维张量,至此我们使用CNN,完成了大小为28×28的张量到大小为1×10的张量的训练转化:network=fully_connected(network,10,activation='softmax')
network=regression(network,optimizer='adam',learning_rate=0.01,
loss='categorical_crossentropy',name='target')值得一提的是,这里使用了多种激活函数,常见的激活函数有:sigmoid函数、tanh函数、ReLU函数,如图2-16~图2-18所示。图2-16sigmoid函数图2-17tanh函数图2-18ReLU函数2.2.5AlexNet的结构及实现AlexNet是在2012年发表的一个经典之作,并在当年取得了ImageNet最好成绩,其官方提供的数据模型,准确率达到57.1%,top1~5达到80.2%。与传统的机器学习分类算法相比,这个结果已经相当出色。AlexNet一共有8层组成,其中3个卷积层5个全连接层,如图2-19所示。图2-19AlexNet结构以处理经典的Oxford's17CategoryFlower数据集为例,如图2-20所示。Oxford’s17CategoryFlower数据集是一个不同种类鲜花的图像数据,包含17个不同种类的鲜花,每类80张该类鲜花的图片,这些鲜花种类是英国地区常见的。图2-20Oxford’s17CategoryFlower数据集每张图片大小为227×224,通道数为3,所以对应的张量大小为227×227×3。部分文献记录图片大小为224,这不影响本文的描述与代码实现。处理Oxford’s17CategoryFlower数据集的AlexNet结构如图2-21所示,这是一个TensorFlow的结构输出图。图2-21AlexNet结构(TensorFlow)简化后的处理流程如图2-22所示,大小为227×227×3张量经过如下处理:1)卷积核大小为11×11数量为96的卷积处理。2)池化大小为3×3的池化处理。3)卷积核大小为5×5数量为256的卷积处理。4)池化大小为3×3的池化处理。5)卷积核大小为3×3数量为384的卷积处理。6)卷积核大小为3×3数量为384的卷积处理。7)卷积核大小为3×3数量为256的卷积处理。8)池化大小为3×3的池化处理以及最后的全连接处理。9)最后得到长度为17的一维张量,对应正好是图像识别后的结果,即对应到17种花卉中的某一种。图2-22简化的AlexNet结构下面我们基于TensorFlow一步一步使用代码实现上述过程。每张图片大小为227×227可以当做一个227×227的矩阵,CNN输入层的大小为227×227,由于图像通道数为3,定义输入为[None,227,227,3],这样我们就获得了大小为227×227×3的张量:network=input_data(shape=[None,227,227,3])使用卷积处理,卷积核大小为11×11,卷积核数量为96,步长为4,可以理解为通过11×11大小的卷积操作,提取96种特征,处理后的张量大小为56×56×3×96,激活函数使用relu:network=conv_2d(network,96,11,strides=4,activation='relu')使用池化处理,池化大小为3×3,步长为2:network=max_pool_2d(network,3,strides=2)使用卷积处理,卷积核大小为5×5,卷积核数量为256:network=conv_2d(network,256,5,activation='relu')使用池化处理,池化大小为3×3,步长为2:network=max_pool_2d(network,3,strides=2)使用卷积处理,卷积核大小为3×3,卷积核数量为384:network=conv_2d(network,384,3,activation='relu')使用卷积处理,卷积核大小为3×3,卷积核数量为384:network=conv_2d(network,384,3,activation='relu')使用卷积处理,卷积核大小为3×3,卷积核数量为256:network=conv_2d(network,256,3,activation='relu')使用池化处理,池化大小为3×3,步长为2:network=max_pool_2d(network,3,strides=2)标准化处理张量,并与节点数为4096的隐藏层进行全连接,为了避免过拟合,使用Dropout让部分节点临时失效:network=local_response_normalization(network)
network=fully_connected(network,4096,activation='tanh')
network=dropout(network,0.5)
etwork=fully_connected(network,4096,activation='tanh')
network=dropout(network,0.5)最后再与节点数为17的隐藏层进行全连接,获得长度为17的一维张量,至此,我们使用AlexNet,完成了大小为227×227×3的张量到大小为1×17的张量的训练转化:network=fully_connected(network,17,activation='softmax')
network=regression(network,optimizer='adam',learning_rate=0.01,
loss='categorical_crossentropy',name='target')2.2.6VGG的结构及实现牛津大学VGG(VisualGeometryGroup)组在2014年ILSVRC提出的模型被称作VGG模型,跟以往模型相比,该模型进一步加宽和加深了网络结构,它的核心是5组卷积操作,每两组之间做Max-Pooling空间降维。同一组内采用多次连续的3×3卷积,卷积核的数目由较浅组的64增多到最深组的512,同一组内的卷积核数目是一样的。卷积之后接两层全连接层,之后是分类层。由于每组内卷积层的不同,有11、13、16、19层这几种模型,图2-23展示一个16层的网络结构。VGG模型结构相对简洁,提出之后也有很多文章基于此模型进行研究,如在ImageNet上首次公开超过人眼识别的模型就是借鉴VGG模型的结构。图2-23VGG结构依然使用经典的Oxford’s17CategoryFlower数据集为例。每张图片大小为227×224,通道数为3,所以对应的张量大小为227×227×3。部分文献记录图片大小为224,这不影响本文的描述与代码实现。处理Oxford’s17CategoryFlower数据集的VGG结构如图2-24所示,这是一个TensorFlow的结构输出图。简化后的处理流程如下所示,大小为227×227×3张量经过如下处理:1)卷积核大小为3×3数量为64的卷积处理,激活函数为relu。2)卷积核大小为3×3数量为64的卷积处理,激活函数为relu。3)池化大小为2×2的池化处理。4)卷积核大小为3×3数量为128的卷积处理,激活函数为relu。5)卷积核大小为3×3数量为128的卷积处理,激活函数为relu。6)池化大小为2×2的池化处理。7)卷积核大小为3×3数量为256的卷积处理,激活函数为relu。8)卷积核大小为3×3数量为256的卷积处理,激活函数为relu。9)卷积核大小为3×3数量为256的卷积处理,激活函数为relu。10)池化大小为2×2的池化处理。11)卷积核大小为3×3数量为512的卷积处理,激活函数为relu。12)卷积核大小为3×3数量为512的卷积处理,激活函数为relu。13)卷积核大小为3×3数量为512的卷积处理,激活函数为relu。14)池化大小为2×2的池化处理。15)卷积核大小为3×3数量为512的卷积处理,激活函数为relu。16)卷积核大小为3×3数量为512的卷积处理,激活函数为relu。图2-24VGG结构(TensorFlow)图2-24(续)17)卷积核大小为3×3数量为512的卷积处理,激活函数为relu。18)池化大小为2×2的池化处理以及与节点数为4096的隐藏层全连接。19)最后得到长度为17的一维张量,对应正好是图像识别后的结果,即对应到17种花卉中的某一种。简化后的VGG结构如图2-25所示。下面我们基于TensorFlow一步一步使用代码实现上述过程。每张图片大小为227×227可以当做一个227×227的矩阵,VGG输入层的大小为227×227,由于图像通道数为3,定义输入为[None,227,227,3],这样我们就获得了大小为227×227×3的张量:network=input_data(shape=[None,227,227,3])使用连续两个卷积层处理,每层都是卷积核大小为3×3,卷积核数量为64,可以理解为通过3×3大小的卷积操作,提取64种特征,激活函数使用relu:network=conv_2d(network,64,3,activation='relu')
network=conv_2d(network,64,3,activation='relu')使用池化处理,池化大小为2×2,步长为2:network=max_pool_2d(network,2,strides=2)图2-25简化的VGG结构使用连续两个卷积层处理,每层都是卷积核大小为3×3,卷积核数量为128,可以理解为通过3×3大小的卷积操作,提取128种特征,激活函数使用relu:network=conv_2d(network,128,3,activation='relu')
network=conv_2d(network,128,3,activation='relu')使用池化处理,池化大小为2×2,步长为2:network=max_pool_2d(network,2,strides=2)使用连续3个卷积层处理,每层都是卷积核大小为3×3,卷积核数量为256,可以理解为通过3×3大小的卷积操作,提取256种特征,激活函数使用relu:network=conv_2d(network,256,3,activation='relu')
network=conv_2d(network,256,3,activation='relu')
network=conv_2d(network,256,3,activation='relu')使用池化处理,池化大小为2×2,步长为2:network=max_pool_2d(network,2,strides=2)使用连续3个卷积层处理,每层都是卷积核大小为3×3,卷积核数量为512,可以理解为通过3×3大小的卷积操作,提取512种特征,激活函数使用relu:network=conv_2d(network,512,3,activation='relu')
network=conv_2d(network,512,3,activation='relu')
network=conv_2d(network,512,3,activation='relu')使用池化处理,池化大小为2×2,步长为2:network=max_pool_2d(network,2,strides=2)使用连续3个卷积层处理,每层都是卷积核大小为3×3,卷积核数量为512,可以理解为通过3×3大小的卷积操作,提取512种特征,激活函数使用relu:network=conv_2d(network,512,3,activation='relu')
network=conv_2d(network,512,3,activation='relu')
network=conv_2d(network,512,3,activation='relu')使用池化处理,池化大小为2×2,步长为2:network=max_pool_2d(network,2,strides=2)与节点数为4096的隐藏层进行全连接,为了避免过拟合,使用Dropout让部分节点临时失效:network=local_response_normalization(network)
network=fully_connected(network,4096,activation='tanh')
network=dropout(network,0.5)
etwork=fully_connected(network,4096,activation='tanh')
network=dropout(network,0.5)最后再与节点数为17的隐藏层进行全连接,获得长度为17的一维张量,至此我们使用VGG,完成了大小为227×227×3的张量到大小为1×17的张量的训练转化:network=fully_connected(network,17,activation='softmax')
network=regression(network,optimizer='rmsprop',
loss='categorical_crossentropy',
learning_rate=0.0001)2.3基于CNN的文本处理CNN的诞生是为了解决图像处理领域计算量巨大而无法进行深度学习的问题,CNN通过卷积计算、池化等大大降低了计算量,同时识别效果满足需求。图像通常是二维数组,文字通常都是一维数据,是否可以通过某种转换后,也使用CNN对文字进行处理呢?答案是肯定的。2.3.1典型的CNN结构我们回顾一下在图像处理时CNN是如何处理二维数据的。如图2-26所示,CNN使用二维卷积函数处理小块图像,提炼高级特征进行进一步分析。典型的二维卷积函数处理图片的大小为3×3、4×4等。图2-26CNN处理图像数据的过程同样原理,我们可以使用一维的卷积函数处理文字片段,提炼高级特征进行进一步分析,如图2-27所示。典型的一维卷积函数处理文字片段的大小为3、4、5等。图2-27CNN处理文本数据的过程这要感谢YoonKim的经典论文《ConvolutionalNeuralNetworksforSentenceClassification》。基于TensorFlow的处理文本的CNN的结构如图2-28所示。图2-28处理文本的CNN结构(TensorFlow)2.3.2典型的CNN代码实现定义CNN模型,其使用数量为128核,长度分别为3、4、5的3个一维卷积函数处理数据。使用卷积处理,卷积核长度为3,卷积核数量为128,可以理解为通过长度为3的卷积操作,提取128种特征,激活函数使用relu:branch1=conv_1d(network,128,3,padding='valid',activation='relu',regularizer="L2")使用卷积处理,卷积核长度为4,卷积核数量为128,可以理解为通过长度为4的卷积操作,提取128种特征,激活函数使用relu:branch2=conv_1d(network,128,4,padding='valid',activation='relu',regularizer="L2")使用卷积处理,卷积核长度为5,卷积核数量为128,可以理解为通过长度为5的卷积操作,提取128种特征,激活函数使用relu:branch3=conv_1d(network,128,5,padding='valid',activation='relu',regularizer="L2")合并以上3个卷积的处理后的结果,并使用一个全连接处理,输出结果为一个节点为2的输出层:network=merge([branch1,branch2,branch3],mode='concat',axis=1)
network=tf.expand_dims(network,2)
network=global_max_pool(network)
network=dropout(network,0.8)
network=fully_connected(network,2,activation='softmax')
network=regression(network,optimizer='adam',learning_rate=0.001,
loss='categorical_crossentropy',name='target')2.4本章小结本章重点介绍了CNN的基本原理、典型的CNN结构和基于TensorFlow代码实现,结合MNIST数据集,详细介绍了整个数据处理过程以及张量的大小变化,介绍了CNN的高级形式AlexNet和VGG的结构和基于TensorFlow的代码实现,并结合Oxford’s17CategoryFlower数据集,详细介绍了整个数据处理过程。第3章循环神经网络在《Web安全之机器学习入门》中,我们介绍了大量的机器学习算法,比如SVM、KNN、朴素贝叶斯等,它们经常用于解决分类问题。但是在生活中还有一类问题,比如提供一套视频,让你根据视频判断发生了什么,这类问题本质上是需要处理序列化的数据。假如让机器分析漫画《火影忍者》中的一集,机器分析鸣人微笑的这张视频截图(见图3-1),机器只能判断大概50%的概率是鸣人刚吃完泡面很开心,30%的概率是鸣人被火影或者师傅表扬,剩下20%的概率是可能打架打赢了,如果没有上下文,只能判断到这种地步了。图3-1鸣人微笑的图片但是如果机器记住了视频开始的时候,鸣人正和佐助格斗(见图3-2),那么就可以80%以上的概率判断鸣人微笑是因为打赢了。图3-2鸣人和佐助格斗的图片这个例子给我们的启发是,处理序列化的数据,比如视频或者Linux下一段命令行操作记录等,准确的识别与判断需要依赖上下文,或者说需要能够保存一段时间的记忆来辅助判断,这就引入了循环神经网络。本章重点介绍循环神经网络的基本概念及其主要实现形式和应用场景,包括序列分类、序列生成、序列标记以及序列转换(也称为序列翻译),并介绍了在TensorFlow环境下的代码实现。本章演示代码请参考本书GitHub上的rnn.py文件。3.1循环神经算法概述RNN(RecurrentNeuralNetworks,循环神经网络)是深度学习算法中非常有名的一种算法。RNN之所以称为循环神经网络,是因为一个序列当前的输出与前面的输出也有关。具体的表现形式为,网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出。理论上,RNN能够对任何长度的序列数据进行处理。但是在实践中,为了降低复杂性往往假设当前的状态只与前面的几个状态相关\h[1]。RNN的独特能力来自于它的特殊结构,如图3-3所示,x代表输入,h代表输出,输出的一部分会作为输入的一部分重新输入,于是RNN具有了一定的记忆性。把RNN神经元展开来分析,图3-3中的RNN等效于一连串共享系数的神经元串联在一起(如图3-4所示),这也就解释了RNN特别适合处理时序数据的原因。图3-3RNN结构示例(一)图3-4RNN结构示例(二)但是生活的经验告诉我们,对于比较复杂的情况,只分析时序数据的最近几个数据难以得到合理的结果,需要更长的记忆来追根溯源,于是就有了LSTM(LongShortTermMemory,长短程记忆),LSTM可以在更长的时间范围来分析时序数据,如图3-5所示。图3-5RNN之LSTM示例LSTM的关键就是神经细胞状态,水平线在图上方贯穿运行,细胞状态类似于传送带,状态通过水平线在细胞之间传递(见图3-6),从而保证长期记忆能保存。LSTM有通过精心设计的称作“门”的结构来去除或者增加信息到细胞状态的能力。门是一种让信息选择式通过的方法,包含一个Sigmoid神经网络层和一个乘法操作,如图3-7所示。Sigmoid层输出0到1之间的数值,描述每个部分有多少量可以通过。0代表“不许任何量通过”,1代表“允许任意量通过”\h[2]。图3-6RNN之LSTM神经细胞状态传递图3-7RNN之门结构由于LSTM的优异表现,它成为了RNN的事实标准,后面的例子如果没有特别声明,RNN的实现都是基于LSTM。\h[1]/p/9dc9f41f0b29\h[2]/a/110602675_1576273.2单向循环神经网络结构与实现在TensorFlow中,LSTM被封装成一个组件,使用时只需指定节点数即可。以处理序列长度为100的二分类问题为例,处理流程如图3-8所示。图3-8基于TensorFlow实现的单向RNN流程对应的具体流程依次为:1)输入张量为长度100的序列,经过Embedding,即嵌入处理后,转换成128维张量。2)节点数为128的循环神经网络组件处理。3)输入节点数为128,隐藏节点数为128,输出节点数为2的全连接处理。4)产生维度为2的张量,即分类结果。基于TensorFlow实现的单向RNN的结构如图3-9所示。代码实现过程如下所示。首先将训练数据集和测试数据集转换成长度为100的序列,不足100的使用0填充:trainX=pad_sequences(trainX,maxlen=100,value=0.)
testX=pad_sequences(testX,maxlen=100,value=0.)为了处理方便,达到端到端的训练效果,需要将二分类问题的结果转换成二维张量:trainY=to_categorical(trainY,nb_classes=2)
testY=to_categorical(testY,nb_classes=2)定义RNN的输入端,每一个处理的序列长度为100,通常认为要处理的序列个数为无限或者不确定,所以定义input_data的第一个参数为None,每个序列的长度都是固定的100,所以第二个参数为100:net=tflearn.input_data([None,100])图3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 农活外包合同
- 分装业务外包合同
- 加工车间外包合同
- 包装设备外包合同
- 医院安保外包合同
- 单位外派外包合同
- 厂区内保安外包合同
- 口罩厂产线外包合同
- 商场外包合同
- 圆才外包合同
- 国家事业单位招聘2025中国动物卫生与流行病学中心招聘拟聘用人员笔试历年参考题库典型考点附带答案详解
- GB/T 18984-2026低温管道用无缝钢管
- 2026年广东省揭阳市普宁市中考模拟预测化学试题
- 2026广东茂名高岭科技有限公司技术部职员2名备考题库含答案详解(综合题)
- 2026年上海市浦东新区初三下学期二模道德与法治试卷和答案
- 金昌市金川区玉石沟冶金用石英岩矿产资源开发与恢复治理方案
- 2026年高级经济师之工商管理考试彩蛋押题及参考答案详解(综合卷)
- 鞋厂各部门责任制度
- 闸门安全生产责任制度
- 新能源汽车充电桩建设中的法律问题与规制路径研究毕业答辩汇报
- 2025年卫健委工作人员岗位招聘面试参考题库及参考答案
评论
0/150
提交评论