沉思语录

取次花丛懒回顾,半缘修道半缘君


  • 首页

  • 归档

  • 标签

  • 搜索

python调用命令行脚本

发表于 2017-07-19 |

阻塞态调用和非阻塞态调用,这两个名字是自己根据调用的特点给区分的。
两者主要的区别在于是否会另外开辟一个子进程去调用这些命令行的脚本。在所谓的阻塞态调用下,python会等待这个脚本执行完毕再顺序往下执行其它的程序。
在所谓的非阻塞态调用下,python则会开辟一个子进程,将脚本放在子进程里面执行,自己则立刻向下运行。

阻塞态调用

使用os模块,主要涉及到popen和system两种方法。
这两种方法的区别参考一下链接
os.system(cmd) 返回的是程序运行的结果状态,比如程序运行成功,则返回0,有错误则返回其对应的错误代码
os.popen(cmd) 返回的是程序输出的结果,比如cmd=“ls”的时候,通过popen就可以得到ls的结果

1
2
3
cmd = "echo hello wolrd"
ret = os.popen(cmd)
information = os.system(cmd)

非阻塞态调用

非阻塞态调用主要用到了subprocess 这个模块
简单的用法就用subprocess.call(cmd)就可以了
更高级复杂的用法可以使用subprocess.popen(cmd)
比如说有时候因为环境变量的配置我们需要在特点的目录下执行脚本,就可以使用subprocess.popen的cwd参数,要配置环境变量而不是继承原有的环境变量可以使用env参数

1
2
3
workingDirector = r"C:/testcode"
cmd = r"test.bat"
subprocess.popen(cmd,cwd=workingDirector)

卷积神经网络(CNN)

发表于 2017-07-15 |

介绍

  • 卷积核: 用来和图像做卷积运算的小矩阵
  • stride 步长:每一次卷积运算之后,卷积核沿着图像移动的像素点的长度
  • Padding: 在图像边沿位置做卷积运算时,需要补充的像素点,一般像素点值补0就可以

步骤

  1. 图像卷积(将特征值平均化,提取特征值),根据需要 可以/不 将图像padding补0,定义一个需要的卷积核(如果定义多个不同的卷积核,每一个卷积核可以对应于一个图像的通道(ex. rgb/hsv 三个通道),卷积和池化之后就可以得到不同的通道对应的新的图像
  2. 池化(降采样,减少图像运算的像素点的个数),con-max-pooling 就是取一片区域当中的最大值,对每一个通道都进行池化操作
    1,2步骤可以重复多次
    最后将图像的每一个通道都flattern(展开成一维数组),每一个通道都作为一个输入量,输入到全连接的前馈神经网络中进行训练(一般在网络中会对不同通道的值进行融合)

CNN用于手写数字识别

整个项目的框架如下图所示:
项目框架
通过摄像头捕获手写数字,输入到计算机中,运行手写数字算法,将识别结果通过无线设备发送到智能硬件
算法的框图入如下图所示
算法框图
整个神经网络共包含了5层(除去第一层输入层)
其中包含了二层卷积层、一层全连接层、一层dropout层以及一层的输出层
在每一层的卷积层中,每一个卷积操作,定义stride为1,Padding补充为0;每一个池化操作,都使用2x2的矩阵块中取出最大值

第一层神经网络

第一个卷积层

定义了32个通道(对应了32个卷积核),每一个卷积核是5x5的矩阵块

1
2
3
4
# First convolutional layer - maps one grayscale image to 32 feature maps.
W_conv1 = weight_variable([5, 5, 1, 32])
b_conv1 = bias_variable([32])
h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)

其中weight_variable([5, 5, 1, 32])
前两个参数对应了卷积核的大小,第三个参数是输入的通道数(原始为灰度图像1个通道),第四个参数为输出的通道数
最后用卷积后的结果作为relu神经元的构造函数,神经元里面定义了对应的激活函数

阅读全文 »

手写数字识别

发表于 2017-07-06 |

前言

这几日,作息回到了早睡早醒,每天就花些时间去读书、去摄影、去锻炼以及做那些在WaitingList里躺了很久的有趣的事。
老板出差在美国,工作显得并不是那么忙碌,就在每天下班后抽出几个小时的时间去做了个手写数字识别的项目。主要涉及的技术包括了:机器视觉、深度学习(人工神经网络),当然相关的编程语言也是不可少的。

深度学习

就像hello world是每一个码农写的第一行代码,手写数字识别也是每一个想进入人工智能领域的人必上的第一课。
深度学习的框架很多,比如我司的caffe,但是由于最近实在对C++无感,所以本文采用了tensorflow,这个google大法开源的python框架。如果官网访问有难度,请自觉科学上网。
训练的数据集来自Yann LeCun’s website
训练模型我采用了最简单的softmax,因为急于先将整个流程走通,这个模型最后的测试集合的识别率只有92%。很槽糕,对不对,但是没关系以后还可以慢慢优化,:)希望可以说到做到。
训练过程用了梯度下降法去优化模型参数,大约300圈,识别率就打到了90%左右,后面的迭代基本就是不断的出现过拟合和修正过拟合问题。在训练结束之后可以保存训练模型:

1
2
3
saver = tf.train.Saver()
save_path = "./model/model.ckpt"
saver.save(sess, save_path)

以后在inference阶段,就可以直接提出这个模型和训练好的参数

1
2
3
saver = tf.train.Saver([W, b])
sess = tf.Session()
saver.restore(sess, "./model/model.ckpt")

有没有觉得这个过程很简单,哈哈,那是因为我对这个算法也是一知半解,也失去了少年时推导出数学公式时的欣喜。

阅读全文 »
1…212223…28
Leslie

Leslie

记录心情与能力的成长

82 日志
15 标签
© 2021 Leslie
由 Hexo 强力驱动
主题 - NexT.Pisces
本站访客数 本站总访问量