Keras 使用预训练嵌入初始化大型嵌入层

2023-12-21

我正在尝试使用预训练的嵌入和自定义语料库在 Keras 2 中使用 Tensorflow 后端重新训练 word2vec 模型。

这就是我使用预训练嵌入来初始化嵌入层的方法:

embedding = Embedding(vocab_size, embedding_dim,
                      input_length=1, name='embedding',
                      embeddings_initializer=lambda x: pretrained_embeddings)

where pretrained_embeddings是一个大小很大的矩阵vocab_size x embedding_dim

只要这样就有效pretrained_embeddings不太大。

不幸的是,就我而言,情况并非如此 -vocab_size=2270872 and embedding_dim=300.

初始化嵌入层后,我收到错误:

Cannot create a tensor proto whose content is larger than 2GB.

错误来自于函数add_weight() in /opt/r/anaconda3/lib/python3.6/site-packages/keras/engine/base_layer.py,更具体地说是以下行:

weight = K.variable(initializer(shape),
                    dtype=dtype,
                    name=name,
                    constraint=constraint)

initializer是上面的 lambda 函数,它返回大矩阵。shape is (2270872, 300)正如已经提到的。

是否可以解决这个问题而无需进行低级 Tensorflow 编程?如果我切换到 Theano 作为后端,代码运行良好,但我想使用 Tensorflow 以获得更好的长期前景。

我发现的唯一类似的 Stackoverflow 问题是this https://stackoverflow.com/questions/35394103/initializing-tensorflow-variable-with-an-array-larger-than-2gb,它提出了占位符变量,但我不确定如何在 Keras 级别上应用它们。

多谢

Edit:我非常愿意在 Tensorflow 后端层面解决这个问题。只是我不知道如何在本例中将 Tensorflow 和 Keras 代码组合在同一个应用程序中。大多数例子都是其中之一,而不是两者兼而有之。

例如,当 Keras 中 Embeddings 层的初始化将不可避免地调用 add_weight() 函数并导致问题时,Tensorflow 占位符变量有什么用?

解决方案:

正如 @blue-phoenox 的评论所暗示的,我重写了代码,如下所示:

embedding = Embedding(vocab_size, embedding_dim,
                      input_length=1, 
                      name='embedding')
embedding.build(input_shape=(1,)) # the input_shape here has no effect in the build function
embedding.set_weights([pretrained_embeddings])

就这样做到了。再次感谢@blue-phoenix。


而不是使用embeddings_initializer嵌入层的参数,您可以使用以下命令加载嵌入层的预训练权重weights争论,这样你应该能够交付大于 2GB 的预训练嵌入。

这是一个简短的例子:

from keras.layers import Embedding

embedding_layer = Embedding(vocab_size,
                            EMBEDDING_DIM,
                            weights=[embedding_matrix],
                            input_length=MAX_SEQUENCE_LENGTH,
                            trainable=False)

Where embedding_matrix只是一个包含你的权重的常规 numpy 矩阵。

例如,您还可以看看这里:
https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html https://blog.keras.io/using-pre-trained-word-embeddings-in-a-keras-model.html


Edit:

As @帕夫林马夫罗季耶夫 (见问题末尾)正确地指出了weights参数已被弃用。他反而使用了分层法 set_weights https://keras.io/layers/about-keras-layers/设置权重:

  • layer.set_weights(weights): sets the weights of the layer from a list of Numpy arrays (with the same shapes as the output of get_weights).

获得经过训练的重量get_weights可以使用:

  • layer.get_weights(): returns the weights of the layer as a list of Numpy arrays.

两者都是 Keras Layer-Baseclass 中的方法,可用于所有 keras 层,包括嵌入层。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Keras 使用预训练嵌入初始化大型嵌入层 的相关文章

随机推荐

  • 如何使用 GSON 解析嵌套 JSON

    我目前正在使用 volley 发出 get 请求 在 onResponse 中 我尝试使用 gson 将 jsonObject 解析到我的模型 请求后返回的JSON success 1 message Done data company c
  • 是否可以将函数存储在字典中?

    我的 C 应用程序中有一条消息 它是一个序列化为 JSON 的对象 当我反序列化它时 我有一个 名称 string和一个 有效负载 string 我希望能够获取 Name 并在函数字典中查找它 使用 Payload 数组作为其参数 然后将输
  • 如果 pandas dataframe.loc 位置不存在,则返回默认值

    我发现自己经常必须在尝试引用数据帧之前检查数据框中是否存在列或行 例如 我最终添加了很多代码 例如 if mycol in df columns and myindex in df index x df loc myindex mycol
  • 实体框架中可以有没有主键的表吗?

    我只是在练习代码优先新数据库实体框架msdn http msdn microsoft com en us data jj193542 我想知道是否可以在代码中先创建一个没有主键的表新数据库EF EF 可以用数据库做的事情和数据库可以做的事情
  • 为什么 MVC3 没有搭建我的外键列

    我尝试首先使用代码将 MVC 3 与 EF 4 1 结合使用 并遵循 Scott Guthries 教程http weblogs asp net scottgu archive 2011 05 05 ef code first and da
  • 将带有换行符和制表符的 python 字符串转换为字典

    我对我遇到的这个特殊问题有点困惑 我有一个可行的解决方案 但我认为它不太Pythonic 我有一个像这样的原始文本输出 Key 1 Value 1 Key 2 Value 2 Key 3 Value 3a Value 3b Value 3c
  • PHP 以数组形式读取特定的 csv 文件列

    我是 PHP 新手 希望能够读取有两列的 csv 文件 一列是数字 有点像 ID 另一列保存整数值 我查找了 fgetcsv 函数 但无法找到从 csv 文件读取特定列的方法 我想仅从第二列获取所有值 没有标题 有办法做到这一点吗 这是我到
  • Android:单击网页视图中页面中的链接

    我在android web视图中包含了一个web应用程序 并且网页中有一个链接可以打开其他网站 当单击该链接时 第一次单击可以正常工作 但是当第二次单击时 找不到该网站 代码是 Override public boolean shouldO
  • Wix React-native-navigation 更改 Tab 和推屏

    如何同时切换选项卡和推送屏幕 当按钮被按下时 我想切换到另一个选项卡并推送一个新屏幕 是否可以 class Example extends Component buttonHandler gt this props navigator sw
  • Hive 如何存储数据(从 HDFS 加载)?

    我对 Hadoop HDFS 和 Hbase 和 Hadoop 生态系统 Hive Pig Impala 等 相当陌生 我对 Hadoop 组件 例如 NamedNode DataNode Job Tracker Task Tracker
  • 尝试访问EC2实例超时的可能原因

    我无法通过 SSH 连接到我的实例 操作超时 可能的原因是什么 我该如何解决 重新启动通常需要很长时间才能生效 并且可能会让事情变得更糟 更新 这与权限无关 我可以正常登录 我怀疑这可能是因为内存问题 我遇到了同样的问题 解决方案最终是添加
  • 如何让 JUnit 测试等待?

    我有一个JUnit测试 我想同步等待一段时间 我的 JUnit 测试如下所示 Test public void testExipres SomeCacheObject sco new SomeCacheObject sco putWithE
  • x86 内核中的键盘 IRQ

    我正在尝试编写一个非常简单的内核以用于学习目的 在阅读了一堆有关 x86 架构中的 PIC 和 IRQ 的文章后 我已经明白了IRQ1是键盘处理程序 我使用以下代码来打印按下的键 include port io h define IDT S
  • 使用“开始于”目录获取 Windows .lnk 快捷方式的目标

    我正在尝试检索 Windows lnk 快捷方式的目标路径 但根据 lnk 文件的属性 目标 不是实际文件路径 我正在使用 IWshRuntimeLibrary 并且我正在访问的快捷方式对象的类型为 IWshShortcut WshShel
  • Htaccess Apache END 标志替代方案

    我为小型项目编写了一个小型框架 PHP 除了定义的路径外 它应该重定向到index php path 1 有了 END 标志 这就不成问题了 但自 Apache 2 3 以来 END 标志仍然存在 并且该脚本也应该可以在 apache 2
  • 如何在电子邮件中嵌入图像

    我需要在电子邮件中嵌入图像 我该怎么做 我不想使用第三方工具 也不对特定于语言的答案感兴趣 但它是 PHP 以防您想知道 我只对生成的电子邮件正文的格式感兴趣 如您所知 作为电子邮件传递的所有内容都必须文本化 您必须创建包含多部分 mime
  • 如何在 SQLite 触发器中使用 WITH 子句

    我正在尝试在 SQLite 数据库中创建某些内容的日志 我正在使用触发器执行此操作 但我需要插入多个日志记录 并且它们都需要具有相同的时间戳 为了做到这一点 我正在尝试使用WITH子句来获取当前时间戳 然后我可以在多个地方使用它 我的声明看
  • Instagram API 无需身份验证

    是否可以使用 Instagram API 并创建一个网络应用程序 通过主题标签显示一些图像 而无需用户验证自己的身份 我正在使用 ASP NET 来开发网站 不确定标签 但您可以使用 JSON 格式下载任何 Instagram 用户照片源
  • 如何制作 MKAnnotationView 下降动画?

    我有一个自定义 MKAnnotationView 我自己在 viewForAnnotation 中设置图像 如何像使用 MKPinAnnotationView 一样为其掉落设置动画 我的代码是 MKAnnotationView mapVie
  • Keras 使用预训练嵌入初始化大型嵌入层

    我正在尝试使用预训练的嵌入和自定义语料库在 Keras 2 中使用 Tensorflow 后端重新训练 word2vec 模型 这就是我使用预训练嵌入来初始化嵌入层的方法 embedding Embedding vocab size emb