zoukankan      html  css  js  c++  java
  • 基于Theano的DNN框架Blocks使用简要总结

    Blocks官方代码地址:https://github.com/mila-udem/blocks

    Blocks是加拿大Montreal大学Bengio实验室牵头开发的基于Python的神经网络模型框架,可方便地在大规模数据上进行复杂神经 网络模型的训练。它包含有很多外置工具包如,logging, monitoring, visualization, and serialization,而Fuel则提供了数据格式的标准化。

    Fuel官方代码地址:https://github.com/mila-udem/fuel

    由于Blocks仍在进一步开发中,以下说明中遇到的错误可能已被修复,因而只可作为参考[注:当前时间2016/03/01]。

    1. 安装Blocks和Fuel:
    安装git,git的安装和使用可参考[Bitbucket-团队开发私有库使用指南, http://jacoxu.com/?p=1611]
    接下来安装blocks,由于需要通过github下载,进入git bash,输入:
    pip install git+git://github.com/mila-udem/blocks.git
    -r https://raw.githubusercontent.com/mila-udem/blocks/master/requirements.txt
    注:a). 实际运行中,可修改一下requirements.txt文件中所定义的库,如numpy等在安装ANACOND的时候都已经安装,那么可以删除掉requirements.txt文件中对应依赖行。
    b). 若执行过程中有错误可能会导致blocks没有正常安装,则需要重新执行一下
    pip install git+git://github.com/mila-udem/blocks.git
    若安装成功则在c:anaconda2libsite-packages 目录下可以看到和blocks及fuel相关的4个文件夹,并且在在python模式下执行如下两行命令,不报错即可:
    from blocks.bricks import Tanh
    from fuel.datasets import MNIST
    说明Blocks和Fuel已经可以正常调用。

    2. 利用Fuel下载数据集
    Fuel工具提供了数据格式的转换,示例代码中提供了几种常用的公开数据集进行下载,包括:
    iris, caltech101_silhouettes, svhn, cifar10, binarized_mnist, adult, cifar100, mnist 八种,需要自己利用工具进行下载
    首先需要配置数据存储路径,配置示例如:
    # ~/.fuelrc
    data_path: “d:/jacoxu/casia/data”

    $ export FUEL_DATA_PATH=” d:/jacoxu/casia/data”

    进入该路径进行下载和格式转换,具体操作见官方文档说明:

    https://fuel.readthedocs.org/en/latest/built_in_datasets.html

    数据路径及格式配置正常后可以通过fuel进行加载,如:
    >>> from fuel.datasets import MNIST
    >>> mnist = MNIST((“train”,))

    3. 示例演示-Machine Translation
    路径:https://github.com/mila-udem/blocks-examples/tree/master/machine_translation
    功能:带Attention的Machine Translation示例代码
    主函数:__main__.py
    数据集:WMT15 Czech to English corpus

    3.1 准备数据集:
    执行示例程序之前,需要先下载数据集,可很方便地运行prepare_data.py文件即可,主要包括119M的训练数据,20.4M的开发集数据及 Moses的预处理脚本和Bleu计算脚本,并将下载后的数据处理好。其中本示例实际只使用了WMT15数据中的Czech to English的数据对,那么训练语料为41.4M,开发集语料为668KB。
    然而数据下载好进行预处理时遇到如下错误:
    INFO:prepare_data:…writing tokenized file [./data ews-commentary-v10.cs-en.cs.tok]
    Traceback (most recent call last):
    File “prepare_data.py”, line 257, in
    main()
    File “prepare_data.py”, line 241, in main
    tokenize_text_files(tr_files + val_files, tokenizer_file)
    File “prepare_data.py”, line 121, in tokenize_text_files
    var, stdin=inp, stdout=out, shell=False)
    File “C:Anaconda2libsubprocess.py”, line 535, in check_call
    retcode = call(*popenargs, **kwargs)
    File “C:Anaconda2libsubprocess.py”, line 522, in call
    return Popen(*popenargs, **kwargs).wait()
    File “C:Anaconda2libsubprocess.py”, line 710, in __init__
    errread, errwrite)
    File “C:Anaconda2libsubprocess.py”, line 958, in _execute_child
    startupinfo)
    WindowsError: [Error 2]

    最后发现问题的原因在于虽然MINGW64环境中有Perl,但是由于Windows环境下缺少Perl,因而在Pycharm下进行运行时报错。 因而,Linux用户应该不会遇到此问题,另Windows用户安装一下Perl也就可以在IDE下调试了。可安装ActiveState Perl社区免费版http://www.activestate.com/activeperl/downloads,[重启电脑]。不过由于数据处理中还调用了Linux的shuf命令,因而还是建议Windows用户直接在MINGW64环境中执行preprare_data.py处理数据。

    注:Bleu的perl脚本使用方法见:http://www.statmt.org/moses/?n=Moses.SupportTools
    Perl multi-bleu.perl ref.txt, ref1.txt, ref2.txt < out.txt
    且,Bleu计算时需要最后一行空行,可以采用下面的数据验证一下,例如:
    Ref.txt共4行分别为 1 2 3 45 6,out.txt为1 2 3 3 2 1通过bleu计算得到共5行,bleu为60%
    而添加了空行之后即分别为1 2 3 456 ,out.txt为1 2 3 3 2 1 ,得到共6行,bleu为50%
    3.2 调试Machine_Translation
    1). 函数入口:__main__.py
    功能:进行配置,调用Fuel接口加载数据
    任务:a). 需要详细理解stream类,知道数据格式细节;
    2). 主函数:__init__.py
    功能:搭建模型并调用Blocks进行训练
    3). Main Loop:main_loop.py
    功能:进行模型训练
    注意:a). self.algorithm.initialize() 消耗时间好长

    Bug 1. Should be cPickle.load(open(src_vocab, ‘rb’) to avoid EOFError
    In blocks-examples/machine_translation/stream.py. I got a EOFError, and found the cause is that:
    All cPickle.load(open(src_vocab) and cPickle.load(open(trg_vocab)) should be updated to cPickle.load(open(src_vocab, ‘rb’) and cPickle.load(open(trg_vocab, ‘rb’)) to avoid EOFError.
    Bug 2. 修改./blocks/search.py中BeamSearch.compile()._compile_next_state_computer()
    其中的
    self.next_state_computer = function(
    self.contexts + self.input_states + next_outputs, next_states)
    改为:
    self.contexts + self.input_states + next_outputs, next_states, on_unused_input=’warn’)
    Google论坛上有对此问题的讨论和解释:
    https://groups.google.com/d/msg/blocks-users/94qKmXzvz0Q/2RwUZYp0t-sJ

    其他可能会遇到的问题:
    1) 数据在每个Epcoh训练之前有没有进行随机化?
    2) 测试阶段如何通过模型参数进行预测?
    有两种方式,分别是:
    a). sampling: /machine_translation/sampling.py L55 model.get_theano_function()
    b). Bleu: /blocks/search.py BeamSearch.search()

    博文出处:http://jacoxu.com/?p=1828

  • 相关阅读:
    PHP 消息队列
    Nginx 设置负载均衡
    Nginx 服务器搭建
    PHP 获取文件扩展名的五种方式
    高并发和大流量解决方案
    <面试> PHP 常见算法
    Mysql 预查询处理 事务机制
    Linux定时任务 结合PHP实现实时监控
    Swoole 结合TP5搭建文字直播平台
    <记录> PHP Redis操作类
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/5342726.html
Copyright © 2011-2022 走看看