2018年7月10日 下午3:56
OpenCV图像处理
2018年7月9日 上午10:34
打卡:
2018年8月16日 下午4:48 hog后面没有看完
2018年8月17日 下午3:13 hog一懂,hog+SVM就很简单了
别人的笔记:
OpenCV+TensorFlow 入门人工智能图像处理 - 连载 - 简书
Python下opencv使用笔记 我爱智能 - CSDN博客
2019年1月22日 下午1:14
课程详细内容博客
自己的笔记:
其他
全连接层的作用意义+扩展深度学习的深度和宽度
没有激活函数的单层感知机就是一个线性函数
对于卷积神经网络中全连接层的理解(有错)-2~n的全连接层
如何使用TensorFlow实现卷积神经网络(参数理解)-卷积网络如果整体看成一个函数之后的参数-第一层全连接层-softmax
卷积神经网络中每层矩阵维度变化
CNN手写数字识别
Mac OS X下修复Reason: image not found - 简书
KNN最近邻域识别手写数字
张志华
Adaboost算法原理的过程中不在害怕公式-adaboost
为啥同样是HOG算法,但是效果天壤之别-特征工程的重要性
HOG特征
机器学习本身的核心难点-机器学习的难点
使用机器学习(分类)的关键点
机器学习和深度学习的区别
图像处理中滤波(filtering)与卷积(convolution)
Matplotlib的子图subplot的使用
归一化概念-归一化
如何看懂照片的直方图? - 知乎
浮雕效果&油画效果
reshep()的理解
彩色转灰度的优化计算
边缘检测中的梯度
有趣的6种图片灰度转换算法
图像处理的两种思路
warpAffine(仿射)和双线性插值
安装tensorflow和OpenCV
对SVM的再次理解
2018年7月9日 上午10:17

- 右上角的X1-X2=0,就是这句话就是SVM的核心思想:通过带入X1-X2=0这个式子,根据结果是否大于0,来区分两个类别。这个数学技巧可以说是初中就应该会,但是当我去思考X1-X2=0能否起到作用的时候,我并没有直接理解这个初中的数学知识,这也就再次证明了机器学习中的数学并不一定必须是高等数学,简单的数学也可以起到很大的作用。
- 上面说的内容,在发明这个算法的过程中只是一个idea的产生,这是产生研究的第二个阶段:提出解决问题的方法。
- 在第三个阶段中:要实现上面提出的方法,也就是说要找到X1-X2=0,这个式子,在这个过程中我们还要利用数学工具进行分析,利用数学中的理论去求出这个式子。
论文阅读
2018年7月9日 下午5:19
安装tensorflow和OpenCV
2018年7月9日 下午4:05
方式一:通过Navigator创建穿件,失败


点击launch jupyter之后,启动报错。
注:我不知道原因和如何解决
方式二:通过命令行的方式进行创建环境和安装包 成功
- 当我们通过conda安装多个环境时,如何在各个环境中进行切换?
source activate ***(自己起的环境名)- 判断切换成功
python --version - 使用Anaconda管理多个版本的Python环境_百度经验
- 【Anaconda】conda环境管理和包管理 - CSDN博客
1
2
3
4
5
6
7localhost:~ czh$ source activate python36
(python36) localhost:~ czh$ python -V
Python 3.6.4 :: Anaconda, Inc.
(python36) localhost:~ czh$ source activate root
(root) localhost:~ czh$ python -V
Python 3.6.3 :: Anaconda custom (x86_64)
(root) localhost:~ czh$
- 创建环境的python36环境的操作
- 如何使用国内的源?
- 用pip安装tensorflow换成国内源快速安装 - CSDN博客
pip install --index-url https://pypi.douban.com/simple tensorflow
- 启动jupytor notebook

- 通过launch键来启动,可以直接打开浏览器
- 安装tensorflow和openCV的过程。
注:我们的操作命令要切换到python36下,切换方式open Terminal,出现(/Users/czh/anaconda3/envs/python36)
1 | (/Users/czh/anaconda3/envs/python36) pip install --index-url https://pypi.douban.com/simple tensorflow |

1 | (/Users/czh/anaconda3/envs/python36) pip install --index-url https://pypi.douban.com/simple opencv-python |

关于JDK层中代码的一点认识
2018年7月8日 下午9:20
慕课网实战·高并发探索(十):HashMap与ConcurrentHashMap - CSDN博客
- 这篇文章中讲了HashMap与ConcurrentHashMap在JDK中实现的原理,我觉得我理解起来有困难
- 困难的原因是JDK中实现的原理就像是我学某个算法原理一样,算法就有好多技巧,尤其是数学技巧,它并不是指啥高等数学的知识,就是初中高中的那些数学中也产生出了很多运算的技巧。
J.U.C知识点脉络图
2018年7月8日 下午9:19

线程池
2018年7月8日 下午9:08
慕课网实战·高并发探索(十四):线程池 Executor - CSDN博客
- 使用起来那么简单,学习线程池主要是学啥?
- 用是可以用,关键是根据具体的实际情况调配不同的参数
- 就像是不同的病人,即使是相同的病症,我们医生也要根据病人来配不同的药,因人而异
- 我只是知道这个方向,但是我还是一个医生学徒,这个需要经验的积累。
- 线程池的好处?
- 重用存在的线程,减少对象创建、消亡的开销,性能好
- 可有效控制最大并发线程数,提高系统资源利用率,同时可以避免过多资源竞争,避免阻塞。
- 提供定时执行、定期执行、单线程、并发数控制等功能。
- ThreadPoolExecutor的七个参数
- corePoolSize:核心线程数量
- maximumPoolSize:线程最大线程数
- workQueue:阻塞队列,存储等待执行的任务,很重要,会对线程池运行过程产生重大影响
- keepAliveTime:线程没有任务执行时最多保持多久时间终止(当线程中的线程数量大于corePoolSize的时候,如果这时没有新的任务提交核心线程外的线程不会立即销毁,而是等待,直到超过keepAliveTime)
- unit:keepAliveTime的时间单位
- threadFactory:线程工厂,用来创建线程,有一个默认的工场来创建线程,这样新创建出来的线程有相同的优先级,是非守护线程、设置好了名称)
- rejectHandler:当拒绝处理任务时(阻塞队列满)的策略(AbortPolicy默认策略直接抛出异常、CallerRunsPolicy用调用者所在的线程执行任务、DiscardOldestPolicy丢弃队列中最靠前的任务并执行当前任务、DiscardPolicy直接丢弃当前任务)
- Executor可以创建四种线程池
- 分别对应上边提到的四种线程池初始化方法
- Executors.newCachedThreadPool
- 创建一个可缓存的线程池,如果线程池的长度超过了处理的需要,可以灵活回收空闲线程。如果没有可回收的就新建线程。
- newFixedThreadPool
- 定长线程池,可以线程现成的最大并发数,超出在队列等待
- newSingleThreadExecutor
- 单线程化的线程池,用唯一的一个共用线程执行任务,保证所有任务按指定顺序执行(FIFO、优先级…)
- newScheduledThreadPool
- 定长线程池,支持定时和周期任务执行
组件FutureTask、ForkJoin、BlockingQueue
2018年7月8日 下午4:54
慕课网实战·高并发探索(十三):并发容器J.U.C — 组件FutureTask、ForkJoin、BlockingQueue - CSDN博客
- Runnable与Callable对比
- 通常实现一个线程我们会使用继承Thread的方式或者实现Runnable接口,这两种方式有一个共同的缺陷就是在执行完任务之后无法获取执行结果。从Java1.5之后就提供了Callable与Future,这两个接口就可以实现获取任务执行结果
- ForkJoin是啥
- ForkJoin是Java7提供的一个并行执行任务的框架,是把大任务分割成若干个小任务,待小任务完成后将结果汇总成大任务结果的框架。
- Fork:把大任务分割成若干个小任务
- Join:待小任务完成后将结果汇总成大任务结果
- BlockingQueue阻塞队列应用场景?
- 主要应用场景:生产者消费者模型,是线程安全的
AQS相关重点
2018年7月8日 下午3:53
慕课网实战·高并发探索(十一):并发容器J.U.C — AQS组件CountDownLatch、Semaphore、CyclicBarrier - CSDN博客
慕课网实战·高并发探索(十二):并发容器J.U.C — AQS组件 锁:ReentrantLock、ReentrantReadWriteLock、StempedLock - CSDN博客
AQS?
- AQS全名:AbstractQueuedSynchronizer,是并发容器J.U.C(java.lang.concurrent)下locks包内的一个类。它实现了一个FIFO(FirstIn、FisrtOut先进先出)的队列。底层实现的数据结构是一个双向链表。
- Sync queue:同步队列,是一个双向链表。包括head节点和tail节点。head节点主要用作后续的调度。
- Condition queue:非必须,单向列表。当程序中存在cindition的时候才会存在此列表。
AQS的大致实现思路?
- AQS内部维护了一个CLH队列来管理锁。线程会首先尝试获取锁,如果失败就将当前线程及等待状态等信息包装成一个node节点加入到同步队列sync queue里。
- 接着会不断的循环尝试获取锁,条件是当前节点为head的直接后继才会尝试。如果失败就会阻塞自己直到自己被唤醒。而当持有锁的线程释放锁的时候,会唤醒队列中的后继线程。
CountDownLatch, CyclicBarrier都可以用一个情节理解
- 当我们遇到计算量超大的数据时,我们可以让多个线程分别执行其中一部分的值,当各个线程都执行完之后,我们把各个线程的最后结果进行相加,从而得到最后的效果
- CountDownLatch,CyclicBarrier两种的代码写法可能不同,但是作用是类似的。
CountDownLatch, CyclicBarrier的不同?
- 计数器可重复用
- 描述一个或多个线程等待其他线程的关系/多个线程相互等待
ReentrantLock和Condition就用这个情节理解

票据锁:StempedLock看这个就行。

