机器学习笔记(1)
- 如果特征和结果之间满足线性关系,那么我们可以用线性函数去对这个关系进行拟合。通常使用形如y = w*x+b的多项式。我们需要评估评估拟合的好坏,使用损失函数。通常使用平方和。因为误差通常满足高斯分布,而我们希望模型在全部样本上预测最准,即概率积最大,于是采用最大似然估计的方法对它进行求导得到平方和的表达式。我们通常使用梯度下降的方法寻找最优的w和b。因为这是一个凸优化问题,只有一个极小值,因此必然可以找到最小值。我们将loss函数对参数求偏导,然后将参数向梯度下降的方向修改,导数越大修改越大,收敛后得到最优参数。如果我们将这样一个线性回归结果映射到一个区间上,并定义某个区间是一个分类问题的某一个,则得到逻辑回归。逻辑回归经常使用sigmoid函数做映射,因此逻辑回归通常适用二分类问题。使用不同的**函数如softmax可应用到多分类问题。神经元就是这样的具有逻辑回归功能的单元,许多神经元叠加构成神经网络。
- 常用的**函数有:sigmoid函数,它可以用来做二分类,而且在定义域上可导。
Relu函数:它广泛应用于神经网络,很容易求导,缺点在于0处不可导。
- 感知器模型输入向量x,为每一维赋予权重w,求和后添加偏置b,再使用**函数映射到特定区域。V= i=1mwixi+b
,例如使用**函数y = ǿ(v) = 1,if 1>0-1,otherwise
- Tensorflow:系统架构:(网络调用,cpu,gpu)(nn)(分布式,数据处理)(c API)(python代理,c++代理)(接口库)。Tensorflow的数据流图比较复杂,需要专门的生成工具。边:实线-数据依赖,张量。虚线-控制依赖,操作的次序。节点:一个操作,每一个操作都有其实现源码。定义边和节点,构建一个图。其定义是任意的,称之为符号式编程。Tensorflow通过session抽象与图进行交互。调用session.run传入tensor作为参数,启动图,并返回result。使用device指定设备。Tensorflow中的variable用于维护图执行过程中的一些状态信息。
- 逻辑回归是一个一层的神经网络,使用softmax
感知机是一个单层的神经网络,经一层直接输出结果
- 卷积神经网络要素:卷积是一种数学运算。卷积核一般是3x3的。卷积核的参数通过学习得到,在不同的位置使用同一个卷积核成为参数共享。边缘卷积核-滤波器。池化是一种汇合操作,包括最大池化,平均池化等。其功能是降采样。引入**函数增加网络的表达能力。全连接层起到分类器的作用。卷积层,池化层,**函数将原始数据映射到隐层特征空间,全连接层映射到标记空间。对于一层,一个滤波器能提取一种特征,但是一层怎么能只使用一种滤波器呢?使用很多滤波器,一个通道就产生了很多通道,成为特征图。对应pytorch中的out_channnels.
- 在代码中使用tf.summary.histogram,tf.summary.scalar,tf.summary.filewriter,等方法来使用记录日志以使用tensorboard。在cmd中输入tensorboard –logdir=文件夹路径。在浏览器中浏览cmd中给出的地址,端口6006。在浏览器中查看cost,accuracy,graphs,distributions,histograms等。
- 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的一个简化版本。
- 假设我们的样本满足正态分布,求取一个点在这个类别中的概率。当我们有很多类时,某个样本在每一个类中都具有一个概率,我们取最大的那个可能性。
- Mnist数据集包含60000训练集,10000测试集。在tensorflow提供的读取mnist数据集的方法中,其灰度图像被归一化。
- 在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返回最大值索引即预测值,并与实际标签进行比较以计算正确率。
- 我们定义:
O=输出图像的尺寸
I=输入图像的尺寸
K=卷积层的核尺寸
N=核数量
S = 移动步长
P = 填充数
经过卷积层和池化层,输出尺寸经下面这个公式计算:
O=I-K+2Ps+1
实际使用这个公式时要注意灵活变化,一个是padding,再tensorflow和pytorch中具有不同的padding方式。Pytorch的默认方式相当于tensorflow的valid方式。第二要注意在不满足整除时框架的处理方法。
- 使用tf.summary.FileWriter("./logs/nn_logs", sess.graph)来在python文件中记录图模型日志。
- 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})))
完成后测试其正确率。
- 最后,tqdm真是个好东西。