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

手写数字识别: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

微擎:小程序上传图片重定向问题

调用wx.uploadFile总是返回如下代码

<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0">
    </head>
    <body>
        <script type="text/javascript">
            var ua = navigator.userAgent.toLowerCase();
            var isWeixin = ua.indexOf('micromessenger') != -1;
            var isAndroid = ua.indexOf('android') != -1;
            var isIos = (ua.indexOf('iphone') != -1) || (ua.indexOf('ipad') != -1);
            if (!isWeixin) {
                document.head.innerHTML = '<title>抱歉,出错了</title><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=0"><link rel="stylesheet" type="text/css" href="https://res.wx.qq.com/open/libs/weui/0.4.1/weui.css">';
                document.body.innerHTML = '<div class="weui_msg"><div class="weui_icon_area"><i class="weui_icon_info weui_icon_msg"></i></div><div class="weui_text_area"><h4 class="weui_msg_title">请在微信客户端打开链接</h4></div></div>';
            }
        </script>
    </body>
</html>

百思不得其解,上网查询也是无果,没有办法只能看下HTTP请求包。

微信截图_20190523173447.png可以看到被302重定向了,后端上传代码里并没有重定向操作,所以查看了下标识,发现MicroMessenger。猜测应该是被微擎重定向了。

微擎源代码里有这么一段:

// 检查是否在微信中打开
public static function isMicroMessage($agent = '')
{
    $agent = self::getAgent($agent);
    if (stripos($agent, 'MicroMessenger') !== false) {
        return self::MICRO_MESSAGE_YES;
    } else {
    return self::MICRO_MESSAGE_NOT;
    }
}

会检查你的agent,如果包含MicroMessenger则会当成是在微信中打开。然后调用getOauthCodeUrl|getOauthCodeUrl去获取你的微信信息。所以会造成重定向。

修改微信开发者工具,将请求头改掉

333.png然后上传成功

微信截图_20190523173600.png

真实的环境下,一般会存在第三方存储服务商,所以不会发生这种情况。如果你要在微擎里改掉授权操作,那么很有可能出现一系列问题,所以还是建议在微擎外写一个上传接口。

微信小程序未授权与授权后关联问题的解决

微信小程序有一个授权登录,在你没有授权的时候,一般会限制访问,实际完全可以避免这种情况。观看了一些app或者应用的处理上发现了一些规律。都存在一个唯一的临时用户。

这个临时用户是体现给前端展示的,一般是一个随机名字,或者一组规律的字串。这有一个好处,当你微信小程序授权以后可以拿到这一个临时的字符串,然后与你的授权信息去做匹配。app的道理等同。


微信小程序的相关文档

屏幕快照 2019-05-18 下午11.25.53.png

清理策略里有写,只有在代码包被清理的时候本地缓存才会清理。也就是说,除去代码清理以外,你完全可以使用这几个函数来做本地的临时用户存储。