Python
人生苦短,我用Python。

手写数字识别-训练数据处理

手写数字识别:MNIST,主要是说一下训练数据的制作,后面我打算写的一个识别模型虽然不是数字识别,不过也大同小异,网上的训练数据都是套的MNIST,自己制作的很少,文章也很少,没办法只能去看MNIST的说明,学习它的写法,毕竟它已然是一个“标准”。

一般例子的训练数据都是从http://yann.lecun.com/exdb/mnist/获取的,训练数据的格式是MNIST数据库的文件格式,用来存储矢量和多维矩阵。这个存储格式的具体文件说明如图

微信截图_20190603175718.png

如果你学过一些文件结构的话,应该会很好理解,主要是注意16个字节以后的pixel,这个是图片库,每隔28*28个像素就是一个新图,因为他是28*28像素的一个训练数据,所以每隔28*28就是另外一张图,这个数据是一个像素点,如果非要抽象的理解的话,你可以理解为图片的RGB,只不过这张图被处理过。怎么处理的,我的理解:RGB图-》灰度图-》二值图 不保证正确性!!!然后我写了两个例子来证实了一下,我提取的是训练数据train-images.idx3-ubyte的第一张图的28*28个字节。因为将像素点存储到二进制文件里面是字节方法,原先的模数转换器(ADC)拍照成像的时候因为是8位所以是2的8次方,正好是255,可以被1个字节存储。

下面展示的分别是图片转MNIST数据库的文件格式和MNIST数据库的文件格式转图片


博主也在学习的海洋里狗刨中...内容如有错误还请指出...


代码(易语言):iwonmo.rar


python 豆瓣爬虫

一会要坐火车,想看一下高分的电影,打发时间。所以写了一个抓取工具。

'''
 **
 * 查找分数大于8.5分的动作电影.
 * User: iwonmo
 * Date: 2019/5/24
 * Time: 15:53
 *
'''
#!/usr/bin/python
# coding:utf-8
import urllib.request
import re
import demjson
#计数
n = 0
#错误判断
err = 0
# 读取网页源码
def getHtml(url):
    page = urllib.request.urlopen(url)
    return page.read()
 
#主要功能逻辑
def showList(url):
    global  n
    html = getHtml(url)
    if html.decode() == "[]" : #出错了
        err = 1
        return    
    html = demjson.decode(html);
    for _each in html:
        # title  score url release_date
        if float(_each['score']) > 8.8 : #寻找大于此分的电影
            _release_date = _each['release_date']
            _title = _each['title']
            _score = _each['score']
            n += 1
            print(_release_date,_title,_score)
            
#入口函数    
def main():
    global  n
    for num in range(1,3000):
        if n > 10000 or err == 1: #10000部后退出或者出错后退出
            break
        if num == 1:
            url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start='+str(num)+'&limit=20'
            showList(url);
        else:
            url = 'https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start='+str((num-1)*20)+'&limit=20'
            showList(url);
    print("总数:%d" % n);
    
if __name__ == '__main__':
    main()


结果几乎都是老电影,还在继续爬。。。

微信截图_20190524155720.png

查询的地址:https://movie.douban.com/chart 点击右侧分类,查看Network

Python 开发之旅 (7)指点迷津 之 注释

前面写的代码只有几行。阅读起来比较简单。随着知识的积累,自己写的代码也会越来越多,会出现一个不可避免的问题:时间久了不知道写的是什么

例如


hight.png


看着满屏的代码阅读起来也是比较困难的,这时候就需要一些注释,来标注我们代码的意思。这样下次引用可以很直接的进行使用。

在Python有三种注释形式:单行注释多行注释文档注释


单行注释



def add(a,b): #相加函数
    return a+b
print("%d"%(add(3,2)))


单行注释(#):在行代码的位置加入##号后面的所有语句都会被解释器理解为注释,从而不执行。


多行注释


def add(a,b):
    '''
        a:相加数
        b:相加数
    '''
    return a+b
print("%d"%(add(3,2)))


多行注释('''xxx'''):3个单引号开始,3个单引号结束 或者 3个双引号开始,3个双引号结束。


文档注释


#coding=gbk
def add(a,b):
    '''
        a:相加数
        b:相加数
    '''
    return a+b
print("%d"%(add(3,2)))


文档注释(#coding=编码格式):注意文档注释要写在文档的开头。生成什么编码格式最后存储的时候也会变成相对应的编码形式。


Python 开发之旅 (6)urllib 之 网络请求

上一节我们知道了如何去引用python自带的库:from ctypes import *  


通过上述代码我们可以在自身的py代码里引用ctypes的导出函数,这一节我们换一个自带的库:urllib.request


看名知意,大致可以了解到这是一个URL的请求库。可以实现一些网络请求。例如:获取网页的源码。


大致说一些网络请求:用户 -> 协议 -> 服务器服务器 -> 找内容 -> 用户


    用户通过相关协议去通知服务器,让服务器返回相关内容给用户。用户在加以显示。如果是通过浏览器进行网络访问。那么这个访问的方式就是协议。这个协议就是http get协议。然后服务器通过协议里面包含的内容,去找对应存储在服务器上的内容返回给浏览器。浏览器接收到内容进行解析。这样就形成了一个网页的显示过程。所以有的时候我们获取的源码是一些字符串,那是因为我们没有进行相关的界面解析绘制。


在python里获取网页源码用如下代码


from urllib.request import *  
f = urlopen('http://www.iwonmo.com')
print(f.read().decode('utf-8'))


url.png


第一行:加载库文件。

第二行:调用urlopen方法

第三行:通过f对象,调用里面的read方法然后进行utf-8转码


f:无类型变量,具体的类型看返回的值。


实际效果:


read.png

Python 开发之旅 (5)取长补短 之 库

不论我们承不承认,我们不是万能的。


Ctypes 是Python的一个外部库,通过使用这个外部库,我们可以进行一些其它的操作例如:调用其它库。


如何正确的理解库:

库是一系列代码的集合,它导出了一些公共的函数。



还记得Print?它是一个格式化输出函数。但是它只能在IDLE里面进行输出。并不能在标准的输入输出环境下进行输出。于是我们只能去调用Printf这个函数进行输出操作。但是Printf又是封装在msvcrt.dll动态链接库里的。所以我们首先要引用这个库,然后才能去调用里面的导出函数。


代码如下:

from ctypes import *   
h=CDLL("msvcrt.dll")
h.printf(b"Link:http://www.iwonmo.com")


py.png



F5运行会发现IDLE里面什么都没有输出。这就是因为printf只能在标准的输入输出环境下进行显示。可以直接用cmd进行操作。


进入Python的安装目录输入:python xxx.py 就可以显示了


cmd.png



引用第三方库

from ctypes import *
func=cdll.LoadLibrary("mac.dll")
ret=func.getNumber()
ret = string_at(ret, -1)
print(ret.decode('utf-8'))