机器学习笔记(1)

 

  1. 若是特征和结果之间知足线性关系,那么咱们能够用线性函数去对这个关系进行拟合。一般使用形如y = w*x+b的多项式。咱们须要评估评估拟合的好坏,使用损失函数。一般使用平方和。由于偏差一般知足高斯分布,而咱们但愿模型在所有样本上预测最准,即几率积最大,因而采用最大似然估计的方法对它进行求导获得平方和的表达式。咱们一般使用梯度降低的方法寻找最优的w和b。由于这是一个凸优化问题,只有一个极小值,所以必然能够找到最小值。咱们将loss函数对参数求偏导,而后将参数向梯度降低的方向修改,导数越大修改越大,收敛后获得最优参数。若是咱们将这样一个线性回归结果映射到一个区间上,并定义某个区间是一个分类问题的某一个,则获得逻辑回归。逻辑回归常用sigmoid函数作映射,所以逻辑回归一般适用二分类问题。使用不一样的激活函数如softmax可应用到多分类问题。神经元就是这样的具备逻辑回归功能的单元,许多神经元叠加构成神经网络。
  2. 经常使用的激活函数有:sigmoid函数,它能够用来作二分类,并且在定义域上可导。

Relu函数:它普遍应用于神经网络,很容易求导,缺点在于0处不可导。python

  1. 感知器模型输入向量x,为每一维赋予权重w,求和后添加偏置b,再使用激活函数映射到特定区域。V= i=1mwixi+b,例如使用激活函数y = ǿ(v) = 1,if 1>0-1,otherwise
  2. Tensorflow:系统架构:(网络调用,cpu,gpu)(nn)(分布式,数据处理)(c API)(python代理,c++代理)(接口库)。Tensorflow的数据流图比较复杂,须要专门的生成工具。边:实线-数据依赖,张量。虚线-控制依赖,操做的次序。节点:一个操做,每个操做都有其实现源码。定义边和节点,构建一个图。其定义是任意的,称之为符号式编程。Tensorflow经过session抽象与图进行交互。调用session.run传入tensor做为参数,启动图,并返回result。使用device指定设备。Tensorflow中的variable用于维护图执行过程当中的一些状态信息。
  3. 逻辑回归是一个一层的神经网络,使用softmax

感知机是一个单层的神经网络,经一层直接输出结果c++

  1. 卷积神经网络要素:卷积是一种数学运算。卷积核通常是3x3的。卷积核的参数经过学习获得,在不一样的位置使用同一个卷积核成为参数共享。边缘卷积核-滤波器。池化是一种汇合操做,包括最大池化,平均池化等。其功能是降采样。引入激活函数增长网络的表达能力。全链接层起到分类器的做用。卷积层,池化层,激活函数将原始数据映射到隐层特征空间,全链接层映射到标记空间。对于一层,一个滤波器能提取一种特征,可是一层怎么能只使用一种滤波器呢?使用不少滤波器,一个通道就产生了不少通道,成为特征图。对应pytorch中的out_channnels.
  2. 在代码中使用tf.summary.histogram,tf.summary.scalar,tf.summary.filewriter,等方法来使用记录日志以使用tensorboard。在cmd中输入tensorboard –logdir=文件夹路径。在浏览器中浏览cmd中给出的地址,端口6006。在浏览器中查看cost,accuracy,graphs,distributions,histograms等。
  3. Tensorflow的计算过程是一个利用tensor来创建一个计算图,而后使用session会话来启动计算,最后获得结果的过程。Tensorflow中的变量variable本身定义,是显式的,而pytorch中是隐含的。Tensorflow中的operation是图结构的节点,正如pytorch中的神经网络层。Session.run()方法输出其输入的计算结果。即咱们求取图中的某个tensor。Matmul是矩阵乘法。使用tf.global_variables_initializer()初始化全部参数,它返回的是一个op使用session启动。Session.run能够启动op,tensor,variable等。Eval可看做run的一个简化版本。
  4. 假设咱们的样本知足正态分布,求取一个点在这个类别中的几率。当咱们有不少类时,某个样本在每个类中都具备一个几率,咱们取最大的那个可能性。
  5. Mnist数据集包含60000训练集,10000测试集。在tensorflow提供的读取mnist数据集的方法中,其灰度图像被归一化。

  1. 在mnist案例中,输入batch个28*28*1通道数据。第一层:卷积核3*3*1,通道数32.padding=same表示在最外层补充足够的0使得输出尺寸是输入和步长的比值,输出是batch*28*28*32。而后接入1,2,2,1的最大池化,strides=[1, 2, 2, 1],padding=same,输出变为batch*14*14*32。输出进行dropout。第二层:3,3,32,64,步长1,padding same。输出batch*14*14*64。接最大池化ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],输出变为batch*7*7*64。输入进行Dropout。第三层:[3, 3, 64, 128],输出batch*7*7*128。接最大池化ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],输出变为batch*4*4*128。输出Reshape为batch*2048以适应全链接层的输入。接全链接层输出降为625,输入再Dropout再接全链接层降为10,转化为一个10分类问题。使用softmax求取几率并计算交叉熵获得cost。使用RMSPropOptimizer自适应学习率最小化cost,并更新梯度,动量项0.9。Predict_op返回最大值索引即预测值,并与实际标签进行比较以计算正确率。
  2. 咱们定义:

O=输出图像的尺寸编程

I=输入图像的尺寸浏览器

K=卷积层的核尺寸网络

N=核数量session

S = 移动步长架构

P = 填充数框架

通过卷积层和池化层,输出尺寸经下面这个公式计算:分布式

O=I-K+2Ps+1ide

实际使用这个公式时要注意灵活变化,一个是padding,再tensorflow和pytorch中具备不一样的padding方式。Pytorch的默认方式至关于tensorflow的valid方式。第二要注意在不知足整除时框架的处理方法。

  1. 使用tf.summary.FileWriter("./logs/nn_logs", sess.graph)来在python文件中记录图模型日志。

 

 

  1. train_op = tf.train.RMSPropOptimizer(0.001, 0.9).minimize(cost)

使用tensorflow提供的优化器进行神经网络优化。该方法使用一种自适应学习率的方法来优化神经网络,其学习率0.001,向量项为0.9.

sess.run(train_op, feed_dict={X: trX[start:end], Y: trY[start:end],
                              p_keep_conv: 0.8, p_keep_hidden: 0.5})

而后使用sess.run对该operation启动,完成一次网络优化。

training_batch = zip(range(0, len(trX), batch_size),range(batch_size, len(trX)+1, batch_size))
for start, end in tqdm(training_batch):

将这个过程置于每个数据批次中,遍历整个数据集。

test_indices = test_indices[0:test_size]
print(i, np.mean(np.argmax(teY[test_indices], axis=1) ==
                 sess.run(predict_op, feed_dict={X: teX[test_indices],
                                                 Y: teY[test_indices],
                                                 p_keep_conv: 1.0,
                                                 p_keep_hidden: 1.0})))

完成后测试其正确率。

  1. 最后,tqdm真是个好东西。