flask 国际化

Flask应用国际化与本地化的实现 本文详细介绍了如何在Flask应用中实现国际化和本地化。包括翻译文件的编译、更新,以及如何利用Flask-Babel库处理不同语言的文本显示。同时,文章还提供了通过命令行增强功能来简化翻译流程的方法。 阅读详情

Flask-Babel简介

它同Jinja2的i18n扩展一样,可以翻译Jinja2模板中的内容,以及Flask代码中的文字内容。同时它还可以翻译日期格式等等。它也是基于Babel和gettext等组件实现,有着非常简单友好的API接口,便于我们使用。

安装和启用

建议通过pip安装,简单方便:

pip install Flask-Babel

我们可以采用下面的方法初始化一个Flask-Babel的实例:

from flask_babel import Babel,gettext as _
babel=Babel()
babel.init_app(app)

设置语言和时区

Flask-Babel提供了两个Flask应用配置项:

  1. BABEL_DEFAULT_LOCALE: 应用默认语言,不设置的话即为en
  2. BABEL_DEFAULT_TIMEZONE: 应用默认时区,不设置的话即为UTC
BABEL_DEFAULT_LOCALE='en'

当程序里没指定时,就会采用这些默认设置。那么如何在程序里指定呢?Flask-Babel提供了两个装饰器localeselector和timezoneselector,分别用来设置语言和时区:

@babel.localeselector
def get_locale():
    return 'zh'

@babel.timezoneselector
def get_timezone():
    return 'UTC'

这里的设置将会覆盖应用配置项中”BABEL_DEFAULT_LOCALE”和”BABEL_DEFAULT_TIMEZONE”。上面的程序不是个好例子,常见的情况是从当前用户会话中,或者从服务器环境中获取语言/时区设置。

@babel.localeselector
def get_locale():
    return request.accept_languages.best_match(app.config['LANGUAGES'])

这里我使用了Flask中request对象的属性accept_languages。 request对象提供了一个高级接口,用于处理客户端发送的带Accept-Language头部的请求。 该头部指定了客户端语言和区域设置首选项。 该头部的内容可以在浏览器的首选项页面中配置,默认情况下通常从计算机操作系统的语言设置中导入。 大多数人甚至不知道存在这样的设置,但是这是有用的,因为应用可以根据每个语言的权重,提供优选语言的列表。 为了满足你的好奇心,下面是一个复杂的Accept-Languages头部的例子:

Accept-Language: da, en-gb;q=0.8, en;q=0.7

这表示丹麦语(da)是首选语言(默认权重= 1.0),其次是英式英语(en-GB),其权重为0.8,最后是通用英语(en),权重为0.7。

要选择最佳语言,你需要将客户请求的语言列表与应用支持的语言进行比较,并使用客户端提供的权重,查找最佳语言。 这样做的逻辑有点复杂,但它已经全部封装在best_match()方法中了,该方法将应用提供的语言列表作为参数并返回最佳选择。

装饰器localeselector和timezoneselector修饰的函数,被调用一次后就会被缓存,也就是不会被多次调用。但是有时候,当切换用户时,我们想从新用户会话中重新获取语言/时区设置,此时可以在登录请求中调用refresh()方法清缓存:

from flask.ext.babel import refresh

@app.route('/login')
def login():
    ... # Get new user locale and timezone
    refresh()
    ... # Render response

在视图和模板中使用翻译

Flask-Babel封装了Python的gettext()方法,你可以在视图函数中使用它:

from flask.ext.babel import gettext, ngettext

@app.route('/trans')
@app.route('/trans/<int:num>')
def translate(num=None):
    if num is None:
        return gettext(u'No users')
    return ngettext(u'%(num)d user', u'%(num)d users', num)

关于gettext和ngettext的区别,大家可以参考下这篇文章的”单/复数支持”部分。

此外,Flask-Babel还提供了lazy_gettext()方法,它的作用同gettext()类似,区别是它在文字被使用时才会被翻译,所以可以用来在上下文环境外定义要翻译的文字,比如:

from flask.ext.babel import lazy_gettext

hello = lazy_gettext(u'Hello World')

@app.route('/lazy')
def lazy():
    return unicode(hello)

同样在模板中,我们也可以使用gettext()方法,更简单的我们可以用_()方法代替:

<!doctype html>
<title>{{ _('Test Sample') }}</title>
<h1>{{ _('Hello World!') }}</h1>

在Flask请求中,我们来渲染此模板:

@app.route('/')
def index():
    return render_template('hello.html')

现在让我们启动应用,访问上面的视图,验证下程序是否正常运行。大家应该可以看到gettext()方法里的文字被显示出来了,目前还没有被翻译。

创建本地化翻译文件

在介绍Jinja2模板的i18n扩展时,我们曾使用Python源码中的”pygettext.py”来创建翻译文件。这里,我们用个更方便的,就是Babel中的”pybabel”命令。有多个语言就重复多次,步骤如下:

  • 首先让我们创建一个Babel的配置文件,文件名任意,这里我们取名为”babel.cfg”

    [python: **.py]
    [jinja2: **/templates/**.html]
    extensions=jinja2.ext.autoescape,jinja2.ext.with_,webassets.ext.jinja2.AssetsExtension

这个文件告诉”pybabel”要从当前目录及其子目录下所有的*.py文件,和templates目录及其子目录下所有的*.html文件里面搜寻可翻译的文字,即所有调用gettext(),ngettext()和_()方法时传入的字符串。同时它告诉”pybabel”,当前Jinja2模板启用了”autoescape”和”with”扩展。

  • 接下来,在当前目录下,生成一个名为”messages.pot”的翻译文件模板

    pybabel extract -F babel.cfg -o messages.pot .

    打开”messages.pot”,你会发现,上例中”No users”, “Test Sample”等文字都出现在msgid项中了,很强大吧。

    • 参数-F指定了Babel配置文件;
    • 参数-o指定了输出文件名。
    • 如果你在程序中用到了lazy_gettext()方法,那么你需要加上参数-k lazy_gettext来提醒”pybabel”要搜索该方法的调用:

      pybabel extract -F babel.cfg -k lazy_gettext -o messages.pot .
      
  • 修改翻译文件模板
    首先记得将”messages.pot”中的#, fuzzy注释去掉,有这个注释在,将无法编译po文件。然后修改里面的项目信息内容如作者,版本等。

  • 创建”.po”翻译文件

    pybabel init -i messages.pot -d translations -l zh
    

    上面的命令就可以创建一个中文的po翻译文件了,文件会保存在当前目录下的”translations/zh/LC_MESSAGES”下,文件名为”messages.po”。 

生成的文件名要和.po文件对应和一致 否则会出错导致翻译不准确

    • 参数-d指定了翻译文件存放的子目录,上例中我们放在”translations”子目录下;
    • 参数-l指定了翻译的语言,同样也是第二级子目录的名称”zh”。
  • 编辑”.po”翻译文件
    打开刚才生成的中文po翻译文件,将我们要翻译的内容写入msgstr项中,并保存:

    #: flask-ext3.py:31
    msgid "No users"
    msgstr "没有用户"
    
    #: flask-ext3.py:32
    msgid "%(num)d user"
    msgid_plural "%(num)d users"
    msgstr[0] "%(num)d个用户"
    
    #: templates/hello.html:2
    msgid "Test Sample"
    msgstr "测试范例"
    
    #: templates/hello.html:3
    msgid "Hello World!"
    msgstr "世界,你好!"
    
  • 最后一步,编译po文件,并生成*.mo文件

    pybabel compile -d translations

-d指定了翻译文件存放的子目录。该命令执行后,”translations”目录下的所有po文件都会被编译成mo文件。

如果我们当前的语言”locale”已经设置为zh了,再次启动应用,访问根视图或者”/trans”视图,你会看到我们的文字都已经是中文的了。

之后,如果代码中的待翻译的文字被更改过,我们需要重新生成”messages.pot”翻译文件模板。此时,要是再通过pybabel init命令来创建po文件的话,会丢失之前已翻译好的内容,这个损失是很大的,其实我们可以通过下面的方法来更新po文件:

pybabel update -i messages.pot -d translations

-i和-d参数就不用再解释了。执行pybabel update后,原先的翻译会被保留。不过要注意,因为有些字条”pybabel”无法确定,会将其标为”fuzzy”,你要将”fuzzy”注释去掉才能使其起效。

  • 最后的最后,提醒下大家,translations目录必须是跟你Flask的app应用对象在同一目录下,如果你的app对象是放在某个包里,那translations目录也必须放在那个包下。

格式化日期

Flask-Babel不仅可以翻译文字,还可以自动翻译日期格式,运行下面的例子:

from flask.ext.babel import format_datetime
from datetime import datetime

@app.route('/now')
def current_time():
    return format_datetime(datetime.now())

假设当前系统时间是”2016-3-20 11:38:32”,在”locale”是en的情况下,会显示”Mar 20, 2016, 11:39:59 AM”;而在”locale”是zh的情况下,会显示”2016年3月20日 上午11:38:32”。

format_datetime()方法还可以带第二个参数指定输出格式,如”full”, “short”, “yyyy-MM-dd”等。详细的日期输出格式可参阅Babel的官方文档。

格式化数字

Flask-Babel提供了format_number和format_decimal方法来格式化数字,使用方法同上例中的format_datetime非常类似,只需传入待格式化的数字即可:

from flask.ext.babel import format_decimal

@app.route('/num')
def get_num():
    return format_decimal(1234567.89)

上面的数字,在”locale”是en的情况下,会显示”1,234,567.90”;而在”locale”是de的情况下,会显示”1.234.567,89”。

格式化货币

既然可以格式化数字,自然也少不了货币格式化显示的功能了。我们可以使用format_currency方法,它同format_decimal的区别是它必须传入两个参数,第二个参数指定了货币类型:

from flask.ext.babel import format_currency

@app.route('/currency')
def currency():
    return format_currency(1234.5, 'CNY')

上面的数字”1234.5”,在类型(即第二个参数)是CNY的情况下,会显示”¥1,234.50”;而在类型是USD的情况下,会显示”US$1,234.50”。

Flask-Babel还提供了格式化百分数format_percent,和格式化科学计数format_scientific的方法,这里就不一一介绍了。

命令行增强

pybabel命令有点长,难以记忆。 利用这个机会向你展示如何创建与flask命令集成的自定义命令。 到目前为止,你已经看到我使用Flask-Migrate扩展提供的flask run、flask shell和几个flask db子命令。 将应用特定的命令添加到flask实际上也很容易。 所以我现在要做的就是创建一些简单的命令,并用这个应用特有的参数触发pybabel命令。 我要添加的命令是:

  • flask translate init LANG用于添加新语言
  • flask translate update用于更新所有语言存储库
  • flask translate compile用于编译所有语言存储库

babel export步骤不会设置为一个命令,因为生成messages.pot文件始终是运行init或update命令的先决条件,因此这些命令的执行将会生成翻译模板文件作为临时文件。

Flask依赖Click进行所有命令行操作。 像translate这样的命令是几个子命令的根,它们是通过app.cli.group()装饰器创建的。 我将把这些命令放在一个名为app/cli.py的新模块中:

app/cli.py:翻译命令组

from app import app

@app.cli.group()
def translate():
    """Translation and localization commands."""
    pass

该命令的名称来自被装饰函数的名称,并且帮助消息来自文档字符串。 由于这是一个父命令,它的存在只为子命令提供基础,函数本身不需要执行任何操作。

update和compile很容易实现,因为它们没有任何参数:

app/cli.py:更新子命令和编译子命令:

import os

# ...

@translate.command()
def update():
    """Update all languages."""
    if os.system('pybabel extract -F babel.cfg -k _l -o messages.pot .'):
        raise RuntimeError('extract command failed')
    if os.system('pybabel update -i messages.pot -d app/translations'):
        raise RuntimeError('update command failed')
    os.remove('messages.pot')

@translate.command()
def compile():
    """Compile all languages."""
    if os.system('pybabel compile -d app/translations'):
        raise RuntimeError('compile command failed')

请注意,这些函数的装饰器是如何从translate父函数派生的。 这似乎令人困惑,因为translate()是一个函数,但它是Click构建命令组的标准方式。 与translate()函数相同,这些函数的文档字符串在--help输出中用作帮助消息。

你可以看到,对于所有命令,运行它们并确保返回值为零(这意味着命令没有返回任何错误)。 如果命令错误,那么我会引发一个RuntimeError,这会导致脚本停止。 update()函数在同一个命令中结合了extract和update步骤,如果一切都成功的话,它会在更新完成后删除messages.pot文件,因为当再次需要这个文件时,可以很容易地重新生成 。

init命令将新的语言代码作为参数。 这是其执行流程:

app/cli.py:Init子命令。

import click

@translate.command()
@click.argument('lang')
def init(lang):
    """Initialize a new language."""
    if os.system('pybabel extract -F babel.cfg -k _l -o messages.pot .'):
        raise RuntimeError('extract command failed')
    if os.system(
            'pybabel init -i messages.pot -d app/translations -l ' + lang):
        raise RuntimeError('init command failed')
    os.remove('messages.pot')

该命令使用@click.argument装饰器来定义语言代码。 Click将命令中提供的值作为参数传递给处理函数,然后将该参数并入到init命令中。

启用这些命令的最后一步是导入它们,以便注册命令。 我决定在顶级目录的microblog.py文件中执行此操作:

microblog.py:注册命令。

from app import cli
  • 这里我唯一需要做的就是导入新的cli.py模块,不需要做任何事情,因为导入操作会导致命令装饰器运行并注册命令。

此时,运行flask --help将列出translate命令作为选项。 flask translate --help将显示我定义的三个子命令:

(venv) $ flask translate --help
Usage: flask translate [OPTIONS] COMMAND [ARGS]...

  Translation and localization commands.

Options:
  --help  Show this message and exit.

Commands:
  compile  Compile all languages.
  init     Initialize a new language.
  update   Update all languages.

所以现在工作流程就简便多了,而且不需要记住长而复杂的命令。 要添加新的语言,请使用:

flask translate init <language-code>
  • 在更改_()和_l()语言标记后更新所有语言:
flask translate update
  • 在更新翻译文件后编译所有语言:
flask translate compile
实现Web应用的国际化与本地化:Flask-Babel的实践 本文深入探讨了如何利用Flask-Babel扩展为Web应用添加国际化和本地化功能。通过Flask-Babel,可以轻松处理不同区域的日期、时间和文本翻译问题,支持多语言界面显示,提升用户体验。文章介绍了通过模板上下文、区域选择器装饰器和消息目录处理不同区域的语言显示,并通过实例展示了如何在代码中进行文本标记以及如何管理翻译文件。 阅读详情

相关推荐

Flask应用开发:模板、国际化与本地化

本文从Flask开发的角度出发,深入探讨了在缺少Bootstrap-Flask扩展的情况下如何手动编写HTML代码和宏,以及如何通过编写扩展来简化开发。文章还详细介绍了如何利用HTML模板、JavaScript和AJAX技术实现单页应用的页面切换和状态管理,以及如何为应用添加国际化和本地化支持,包括对Babel和Flask-Babel的使用,以及如何设置和显示不同的区域和语言。

weixin_42462474的博客 306

如何在Flask中实现国际化和本地化

在Flask中实现国际化和本地化(i18n 和 l10n)是一个涉及多个步骤的过程,需要一些关键的技术点和工具。

sheji888的专栏 1535

Flask应用国际化:翻译文本标记与管理

本篇博客介绍了如何在Flask应用中实现国际化,涵盖了动态文本的翻译标记、模板中的翻译、翻译文本的提取和生成语言目录。文章详细解释了在Python代码和模板中如何使用_()和_l()函数标记文本,并通过Flask-Babel进行翻译。同时,介绍了如何创建.pot文件来提取待翻译文本,以及如何生成和编译语言目录文件,以实现应用的多语言支持。

weixin_42393362的博客 389

[译]Flask Framework Cookbook-第九章 国际化和本地化

第九章 国际化和本地化 web应用通常不限制于一个地区或者为一种特定语言的人群服务。比如,一个web应用意图服务于欧洲的用户,除了英语同样需要支持其它欧洲语言国家比如德国,法国,意大利,西班牙等等。这一章节将讲述如何在一个Flask应用中支持多种语言。 这一章将包括下面小节: 新增一种语言 延迟计算和gettext/ngettext函数 全球语言转换动作 介绍 在任何web应用中...

Liusple的博客 1061

Scratch离线版部署指南:解决资源缺失与页面显示异常问题

本文提供了一份详尽的Scratch离线版部署指南,旨在解决网络依赖导致的资源缺失与页面显示异常问题。通过从基础文件获取、自动化资源抓取到生产环境部署的完整流程,帮助教育工作者和开发者在无网络环境下搭建功能完整的本地Scratch编辑器,确保编程教学的顺利进行。

wine的专栏 1260

《全连接到卷积神经网络:图像识别的演变历程》

这篇文章会从传统全连接层面临的困境说起,揭示卷积神经网络(CNN)成为图像识别核心动力的原因,探究其背后蕴含的设计思想与技术创新。但是回顾历史,CNN的出现提醒我们:技术的突破往往是由对自然规律的模仿和重新构建得来的。也许,当机器真的学会“像人一样看世界”的时候,它们的“眼睛”早就超过生物视觉的限制了。例如,用5×5的核处理224×224的输入时,只要25个参数(而不是全连接那种百万级的)。* 局部性:网络的底层只需留意局部的地方(像边缘、纹理这样的地方),不用管那些全局像素之间复杂的关系。

2401_82434295的博客 673

Python中国际化(i18n)完整指南

这是一个完整的指南,展示了如何为一个Python应用程序进行国际化(i18n)。当我在handroll项目中添加i18n时,我很难找到支持其他语言的明确建议。这是我个人的一点经验,解释了我是如何做到这一点的。 概述 要使代码国际化,您必须以一种特定的方式处理用户文本字符串。所有的文本字符串都必须用一个特殊的函数调用来包装。这个特殊的函数将字符串标记为需要翻译的东西。一旦所有的字符串都被标记之后,i...

Python热爱者的博客 5302

【TC3xx芯片】TC3xx DMA模块详解

TC3xx DMA模块详解

qq_36056498的博客 5915

Flask学习笔记-(十一)国际化与本地化

国际化与本地化 文章目录国际化与本地化1. Flask-Babel扩展库使用1.1. 扩展库安装1.2. 扩展库注册1.3. 配置支持语言列表及默认语言1.4. 编写获取本地语言函数2. 原代码改造2.1. python代码改造2.2. 模板代码改造2.3. 提取需翻译文本2.4. 生成语言目录2.5. 编译翻译文件2.6. 测试翻译效果2.7. 翻译文件更新2.8. 翻译日期时间3. 翻译命令行...

sdwang198912的博客 1386

《深入浅出多模态》(二):多模态任务及数据集介绍

本文为《深入浅出多模态》系列第二章,《多模态任务介绍与背景》主要介绍多模态模型的概念、技术难点、下游任务(Visual Grounding、VQA、image/Video Captioning等)及各类应用方向数据集展开介绍,本专栏适合从事多模态小白及爱好者学习,欢迎大家关注,如有侵权请联系删除!

专注大数据与人工智能技术分享,欢迎私信加群互相学习! 3834

简单VASP计算INCAR设置(结构优化OPT、静态自洽SCF、能带BAND、态密度DOS)

改变 K 点、NBANDS、晶胞、ENCUT、POTCAR、自旋或 SOC 后要检查兼容性。该参数不参与物理计算,因此不会改变总能量、受力、应力或最终结构。如果研究的是金属、磁性材料、表面、二维材料、分子、缺陷、DFT+U、杂化泛函或强自旋轨道耦合体系,部分参数必须调整。适合已经用 IBRION = 2 预优化、力较小、自由度较多的结构。在 IBRION = 1、2、3 中,它只是内部缩放因子。“不能修改”不是程序禁止修改,而是修改后会改变理论模型、数值精度或能量参考,使结果不能直接比较。

weixin_51420530的博客 122

【pythonweb国际化】国际化flask-babel,gettext,msgfmt,msginit

pythonweb 国际化与本地化,支持多语言切换 1. 工具与名词解释 babel:python的一个国际化组件包,官网:bable,提供了一些方便的参数,可以使用,本文以flask-babel为例: pip install flask-babel gettext: 属于GUN的国际化组件 po/pot: po文件是多语言的翻译文件,pot文件顾名思义就是po的template模板文件,里面只有msgid, 所有的msgstr都为空 mo: mo是po文件编译之后的翻译二进制文件,gettex

aninstein的博客 2223

Transformer大模型实战 文本摘要任务

Transformer, 文本摘要, 自然语言处理, 预训练模型, 序列到序列, BERT, BART, T5 1. 背景介绍 文本摘要任务是自然语言处理 (NLP) 领域的重要研究方向之一,旨在从长篇文本中提取关键信息,生成简洁、准确的摘要。随着深度学习技术的快速发展,基于 Tra

AI大模型应用之禅 1339

Flask API 如何接入 i18n 实现国际化多语言

如何在现有的 Flask API 项目中,引入 i18n 实现国际化多语言,同时与前端 Vue3 页面联动。

代码怪兽的技术博客 1303

Ollama 在不同操作系统上的详细使用,及用python进行调用实战

本文介绍了Ollama的安装配置及Python调用方法。主要内容包括:1)Windows/macOS/Linux/Docker等多种安装方式;2)Ollama基础命令,涵盖模型管理、运行和服务控制;3)Python调用教程,包含官方库使用、自定义客户端、多轮对话、参数设置等高级功能,以及直接API调用示例。文章提供了完整的代码片段,适合开发者快速上手使用Ollama进行本地大模型部署和开发。

数据知道的博客 1231

基于C++的MMC仿真与PSCAD建模

MMC是一种基于模块化设计的多电平换流器,通常由若干个基本单元(子模块)组成。每个子模块包含一个电容和两个开关,通过控制开关的开闭,实现输出电压的级联和多电平化。高效率:由于开关频率较低,开关损耗小,效率高。高可靠性:模块化设计使得故障模块易于更换,提高了系统的可靠性。灵活扩展:可以通过增加或减少子模块的数量,方便地调整输出电压和功率。PSCAD(Power Systems Computer Aided Design)是广泛应用于电力系统仿真的专业软件,具有强大的建模和仿真能力。

qq_38334677的博客 295

Flask 扩展 国际化 本地化

Flask 扩展 国际化 本地化1. 设置语言和时区2. 在视图和模板中使用翻译3. 创建本地化翻译文件4. 格式化日期5. 格式化货币 pip install flask-babel 先初始化一个Flask-Babel的实例 from flask import Flask from flask_babel import Babel app = Flask(__name__) babel = ...

筑梦人 356

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

带你认识 flask 国际化和本地化

点击上方蓝字关注我们欢迎关注我的公众号,志学Python01flask-babel简介你猜对了,Flask-Babel正是用于简化翻译工作的。可以使用pip命令安装它:(venv) $ pip install flask-babelFlask-Babel的初始化与之前的插件类似:app/__init__.py: Flask-Babel实例# ... from flask_babel impor...

人生代码 ---- 公众号 798

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

配置Flask国际化多语言支持

简介 国际化和本地化,通常简称 I18n 和 L10n。Flask框架的多语言支持目前基本上都是用的flak-babel库<当然,爱折腾的也可以做一个>,flask-babel基于Python的Babel模块和pytz模块github地址:https://github.com/python-babel/flask-babeldocs地址:https://pythonhosted.or...

weixin_34367257的博客 1741

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Flask-Admin多语言管理后台终极指南:如何实现完整国际化支持

Flask-Admin是一个强大的Python Flask框架扩展,专门用于快速构建功能完善的管理后台界面。对于需要面向全球用户的企业应用来说,实现多语言支持是至关重要的功能需求。Flask-Admin与Flask-Babel的完美集成,让开发者能够轻松构建支持40多种语言的国际化管理后台系统。😊 ## 为什么需要多语言管理后台? 在全球化的今天,企业应用往往需要服务来自不同国家和地区的用户

gitblog_00048的博客 815

flask中实现web国际化

3、执行:pybabel extract -F babel.cfg -o /home/song/Documents/Codes/subtitle-flask-bar/translates/en/messages.pot .[python: app.py] #app.py为你的python文件路径,会提取app.py下.html文件中的内容,需要翻译的内容用{{_(' ')}}包裹。会生成一个.pot文件,其中msgid "登录"表示原内容,msgstr "login in"表示翻译的内容。

weixin_43587056的博客 480

Flask-AppBuilder 国际化(i18n)支持详解

国际化(Internationalization,简称i18n)是指让软件能够适应不同语言和地区需求的技术方案。在Flask-AppBuilder框架中,内置了完善的国际化支持,开发者可以轻松实现多语言界面。 ## 框架内置语言支持 Flask-AppBuilder目前支持16种语言的界面翻译,包括: - 中文 - 荷兰语 - 英语 - 法语 - 德语 - 日语 - 波兰语 - 葡萄牙语 - ...

gitblog_00612的博客 476

Flask flask-babel插件实现国际化

手把手实现flask的国际化方案

liuyanqun_q的博客 1445

MLH Flask Hackathon Starter国际化与本地化:多语言支持与区域设置配置

MLH Flask Hackathon Starter是一个专为Flask应用打造的黑客松启动项目,它提供了丰富的基础功能和架构设计,帮助开发者快速构建Web应用。本文将详细介绍如何为该项目添加国际化与本地化支持,实现多语言功能与区域设置配置,让你的应用能够服务于全球用户。 ## 为什么需要国际化与本地化支持? 在当今全球化的互联网环境中,为应用添加多语言支持已成为提升用户体验的关键因素。通过

gitblog_00201的博客 584
上一篇: Python3 对接微信
下一篇: 按位与、或、非、异或总结
唐僧不爱八戒
博客等级 码龄9年 158粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值