学习深度学习与图像处理中的一些感悟(1)

缘起

四年前读研究生的时候做的方向就是图像识别,如此想来都过了很久了,但是毕业的时候都感觉没有入门。参加工作后,工作内容和图像无关了,晚上回来无聊看一看了竟然有了新的感触。更多是知道以前理解不透彻的原因。
上学时也看了很多理论的学习,有关传统图像的、数学方面推导的书的和视频,像西瓜书,李航的统计等等,还做了很多笔记,但是效果甚微,一到图像处理还是用matlab或者cv2库解决。后边反思原因,更多的是代码看太少、不熟悉框架、不注重动手实践!这三个原因其实也是阻碍我其他成果的因素。因此,从这周开始每周分享我学习到的好的代码,前期应该会比较初级,后续再慢慢深入!

#学会使用框架

做深度学习一定要利用好框架,如caffe,tensorflow,pytorch这些,要学会加速器如cuda的一些常用命令。下面展示做一个BP网络的代码。
当不使用框架时, 基于numpy库进行编写:

import numpy as np
# N是批量大小; D_in是输入维度;
# 49/5000 H是隐藏的维度; D_out是输出维度。
N, D_in, H, D_out = 64, 1000, 100, 10
# 创建随机输入和输出数据
x = np.random.randn(N, D_in)
y = np.random.randn(N, D_out)
# 随机初始化权重
w1 = np.random.randn(D_in, H)
w2 = np.random.randn(H, D_out)
learning_rate = 1e-6
for t in range(500):
# 前向传递:计算预测值y
    h = x.dot(w1)
    h_relu = np.maximum(h, 0)
    y_pred = h_relu.dot(w2)
# 计算和打印损失loss
    loss = np.square(y_pred - y).sum()
    print(t, loss)
# 反向传播,计算w1和w2对loss的梯度
    grad_y_pred = 2.0 * (y_pred - y)
    grad_w2 = h_relu.T.dot(grad_y_pred)
    grad_h_relu = grad_y_pred.dot(w2.T)
    grad_h = grad_h_relu.copy()
    grad_h[h < 0] = 0
    grad_w1 = x.T.dot(grad_h)
# 更新权重
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2

但其实这仅仅是一个简单的BP网络,如果使用pytorch框架的话就简单三行就可以实现一样的效果。

做好深度学习中理论学习

以前觉得传统图像处理和深度学习在处理过程中关系不大,但是又有很多相连的地方,例如传统图像中一些用来提取边缘的算子和深度学习中的卷积就很像;理解深度学习的关键还是要从BP神经网络入手,至少在BP维度时可以有严谨的数学推导,理解反向传播的意义;优化一个模型最关键的是需要明确自己的目标函数,例如在图像分类中就是交叉熵损失,在回归中就是对IOU系列的最大化;
今天就先讲到这里,网上的理论很多,还是多发一些自己的理解,希望可以和大家共同讨论,一块进步!

你可能感兴趣的:(python,计算机视觉,目标检测,人工智能)