深度学习笔记

  1.  Tensorflow中一般使用四维tensor表示一个mini_batch的图片,四个维度分别是批大小,像素行数,像素列数,通道数[batch,height,weight,channels],如tensor中的元素可以是任意内置类型,常用的为float32.
  2. Tensorflow

状态操作:Variable Assige AssignAdd

神经网络相关操作:SoftMax Sigmoid ReLU Convtion2D MaxPool

存档操作:Save Restore

队列和同步操作:Enqueue Dequeue MutexAcquire MutexRelease

控制流操作:Merge Switch Enter Leave NextIteratio

  1. tensorflow计算图的状态,就是图中所有参数的组合。Tensorflow以变量Variable来存储参数值,变量可以与tensor一样参与各种运算,区别在于tensor的值在每次计算完立即被丢弃,而变量的值在通过反向传播计算更新后会保留下来,进入到下一轮训练迭代。
  2. Session是驱动Tensorflow系统执行计算交互的入口。对于python来说,计算图可以在Session创建之前完成,并在tf.Session对象初始化时载入到后端执行引擎,触发计算图执行通过Run接口,也就是tf.Session.run()方法,通过这个接口我们可以将数据代入模型进行执行,并得到执行结果,训练过程由客户端的循环来控制。Session管理了运行时的一系列资源的申请和分配,并且在计算完成后必须要关闭Session以释放资源。
  3. Tensorflow系统架构:client->master->worker架构的分布式系统。客户端通过tf.Seeeion接口与master进行通信,并向master提交触发执行的请求,master将执行任务分配到一个或多个worker进程上,执行的结果通过master返回客户端,worker是最终负责执行计算的角色,会控制计算机的硬件设备资源。   
  4.  Cuda toolkit和cudnn库以启用gpu加速环境,cuda包括了cuda驱动以及使用cuda程序必须使用的编译器和头文件,还有一些辅助函数库。Cudnn是基于cuda toolkit编写的专门面向深度神经网络的gpu加速库.还提供了一些基于神经网络常用的计算,卷积,池化,激活等,tensorflow直接使用这些库函数来实现各种计算的gpu加速。
  5.  Pandas内置了多种解析器,可以直接处理csv pickle json等常用的数据文件格式,甚至可以从MYSQL数据库或者操作系统的剪切板中读入数据,读入的数据为一个DataFrame类型的对象,可以改变该数据类型的维度 长度 类型等
  6. Scikit_learn库中提供了用于切分数据集的工具函数train_test_split(),随机打乱顺序后按比例拆分数据集
  7. 逻辑回归的预测问题公式:y‘ = softmax(xW+b),其中x是输入向量,大小为d*1的列向量,d是特征数,W是c*d的权重矩阵,c是分类类别数目,b是偏置向量,为c*1的列向量。Softmax是一种归一化指数函数。将向量中的元素转换为(0,1)的区间,softmax常用于输出层,用于指定唯一的分类输出。
  8. W和b是模型中的参数,需要通过训练来求得的部分。
  9. 使用placeholder声明输入数据的占位符,tensorflow有数据feed机制,在后面真正计算是,用数据替换占位符。
  10. 占位符placeholder需要给定三个参数,分别是输入数据的元素类型dtype,维度形状shape占位符名称标识name,维度形状使用数组指定,shape不指定默认为None,表示任意形状,一般将第一个维度作为mini_batch的维度,从第二个维度开始才是特征维度,占位符名称name用于区分计算图里的各个节点,默认也为None,系统会自动将节点设置为类似placeholder:0这样的名称
  11. 声明参数变量w,b。tensorflow使用变量Variable来存储和更新这些参数的值。变量声明方式是直接定义tf.Varisble()对象,初始化变量对象有两种方式,一种是从protocol buffer结构VariableDef中反序列化,另一种是通过参数指定初始值。初始值必须是一个tensor对象,或者可以通过convert_to_tensor()方法转换成tensor的python对象,tensorflow提供了多种构造随机tensor的方法,定义变量会保留初始值的维度形状。
  12. 构造前向传播计算图,前向传播就是网络正向计算,由输入计算出标签的过程,其中tf.matmul()是矩阵乘法算子,tf.nn.softmax()是softmax函数,在计算图的构建过程中,tensorflow会自动推算每一个节点的输入输出形状。
  13. 声明代价函数,机器学习算法的优化需要靠代价函数来评估优化方向,二分类问题一般使用交叉熵作为代价函数。(真实值与预测值之间的差异)
  14. 计算交叉熵的时候,模型输出值y_pred应该先加上一个很小的误差值,因为y_pred会非常接近0或1,无法计算log(0),进一步无法计算梯度。解决这个问题的三个办法:1、计算log()时加上一个很小的误差值,如1e-10

2、使用clip()函数限定y_pred的范围

3、当输出非法出现nan时,显式的将cost设置为0

17、加入优化算法,tensorflow内置了很多优化算法,随机梯度下降法(SGD)动量算法(Momentum)Adagrede算法ADAM算法RMSProp算法 在线学习算法FTRL,优化器会自动构建梯度计算和反向传播部分的计算图,一般对于优化算法最关键的是学习率。

18、关闭Session的方法1、Session.close()方法来关闭2、Session重载了__enter__()和__exit__()两个方法,可以使用with语句退出作用域时自动关闭对象。

18、Session启动后就正式进入了训练过程,首先使用tf.global_variables_initializer().run()方法初始化所有变量,接下来就是用一个循环将训练数据反复代入计算图执行迭代,在循环内,Session.run()是触发后端执行的入口。

19、Session.run()有两个关键的参数fetches和feed_dict.其中fetches指定需要被计算的节点,可以用数组同时指定多个节点,节点可以是算子op也可以是tensor。计算所需要的数据是由feed_dict代入,feed_dict需要传入一个字典,字典的key是输入占位符placeholder,value是真实的输入数据。Session.run()执行完计算后,会返回计算节点的结果,若节点为算子,则没有返回值,若节点是tensor则返回当前的值。

20、
代码:import pandas as pd

from sklearn.model_selection import train_test_split

import tensorflow as tf

import numpy as np

mini_batch = 32

#从csv文件中读入数据,读入的数据是一个DataFrame类型的对象

data = pd.read_csv('train.csv')

#查看读入的数据

print(data.info)

#取部分特征字段用于分类,并将所有缺失的字段填充为0

#DataFrame中的apply方法就是将函数应用到由列或行形成的一维数组上

data['Sex'] = data['Sex'].apply(lambda s:1 if s == 'male' else 0)



data = data.fillna(0)

dataset_X = data[['Sex','Age','Pclass','SibSp','Parch','Fare']]

dataset_X = dataset_X.values

print('dataset_X',dataset_X)

#两种分类分别是幸存和死亡,Survived字段是其中一种分类的标签

#新增Deceased字段表示第二种分类的标签,取值为Survived字段取非

#Survivede为1时,Deceased取非,两者组成二分类的one_hot[0,1][1,0]标签

data['Deceased'] = data['Survived'].apply(lambda s : int(not s))

# print('data',data['Deceased'])

dataset_Y = data[['Deceased','Survived']]

dataset_Y = dataset_Y.values

print('dataset_Y',dataset_Y)



#使用sklearn的train_test_split函数将标记数据切分为训练集和测试集

#将全部标记数据随机洗牌后切分,其中验证数据占20%由test_size参数指定

'''

train_test_split是交叉验证中常用的函数,功能是从样本中随机的按比例选取train_data和test_data,形式为:

X_train,X_test, y_train, y_test =cross_validation.train_test_split(train_data,train_target,test_size=0.4, random_state=0)



cross_validatio为交叉验证



参数解释:

train_data:所要划分的样本特征集

train_target:所要划分的样本标签

test_size:样本占比,如果是整数的话就是样本的数量

random_state:是随机数的种子。

随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。

比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。

随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:

种子不同,产生不同的随机数;种子相同,即使实例不同也产生相同的随机数。



'''

X_train,X_test,y_train,y_test = train_test_split(dataset_X,dataset_Y,test_size=0.2,random_state=42)



#声明输入数据占位符,6个特征字段,标记字段由两个字段组成

#shape参数的第一个元素为None,表示可以同时放入任意条记录

X = tf.placeholder(tf.float32,shape=[None,6])

y = tf.placeholder(tf.float32,shape=[None,2])

#声明变量

w = tf.Variable(tf.random_normal([6,2]),name = 'weights')

b = tf.Variable(tf.zeros([2]),name= 'bias')

#构造前向传播计算图

y_pred = tf.nn.softmax(tf.matmul(X,w)+b)

#使用交叉熵作为代价函数

cross_entropy = - tf.reduce_sum(y*tf.log(y_pred+ 1e-10),reduction_indices=1)

#批量样本的代价值为所有样本交叉熵的平均值

cost = tf.reduce_mean(cross_entropy)

#使用随机梯度下降法优化器来最小化代价,系统自动构建反向传播部分的计算图

train_op = tf.train.GradientDescentOptimizer(0.001).minimize(cost)



with tf.Session() as sess:

    #初始化所有变量,必须最先执行

    tf.global_variables_initializer().run()

    #训练迭代,迭代10轮

    for epoch in range(10):

        total_loss = 0

        for i in range(len(X_train)):

            feed = {X:[X_train[i]],y:[y_train[i]]}

            #通过session.run接口触发执行

            _,loss = sess.run([train_op,cost],feed_dict=feed)

            # print(loss,loss.type)

            total_loss += loss

        print('epoch:%04d,total_loss=%.9f'%(epoch+1,total_loss))

    print('train complete')

    #评估校验数据集上的准确率

    print(X_test.shape,y_test.shape)

    pred = sess.run([y_pred],feed_dict={X:X_test})

    # .equal(A, B)是对比这两个矩阵或者向量的相等的元素,如果是相等的那就返回True,反正返回False,

    # 返回的值的矩阵维度和A是一样的

    correct = np.equal(np.argmax(pred,0),np.argmax(y_test,0))

    accuracy = np.mean(correct.astype(np.float32))#求均值

    print('Accuracy on Validation set:%.9f'%accuracy)
 
j = 0

for i in range(int(len(X_train)/32)+1):

    feed = {X:X_train[j:j+32],y:y_train[j:j+32]}

    j  += 32

    #通过session.run接口触发执行

    _,loss = sess.run([train_op,cost],feed_dict=feed)
 

调试代码出现的问题:

1、correct = np.equal(np.argmax(pred,1),np.argmax(y_test,1))计算维度出现错误:ValueError: operands could not be broadcast together with shapes (1,2) (179,)
2、X = tf.placeholder(tf.float32,shape=[None,6])
   y = tf.placeholder(tf.float32,shape=[None,2])
与for i in range(len(X_train)):
            feed = {X:[X_train[i]],y:[y_train[i]]}#注意这里X_train[i]要用[]包起来,不然会出现错误:ValueError: Cannot feed value of shape (6,) for Tensor 'Placeholder:0', which has shape '(?, 6)'
            #通过session.run接口触发执行
            _,loss = sess.run([train_op,cost],feed_dict=feed)

相对应,可以看到每次feed的是一行数据,不能改变shape里行数None值,会报以下错误:ValueError: Cannot feed value of shape (1, 6) for Tensor 'Placeholder:0', which has shape '(32, 6)'

3、改正以上错误,但是发现定义batch_size=32时并不是每次都是32

X = tf.placeholder(tf.float32,shape=[None,6])
y = tf.placeholder(tf.float32,shape=[None,2])

j = 0

for i in range(int(len(X_train)/32)+1):

    feed = {X:X_train[j:j+32],y:y_train[j:j+32]}

    j  += 32

    #通过session.run接口触发执行

    _,loss = sess.run([train_op,cost],feed_dict=feed)

20、存储和加载模型参数,将训练得到的参数保存下来,预测时直接加载到模型中使用,tensorflow使用的是tf.train.Saver和checkpoint机制。Save对象在初始化时为计算图加入了存储和加载变量的算子,变量的存储和读取通过tf.train.Saver类来完成的。并可以通过参数指定要存储哪些变量,Saver对象的save()和restore()方法是触发图中算子的入口。Checkpoint是用于存储变量的二进制文件,内部使用字典结构存储变量

21、Saver对象在初始化时,若不指定变量列表,默认只会自动收集其声明之前的所有变量,在Saver对象初始话后的所有变量将不被记录。这样的机制在迁移学习的应用中非常有用

22、Saver.save()触发的存储操作会生成四个文件,一、model.ckpt,该文件是真实存储变量及其取值的文件,二、model.ckpt.meta的描述文件,存储的是MetaGraphDef结构的对象经过二进制序列化后的内容,MetaGraphDef结构由Protocol buffer定义,其中包含整个计算图的描述,各变量定义的声明,输入管道的形式等其他信息。Meta文件可以在没有计算图声明代码的情况下载入模型,如果应用时程序已经有计算图的基本信息,只需要加载model.ckpt一个文件即可。三、model.ckpt.index存储了变量在checkpoint文件中的位置索引,四、checkpoint文件存储了最新存档的文件路径

23、模型存档有两种存储模式,1、一次性存储(以上就是)2、引入迭代计数器,按训练迭代轮次存储

24、预测测试数据的结果,就是加载测试数据后执行一遍正向传播计算即可。

25、数据挖掘data mining是要从大量无序的数据中通过算法找到隐藏的信息和模式的过程,主要包括有监督的分类,预测和无监督的聚类,相关性分组等方法,可以通过数据可视化筛选相关性最高的特征组合,然后代入分类器进行试验,检测不同方法在同一问题的表现。

 

26、特征工程,特征工程是将原始数据的属性转换为特征的过程,在数据建模时,如果对数据的所有属性进行学习,噪声干扰较大,特征工程通过对数据进行重组,可以帮助算法模型减少噪声干扰,得到更好的拟合效果。

27、数据清洗,目的是处理异常样本,如样本存在字段缺失,数据格式错误等问题

常用的办法:

  1. 直接丢弃整行样本数据,样本数量足够的时候优先选择
  2. 当所有样本中某一字段缺失非常严重的时候,可以考虑丢弃整列字段
  3. 将缺失字段填充为整列数据的平均值,相当于弱化了缺失项对其他特征的影响
  4. 将缺失字段填充为默认值,相当于作为单独一种分类

28、数据预处理是通过数据进行离散化,标准化,归一化,数值变换等方法,是原来凌乱的数据更容易被算法处理。一般来说,枚举类型或者取值范围是有限集合的字符串类型的字段,都会使用离散方法转换成数值类型,方法就是构建一个枚举取值到数值的映射即可

29、对于定量的数值型特征而言,标准化是将整列数据按比例缩放,使之落在一个较小的区域内,如[0,100]缩小到[0,1],还可以同时对定量特征进行二值化处理,如以15岁为阈值,添加是否是儿童的标记特征。

30、特征选择(降维)1、根据阈值过滤掉方差小的变量2、通过计算变量与标签的相关系数,留下相关性高的特征。3、根据决策树或随机森林,选择重要程度高的特征。4、利用PCA算法,对数据进行变换,选择区分度最高的特征组合。

31、TensorBoard可视化,TensorBoard的工作方式是启动一个web服务,该服务进程从Tensorflow程序执行所得的事件日志文件event files中读取概要数据summary,然后将数据在网页中绘制成可视化的图表。可以展示多种数据,标量,参数,图像,音频,计算图结构等数据,这一强大的可视化工具来帮助理解复杂的模型和检查实现中的错误。

32、tensorflow中记录概要的节点由于没有被任何计算节点所依赖,所以并不会自动执行,需要手动通过Session.run()接口触发,tf.summary.merge_all可以将所有概要操作合并成一个算子,其执行的结果是经过protocol buffer序列化后的tf.Summary对象

33、数据文件格式

       1、npy和npz格式,numpy.save()方法就可以将数组存储为扩展名为.npy的二进制文件,用numpy.load()读出时,它可以自动处理元素的类型和数组维度等信息。Npz文件是存储多个数组数据的文件格式,其内部实际是将多个npy文件归档

       2、cPickle是python内置的数据的序列化和反序列化模块,通过该模块可以将python对象持久化成pkl格式的文件

       3、hdf格式,hdf文件是通用的自描述的数据文件格式,可以跨平台高效读写。

       4、TFRecord文件是以二进制进行存储数据的,适合以串行的方式读取大批量数据,是使用tensorflow下的一种文件格式。

34、图像分类CLS->目标定位LOC->目标检测DET->视频目标检测VID

       场景分类等,卷积神经网络是指:至少有一层计算为卷积操作的神经网络

35、卷积核实际就是一个权值矩阵表示如何处理单个像素和其邻域像素之间的关系,如果卷积核中各个元素的相对差值越小,相当于每个像素与周围像素取了个平均,就有模糊降噪的效果,而卷积核元素的差值越大,就拉大了每个像素与周围像素的差距,也就越能提取边缘,或者达到锐化的效果。

36、sobel算子配合SVM算法可以在行人检测问题上获得不错的结果

37、卷积操作与反向结合算法相结合,即卷积神经网络。

 

 

38、def conv2d(input,  # 张量输入

                     filter, # 卷积核参数

                     strides, # 步长参数

                     padding, # 卷积方式

                     use_cudnn_on_gpu=None, # 是否是gpu加速

            data_format=None,  # 数据格式,与步长参数配合,决定移动方式

            name=None): # 名字,用于tensorboard图形显示时使用

 

input : 输入的要做卷积的图片,要求为一个张量,shape为 [ batch, in_height, in_weight, in_channel ],其中batch为图片的数量,in_height 为图片高度,in_weight 为图片宽度,in_channel 为图片的通道数,灰度图该值为1,彩色图为3。(也可以用其它值,但是具体含义不是很理解)

filter: 卷积核,要求也是一个张量,shape为 [ filter_height, filter_weight, in_channel, out_channels ],其中 filter_height 为卷积核高度,filter_weight 为卷积核宽度,in_channel 是图像通道数 ,和 input 的 in_channel 要保持一致,out_channel 是卷积核数量。

strides: 卷积时在图像每一维的步长,这是一个一维的向量,[ 1, strides, strides, 1],第一位和最后一位固定必须是1

padding: string类型,值为“SAME” 和 “VALID”,表示的是卷积的形式,是否考虑边界。"SAME"是考虑边界,不足的时候用0去填充周围,"VALID"则不考虑

use_cudnn_on_gpu: bool类型,是否使用cudnn加速,默认为true

conv = tf.nn.cov2d(x,filter = [3,3,3,32],strides = [1,2,2,1],padding=’SAME’)

39、降维的关键在于池化操作。对于池化来说,最重要的是利用最大值或者平均值的方法,使特征提取拥有平移不变性。

40、pooling = tf.nn.max_pool(  

                    h,  

                    ksize=[1, height, width, 1], 

                    strides=[1, 1, 1, 1], 

                    padding='VALID',

                    name="pool")

h : 需要池化的输入,一般池化层接在卷积层后面,所以输入通常是feature map,依然是[batch_size, height, width, channels]这样的shape

k_size : 池化窗口的大小,取一个四维向量,一般是[1, height, width, 1],因为我们不想在batch和channels上做池化,所以这两个维度设为了1

strides : 窗口在每一个维度上滑动的步长,一般也是[1, stride,stride, 1]

padding: 填充的方法,SAME或VALID,SAME表示添加全0填充,VALID表示不添加

pool = tf.nn,max_pool(conv,ksize=[1,2,2,1],strides=[1,2,2,1],padding=’SAME’)

41、卷积操作实际是一种线性操作,在计算上仅包含乘法和加法,而在机器学习领域最重要的理论基础之一,就必须将一个特征空间的向量通过非线性变换映射到另一个空间才能实现线性可分。激活函数就是引入非线性的手段。

42、多层卷积由多个特征提取阶段所组成的,每一个阶段都由三种操作组成:卷积、池化、非线性激活函数。

43、过拟合是指训练结果在训练集与测试集性能表现差距非常大的情况。过拟合具体表现在:模型在训练数据上损失函数较小,预测准确率较高;但是在测试数据上损失函数比较大,预测准确率较低。,为了消减和抵消过拟合造成的误差,通常会采用集成学习的方式,将多个表现优秀的模型组合在一起进行预测,一般都会增加预测的准确度。

44、Dropout是深度学习领域的去过拟合技术,以极小的额外代价也能达到集成学习效果的办法,就是在每一轮的训练过程中随机让一部分隐层节点失效(让一部分隐藏节点值为0),这样就达到了改变网络结构的目的,但每个节点的权值都会保留下来,在最终预测时,打开全部隐层节点,使用完整的网络进行计算,就相当于把多个不同结构的网络组合在了一起。

 

45、AlexNet的整个网络结构由八层神经元组成,其中前五层为卷积层,用于提取图像特征,后三层为全连接层,用于图像分类。

46、

关于conv_2d函数,在源码里是可以看到总共有14个参数,分别如下:

 

1.incoming: 输入的张量,形式是[batch, height, width, in_channels]

2.nb_filter: filter的个数,输出维数

3.filter_size: filter的尺寸,是int类型

4.strides: 卷积操作的步长,默认是[1,1,1,1]

5.padding: padding操作时标志位,"same"或者"valid",默认是“same”

6.activation: 激活函数(ps:这里需要了解的知识很多,会单独讲)

7.bias: bool量,如果True,就是使用bias

8.weights_init: 权重的初始化

9.bias_init: bias的初始化,默认是0,比如众所周知的线性函数y=wx+b,其中的w就相当于weights,b就是bias

10.regularizer: 正则项(这里需要讲解的东西非常多,会单独讲)

11.weight_decay: 权重下降的学习率

12.trainable: bool量,是否可以被训练

13.restore: bool量,训练的模型是否被保存

14.name: 卷积层的名称,默认是"Conv2D"

关于max_pool_2d函数,在源码里有5个参数,分别如下:

1.incoming ,类似于conv_2d里的incoming

2.kernel_size:池化时核的大小,相当于conv_2d时的filter的尺寸

3.strides:类似于conv_2d里的strides

4.padding:同上

5.name:同上

network = conv_2d(network,96,11,strides=4,activation='relu')

network = max_pool_2d(network,3,strides=2)

47、其中LRN就是局部响应归一化:

这个技术主要是深度学习训练时的一种提高准确度的技术方法。其中caffe、tensorflow等里面是很常见的方法,其跟激活函数是有区别的,LRN一般是在激活、池化后进行的一种处理方法。提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力

network = local_response_normalization(network)

48、tflearn regression回归函数,在创建完网络之后使用,传入的network是一个完整的创建好的网络。

#定义优化算法,损失函数等
#优化器设置训练方法,这里是momentum,损耗决定了网络误差的计算方式。在这个例子中,用范畴交叉熵。
#最后,将所有这些放在一起,使用tflearn.dnn(net)创建模型
network=regression(network,optimizer='momentum',loss='categorical_crossentropy',

learning_rate=0.001)

49、tflearn.DNN是TFLearn中提供的一个模型wrapper,

相当于我们将很多功能包装起来,我们给它一个net结构,生成一个model对象, 然后调用model对象的训练、预测、存储等功能,DNN类有三个属性(成员变量): trainer,predictor,session。在fit()函数中n_epoch=10表示整个训练数据集将会用10遍,

batch_size=16表示一次用16个数据计算参数的更新

 

#训练
model=tflearn.DNN(network,checkpoint_path='model_alexnet',max_checkpoints=1,tensorboard_verbose=2)

50、VGGNet是继承了AlexNet的思路,其网络结构一样可以由8个层次所构成,也是5组卷积层,三层全连接层,主要区别在于,VGGNet的每个卷积并不是只做一次卷积操作,而是连续卷积2~4次

51、

from keras.models import Sequential

from keras.layers import Dense

 

fit( x, y, batch_size=32, epochs=10, verbose=1, callbacks=None,

validation_split=0.0, validation_data=None, shuffle=True,

class_weight=None, sample_weight=None, initial_epoch=0)

 

x:输入数据。如果模型只有一个输入,那么x的类型是numpy

array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array

y:标签,numpy array

batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。

epochs:整数,训练终止时的epoch值,训练将在达到该epoch值时停止,当没有设置initial_epoch时,它就是训练的总轮数,否则训练的总轮数为epochs - inital_epoch

verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录

callbacks:list,其中的元素是keras.callbacks.Callback的对象。这个list中的回调函数将会在训练过程中的适当时机被调用,参考回调函数

validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集。验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。注意,validation_split的划分在shuffle之前,因此如果你的数据本身是有序的,需要先手工打乱再指定validation_split,否则可能会出现验证集样本不均匀。

validation_data:形式为(X,y)的tuple,是指定的验证集。此参数将覆盖validation_spilt。

shuffle:布尔值或字符串,一般为布尔值,表示是否在训练过程中随机打乱输入样本的顺序。若为字符串“batch”,则是用来处理HDF5数据的特殊情况,它将在batch内部将数据打乱。

class_weight:字典,将不同的类别映射为不同的权值,该参数用来在训练过程中调整损失函数(只能用于训练)

 

sample_weight:权值的numpy

array,用于在训练时调整损失函数(仅用于训练)。可以传递一个1D的与样本等长的向量用于对样本进行1对1的加权,或者在面对时序数据时,传递一个的形式为(samples,sequence_length)的矩阵来为每个时间步上的样本赋不同的权。这种情况下请确定在编译模型时添加了sample_weight_mode=’temporal’。

 

initial_epoch: 从该参数指定的epoch开始训练,在继续之前的训练时有用。

52、tensorflow.python.framework.errors_impl.ResourceExhaustedError: OOM when allocating tensor with shape[32768,4096] and type float on /job:localhost/replica:0/task:0/device:GPU:0 by allocator GPU_0_bfc

        [[{{node FullyConnected/W/Initializer/truncated_normal/TruncatedNormal}}]]

Hint: If you want to see a list of allocated tensors when OOM happens, add report_tensor_allocations_upon_oom to RunOptions for current allocation info.

出现这种错误说明电脑内存不够:方法使用gpu跑加入一行代码:tflearn.init_graph(num_cores=8, gpu_memory_fraction=0.5)

53、inception的做法是跳出直线加深网络层数的思路,通过增加‘宽度’的方式增加网络的复杂度,避免陷入卷积核选择的陷阱,让程序自己学习如何选择卷积核,就是在每一个卷积层中并行使用1*1卷积,3*3卷积,5*5卷积和池化,同时提取不同尺度的特征,然后通过1*1卷积对每个分支进行降维后,最后将结果合并拼接在一起。

54、批标准化技术Batch Normalization,即对mini-batch中的所有信号量进行统一的归一化,使得一个批次中所有信号量符合均值为0,方差为1的高斯分布,这样可以减少因梯度弥散而导致的收敛速度缓慢。在Tensorflow下使用tf.nn.batch_normalization就可以加入该算子,一般在使用时batch-norm要在激活函数之前。

55、tensorflow模型可以直接通过protocol buffer格式文件的反序列化得到,即模型被保存在.pb文件中,反序列化成GraphDef对象,设置为系统默认计算图就可以了。其中比较重要的函数Graph.as_graph_def()可以得到计算图序列化后的字节流,而GraphDef.ParseFormString()方法可以从缓冲区中反序列化出GraphDef对象

#默认图
with tf.Graph().as_default() as graph:
    # 读取训练好的inception-v3模型
    #tf.gfile.FastGFile(path,decodestyle),函数功能:实现对图片的读取。
    with gfile.FastGFile(os.path.join(MODEL_DIR, MODEL_FILE), 'rb') as f:
        #将模型文件转换格式导入流图中
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
        # 加载inception-v3模型,并返回数据输入张量和瓶颈层输出张量
        bottleneck_tensor, jpeg_data_tensor = tf.import_graph_def(
            graph_def,
            return_elements=[
                BOTTLENECK_TENSOR_NAME, JPEG_DATA_TENSOR_NAME
            ])

56、ReaNet这种残差网络的结构,避免了随网络层数加深而产生的梯度消失或梯度爆炸的问题,不但使深度神经网络的收敛速度更快,精度更高,而且让加深网络深度成为可能。

57tflearn.layers.conv.residual_bottleneck (incoming, nb_blocks, bottleneck_size, out_channels, downsample=False, downsample_strides=2, activation=‘relu’, batch_norm=True, bias=True, weights_init=‘variance_scaling’, bias_init=‘zeros’, regularizer=‘L2’, weight_decay=0.0001, trainable=True, restore=True, reuse=False, scope=None, name=‘ResidualBottleneck’)

incoming: Tensor. Incoming 4-D Layer.
nb_blocks: int. Number of layer blocks.
Blocks的个数 (Blocks包含一种bottleneck,blocks的个数代表循环几次这种bottleneck的结构,一个bottleneck就是几层卷积的组合,这几层卷积的输出特征图大小形成了一种瓶颈形式,所以叫bottleneck)
bottleneck_size: int. The number of convolutional filter of the bottleneck convolutional layer. 瓶颈卷积层的卷积核个数(瓶颈结构中间层的输出)
out_channels: int. The number of convolutional filters of the layers surrounding the bottleneck layer.输出特征图的维数
downsample: bool. If True, apply downsampling using ‘downsample_strides’ for strides.降采样
downsample_strides: int. The strides to use when downsampling.
activation: str (name) or function (returning a Tensor). Activation applied to this layer (see tflearn.activations). Default: ‘linear’.
batch_norm: bool. If True, apply batch normalization.
bias: bool. If True, a bias is used.
weights_init: str (name) or Tensor. Weights initialization. (see tflearn.initializations) Default: ‘uniform_scaling’.
bias_init: str (name) or tf.Tensor. Bias initialization. (see tflearn.initializations) Default: ‘zeros’.
regularizer: str (name) or Tensor. Add a regularizer to this layer weights (see tflearn.regularizers). Default: None.
weight_decay: float. Regularizer decay parameter. Default: 0.001.
trainable: bool. If True, weights will be trainable.
restore: bool. If True, this layer weights will be restored when loading a model.
reuse: bool. If True and ‘scope’ is provided, this layer variables will be reused (shared).
scope: str. Define this layer scope (optional). A scope can be used to share variables between layers. Note that scope will override name.
name: A name for this layer (optional). Default: ‘DeepBottleneck’.

58、对于一个已经训练好的深度卷积网络来说,每一个卷积操作所得的特征图都是图像中某方面的特征提取结果,随着层次的加深,网络提取出的特征更抽象,特征数量也更少,更能代表物体本身,因此,网络的高层所得到的特征结果集合,可以认为是图像内容的量化表示。

59、图像风格转换,在论文中提出了格拉姆矩阵用于捕获绘画中的纹理特征,格拉姆矩阵是一组向量的内积的对称矩阵,计算方法是将所有特征图矩阵矢量化后,求其内积之和,它代表了不同滤波器所得结果之间的相关性,在这种高阶的统计方法之上,像素级的特征全部被抛弃,甚至全局的场景信息也没有保留,仅存了高级的绘画风格。在这种量化方法下,不同种类的纹理得以区分,甚至可以被逼近

60、论文的核心,就是利用预先训练好的VGGNet来提取图片中内容及风格的数值化特征,然后定义了一种特殊的损失函数来评估合成图片符合风格的程度,然后使用梯度下降的方法来不断修正合成图的各个像素以使损失值变小。

61、实时风格迁移的方法,其核心思路是,以neural style的研究为基础,基于VGGNet网络所提出的高位抽象特征构建损失函数,同时使用一个图像变换卷积网络来存储风格的纹理特征。然后将训练好的网络直接作为滤镜使用即可完成对图片的风格变换。整个系统由两个深度卷积网络组成,一个图像生成网络fw(X),以非线性变换y= fw(X)的方式将输入图片x转化为输出图片y,另一个是损失计算网络,是一个训练好的确定参数的VGGNet。图像生成网络就是最后需要的滤镜。

62、上述系统,损失的计算与natural style完全相同,要最小化风格损失与内容损失之和,与natural style不同的是合成图是由生成网络生成出来的,所以生成网络输出的合成图即包含内容图信息也包含风格图信息,所以梯度下降的传播不会直接改变合成图的像素,而是修改图像生成网络的参数,针对每一种风格,都训练一个单独的图像生成网络,得到一组风格对应的参数。

64、# 用于在指定维度计算均值与方差

tf.nn.moments(

    x,

    axes,

    shift=None,   # pylint: disable=unused-argument

    name=None,

keep_dims=False)

 

参数:

x:一个Tensor,可以理解为我们输出的数据,形如 [batchsize, height, width, kernels]。

axes:整数数组,用于指定计算均值和方差的轴。如果x是1-D向量且axes=[0] 那么该函数就是计算整个向量的均值与方差。

shift:未在当前实现中使用。

name:用于计算moment的操作范围的名称。

keep_dims:产生与输入具有相同维度的moment,通俗点说就是是否保持维度。

返回:

Two Tensor objects: mean and variance.两个Tensor对象:mean和variance.

解释如下:

mean 就是均值variance 就是方差

65、BN在TensorFlow中主要有两个函数:tf.nn.moments以及tf.nn.batch_normalization,两者需要配合使用,前者用来返回均值和方差,后者用来进行批处理(BN)

tf.nn.batch_normalization(

    x,

    mean,

    variance,

    offset,

    scale,

    variance_epsilon,

    name=None

)

其中x为输入的tensor,mean,variance由moments()求出,而offset,scale一般分别初始化为0和1,variance_epsilon一般设为比较小的数字即可

66、net = relu(batch_norm(conv2d(input_image,32,9)))#该句操作有如下公式对应

 

 

67、反卷积,就是补位操作,把图一个像素扩展为3*3个像素。上采样包括反卷积和上池化等。

68、tf.random_normal()函数用于从服从指定正态分布的数值中取出指定个数的值。

 

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)

 

    shape: 输出张量的形状,必选

    mean: 正态分布的均值,默认为0

    stddev: 正态分布的标准差,默认为1.0

    dtype: 输出的类型,默认为tf.float32

    seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样

    name: 操作的名称

 

69、.将内容图片输入网络,计算内容图片在网络指定层(比如[‘conv4_2’])上的输出值

在程序种体现的内容损失。我们可以这样定义内容损失:内容图片在指定层上提取出的特征矩阵,与噪声图片在对应层上的特征矩阵的差值的L2范数。即求两两之间的像素差值的平方

对应每一层的内容损失函数:

 

其中,X是噪声图片的特征矩阵,P是内容图片的特征矩阵。M是P的长*宽,N是信道数。

最终的内容损失为,每一层的内容损失加权和,再对层数取平均。

将风格图片输入网络,计算风格图片在网络指定层(比如[‘conv1_1’,’conv2_1’,’conv3_1’,’conv4_1’])上的输出值。

 

5.计算风格损失。我们使用风格图像在指定层上的特征矩阵的GRAM矩阵来衡量其风格,风格损失可以定义为风格图像和噪音图像特征矩阵的格莱姆矩阵的差值的L2范数。

 

对于每一层的风格损失函数:

 

 

其中M是特征矩阵的长*宽,N是特征矩阵的信道数。G为噪音图像特征的Gram矩阵,A为风格图片特征的GRAM矩阵。

 

最终的风格损失为,每一层的风格损失加权和,再对层数取平均。

 

6.最终用于训练的损失函数为内容损失和风格损失的加权和。

 

7.当训练开始时,我们根据内容图片和噪声,生成一张噪声图片。并将噪声图片喂给网络,计算loss,再根据loss调整噪声图片。将调整后的图片喂给网络,重新计算loss,再调整,再计算…直到达到指定迭代次数,此时,噪声图片已兼具内容图片的内容和风格图片的风格,进行保存即可。

RNN(Recurrent Neural Network)循环神经网络:

  1. 听:语音识别(Speech to Text STT),实现从音频到文本转换

说:语音合成(Text to Speech TTS),实现从文本到音频转换

读:文本理解(Text Understanding),实现文本到语义转换

写:文本生成(Text Generation),实现语义到文本转换

  1. 文本数据具有易保存,噪声小,自带标签等特性使得它更适合被用于分析语义概念。相比之下,语音数据存储量大,噪声处理复杂,数据类别标记困难,这导致语音识别和语音合成技术跟侧重于信号分类与还原。
  2. 文本分类:新闻自动分类;情感分析:用户评论分析;文本生成:机器翻译;
  3. 文本数据与图像数据最大的区别在于,文本数据更强调文字序列中前后元素之间的相互影响。要预测句子中的下一个词,一般都要通过句子中的前一个词或前几个词进行推断,因为前后单词并不是独立的。
  4. 文本数据的另一大特点就是文本序列属于变长数据,对图像数据来说,即使原始数据大小不同可以通过缩放或者剪裁的方式。对于文本数据来说,任何剪裁都可能导致语义信息的丢失。
  5. 在循环神经网络中,每一个输出元素的生成都基于同一个网络,这样就可以简单的输出变长结果,输出序列的每个元素都是其之前位置的输出元素所组成的函数,这就保持了序列元素的顺序依赖关系。
  6. RNN之所以叫recurrent是因为它对当前时刻的计算还依赖于前一步(前一个位置)的计算结果

8、

9、参数共享在RNN中也起到了至关重要的作用,对于每一时刻,参数矩阵U、W、V并没有变化,而是使用同一组参数,参数共享的意义在于,在一段文本中,部分重要的信息可能出现在任何位置,甚至同时出现在多个位置,也正是由于参数共享的作用,RNN可以处理任意长度的序列,只要序列的元素按照顺序一个个的传入网络,RNN就像管道一样逐个处理。

10、递归神经网络(Recursive Neurl Network)通过构建参数共享的树状结构处理序列数据,在考虑具体的输入数据的情况下,递归神经网络一般采取固定的平衡二叉树结构的方式构造,递归的含义在于树状结构中的重复子结构模块之间实施了参数共享。如果说循环神将网络是在时间维度上进行参数共享,那么递归神经网络是在空间维度上进行参数共享。

 

你可能感兴趣的:(深度学习笔记)