十分钟掌握Keras实现RNN的seq2seq学习

2023-10-30

作者 | Francois Chollet

编译 | 雁惊寒


seq2seq是一种把序列从一个域(例如英语中的句子)转换为另一个域中的序列(例如把相同的句子翻译成法语)的模型训练方法。目前有多种方法可以用来处理这个任务,可以使用RNN,也可以使用一维卷积网络。

很多人问这个问题:如何在Keras中实现RNN序列到序列(seq2seq)学习?本文将对此做一个简单的介绍。


什么是seq2seq学习


序列到序列学习(seq2seq)是一种把序列从一个域(例如英语中的句子)转换为另一个域中的序列(例如把相同的句子翻译成法语)的模型训练方法。

"the cat sat on the mat" -> [Seq2Seq model] -> "le chat etait assis sur le tapis"


这可以用于机器翻译或免费问答(对于自然语言的问题,产生自然语言的答案)。一般来说,它适用于任何需要生成文本的场景。

目前有多种方法可以用来处理这个任务,可以使用RNN,也可以使用一维卷积网络。这里,我们将重点介绍RNN。


当输入和输出序列的长度相同时


当输入序列和输出序列具有相同长度的时候,你可以使用Keras LSTM或GRU层(或其堆叠)很轻松地实现这样地模型。这个示例脚本就是一个例子,它展示了如何教RNN计算加法,并编码为字符串:

对于这个方法有一点要注意:我们假定了对于给定的input[...t]是可以生成target[...t]的。这在某些情况下有效(例如,数字字符串的加法),但在大多数情况下都无效。在一般情况下,要生成目标序列,必须要有输入序列的完整信息。


标准的序列到序列


一般来说,输入序列和输出序列的长度是不同的(例如机器翻译),并且需要有完整的输入序列才能开始预测目标。这需要一个更高级的设置,这就是人们在“序列到序列模型”时经常提及的没有上下文。下面是它的工作原理:

  • 有一个RNN层(或其堆叠)作为“编码器”:它负责处理输入序列并返回其自身的内部状态。注意,我们将丢弃编码器RNN的输出,只恢复状态。该状态将在下一步骤中用作解码器的“上下文”或“环境”。

  • 另外还有一个RNN层(或其堆叠)作为“解码器”:在给定目标序列前一个字符的情况下,对其进行训练以预测目标序列的下一个字符。具体来说,就是训练该层使其能够将目标序列转换成向将来偏移了一个时间步长的同一个序列,这种训练过程被称为“teacher forcing(老师强迫)”。有一点很重要,解码器将来自编码器的状态向量作为初始状态,这样,解码器就知道了它应该产生什么样的信息。实际上就是解码器以输入序列为条件,对于给定的targets[...t]学习生成targets[t+1...],。

在推理模式下,即当我们要解码未知输入序列时,过程稍稍会有些不同:

  • 将输入序列编码为状态向量。

  • 以大小为1的目标序列开始。

  • 将状态向量和一个字符的目标序列提供给解码器,以产生下一个字符的预测。

  • 使用这些预测对下一个字符进行采样(我们简单地使用argmax)。

  • 将采样的字符添加到目标序列上

  • 重复上述步骤,直到生成序列结束字符,或者达到字符数限制。



也可以在没有“teacher forcing”的情况下使用相同的过程来训练Seq2Seq网络,例如,通过将解码器的预测重新注入到解码器中。


一个Keras的例子


下面我们用代码来实现上面那些想法。

对于这个例程,我们将使用英文句子和对应的法语翻译数据集,可以从manythings.org/anki下载。下载的文件名为fra-eng.zip。我们将实现一个字符级别的序列到序列模型,处理逐个字符输入并逐个字符的生成输出。我们也可以实现一个单词级别的模型,这对于机器翻译而言更常见。在本文的最后,你能找到一些使用Embedding层把字符级别的模型变成单词级别模型的信息。

完整例程可以在GitHub上找到https://github.com/fchollet/keras/blob/master/examples/lstm_seq2seq.py。

下面简单介绍一下处理过程:

  • 将句子转换为3个Numpy数组,encoder_input_data,decode_input_data,decode_target_data: 

    • encoder_input_data是一个三维数组(num_pairs, max_english_sentence_length, num_english_characters),包含英文句子的独热向量化。

    • decoder_input_data是一个三维数组(num_pairs, max_french_sentence_length, num_french_characters),包含法语句子的独热向量化。

    • decoder_target_data与decoder_input_data相同但偏移一个时间步长。 decoder_target_data[:, t, :]将与decoder_input_data[:, t + 1, :]相同

  • 训练一个基于LSTM的基本的Seq2Seq模型来预测encoder_input_data和decode_input_data的decode_target_data。模型使用了“teacher forcing”。

  • 解码一些句子以检查模型是否正常工作(即将encoder_input_data中的样本从decoder_target_data转换为相应的样本)。


由于训练过程和推理过程(译码句)是完全不同的,所以我们要使用不同的模型,尽管它们都是利用相同的内部层。

这是我们的训练模型。它利用了Keras RNN的三个主要功能:

  • return_state contructor参数,配置一个RNN层返回第一个条目是输出,下一个条目是内部RNN状态的列表。用于恢复编码器的状态。

  • inital_state参数,指定RNN的初始状态。用于将编码器状态传递到解码器作为初始状态。

  • return_sequences构造函数参数,配置RNN返回其完整的输出序列。在解码器中使用。


from keras.models import Model

from keras.layers import Input, LSTM, Dense


# Define an input sequence and process it.

encoder_inputs = Input(shape=(None, num_encoder_tokens))

encoder = LSTM(latent_dim, return_state=True)

encoder_outputs, state_h, state_c = encoder(encoder_inputs)

# We discard `encoder_outputs` and only keep the states.

encoder_states = [state_h, state_c]


# Set up the decoder, using `encoder_states` as initial state.

decoder_inputs = Input(shape=(None, num_decoder_tokens))

decoder_lstm = LSTM(latent_dim, return_sequences=True)

decoder_outputs = decoder_lstm(decoder_inputs, initial_state=encoder_states)

decoder_dense = Dense(num_decoder_tokens, activation='softmax')

decoder_outputs = decoder_dense(decoder_outputs)


# Define the model that will turn

# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)


我们对模型进行了训练,同时监测到了20%的样本损失。


# Run training

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

model.fit([encoder_input_data, decoder_input_data], decoder_target_data,

          batch_size=batch_size,

          epochs=epochs,

          validation_split=0.2)


在MacBook CPU上,经过一个小时左右的时间,就可以开始推断了。 要解码一个测试语句,要重复这几个步骤:

  1. 对输入的句子进行编码并获取初始解码器的状态

  2. 以该初始状态和“序列开始”令牌为目标,执行解码器的一个步骤。 输出是下一个目标字符。

  3. 添加预测到的目标字符并重复上述步骤。


这是我们的推理设置:

encoder_model = Model(encoder_inputs, encoder_states)


decoder_state_input_h = Input(shape=(latent_dim,))

decoder_state_input_c = Input(shape=(latent_dim,))

decoder_states = [decoder_state_input_h, decoder_state_input_c]

decoder_outputs = decoder_lstm(decoder_inputs,

                               initial_state=decoder_states)

decoder_outputs = decoder_dense(decoder_outputs)

decoder_model = Model(

    [decoder_inputs] + decoder_states,

    decoder_outputs)


我们用它来实现上述推理循环:


def decode_sequence(input_seq):

    # Encode the input as state vectors.

    states_value = encoder_model.predict(input_seq)


    # Generate empty target sequence of length 1.

    target_seq = np.zeros((1, 1, num_decoder_tokens))

    # Populate the first character of target sequence with the start character.

    target_seq[0, 0, target_token_index['\t']] = 1.


    # Sampling loop for a batch of sequences

    # (to simplify, here we assume a batch of size 1).

    stop_condition = False

    decoded_sentence = ''

    while not stop_condition:

        output_tokens = decoder_model.predict([target_seq] + states_value)


        # Sample a token

        sampled_token_index = np.argmax(output_tokens[0, -1, :])

        sampled_char = reverse_target_char_index[sampled_token_index]

        decoded_sentence += sampled_char


        # Exit condition: either hit max length

        # or find stop character.

        if (sampled_char == '\n' or

           len(decoded_sentence) > max_decoder_seq_length):

            stop_condition = True


        # Add the sampled character to the sequence

        char_vector = np.zeros((1, 1, num_decoder_tokens))

        char_vector[0, 0, sampled_token_index] = 1.


        target_seq = np.concatenate([target_seq, char_vector], axis=1)


    return decoded_sentence


我们得到了一些不错的结果。由于我们是从训练测试集中抽取的样本,所以这并不奇怪。


Input sentence: Be nice.

Decoded sentence: Soyez gentil !

-

Input sentence: Drop it!

Decoded sentence: Laissez tomber !

-

Input sentence: Get out!

Decoded sentence: Sortez !


有关Keras的序列到序列模型的十分钟介绍已经结束了。 请注意:完整的代码可在GitHub上找到https://github.com/fchollet/keras/blob/master/examples/lstm_seq2seq.py。


参考资料


使用神经网络进行序列到序列的学习 

https://arxiv.org/abs/1409.3215

使用用于统计机器翻译的RNN编码器-解码器来学习短语的表达

https://arxiv.org/abs/1406.1078



常见问题



如果我想使用GRU层而不是LSTM该怎么办?


这实际上更简单,因为GRU只有一个状态,而LSTM有两个状态。 以下代码展示了如何让训练模型适应使用GRU层:

encoder_inputs = Input(shape=(None, num_encoder_tokens))

encoder = GRU(latent_dim, return_state=True)

encoder_outputs, state_h = encoder(encoder_inputs)


decoder_inputs = Input(shape=(None, num_decoder_tokens))

decoder_gru = GRU(latent_dim, return_sequences=True)

decoder_outputs = decoder_gru(decoder_inputs, initial_state=state_h)

decoder_dense = Dense(num_decoder_tokens, activation='softmax')

decoder_outputs = decoder_dense(decoder_outputs)

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)


如果我想对整数序列的输入使用单词级模型该怎么办?


如果输入是整数序列,该怎么办呢? 通过嵌入层嵌入这些整数令牌即可。 就是这样:

# Define an input sequence and process it.

encoder_inputs = Input(shape=(None,))

x = Embedding(num_encoder_tokens, latent_dim)(encoder_inputs)

x, state_h, state_c = LSTM(latent_dim,

                           return_state=True)(x)

encoder_states = [state_h, state_c]


# Set up the decoder, using `encoder_states` as initial state.

decoder_inputs = Input(shape=(None,))

x = Embedding(num_decoder_tokens, latent_dim)(decoder_inputs)

x = LSTM(latent_dim, return_sequences=True)(x, initial_state=encoder_states)

decoder_outputs = Dense(num_decoder_tokens, activation='softmax')(x)


# Define the model that will turn

# `encoder_input_data` & `decoder_input_data` into `decoder_target_data`

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)


# Compile & run training

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')

# Note that `decoder_target_data` needs to be one-hot encoded,

# rather than sequences of integers like `decoder_input_data`!

model.fit([encoder_input_data, decoder_input_data], decoder_target_data,

          batch_size=batch_size,

          epochs=epochs,

          validation_split=0.2)


如果我不想用“teacher forcing”训练该怎么办?


在某些案例中,由于无法访问完整的目标序列,可能导致无法使用“teacher forcing”。例如 如果需要对一个很长的序列做在线训练,那么缓冲完整的输入几乎是不可能的。 在这种情况下,你可能希望通过将解码器的预测重新注入到解码器的输入中来进行训练,就像我们在推理中做的那样。

你可以通过构建一个硬编码输出重新注入回路的模型来实现这个目的:

from keras.layers import Lambda

from keras import backend as K


# The first part is unchanged

encoder_inputs = Input(shape=(None, num_encoder_tokens))

encoder = LSTM(latent_dim, return_state=True)

encoder_outputs, state_h, state_c = encoder(encoder_inputs)

states = [state_h, state_c]


# Set up the decoder, which will only process one timestep at a time.

decoder_inputs = Input(shape=(1, num_decoder_tokens))

decoder_lstm = LSTM(latent_dim, return_sequences=True, return_state=True)

decoder_dense = Dense(num_decoder_tokens, activation='softmax')


all_outputs = []

inputs = decoder_inputs

for _ in range(max_decoder_seq_length):

    # Run the decoder on one timestep

    outputs, state_h, state_c = decoder_lstm(inputs,

                                             initial_state=states)

    outputs = decoder_dense(outputs)

    # Store the current prediction (we will concatenate all predictions later)

    all_outputs.append(outputs)

    # Reinject the outputs as inputs for the next loop iteration

    # as well as update the states

    inputs = outputs

    states = [state_h, state_c]


# Concatenate all predictions

decoder_outputs = Lambda(lambda x: K.concatenate(x, axis=1))(all_outputs)


# Define and compile model as previously

model = Model([encoder_inputs, decoder_inputs], decoder_outputs)

model.compile(optimizer='rmsprop', loss='categorical_crossentropy')


# Prepare decoder input data that just contains the start character

# Note that we could have made it a constant hard-coded in the model

decoder_input_data = np.zeros((num_samples, 1, num_decoder_tokens))

decoder_input_data[:, 0, target_token_index['\t']] = 1.


# Train model as previously

model.fit([encoder_input_data, decoder_input_data], decoder_target_data,

          batch_size=batch_size,

          epochs=epochs,

          validation_split=0.2)


原文:https://blog.keras.io/a-ten-minute-introduction-to-sequence-to-sequence-learning-in-keras.html



SDCC 2017“人工智能技术实战线上峰会”将在CSDN学院以直播互动的方式举行。

作为SDCC系列技术峰会的一部分,来自阿里巴巴、微软、商汤科技、第四范式、微博、出门问问、菱歌科技的AI专家,将针对机器学习平台、系统架构、对话机器人、芯片、推荐系统、Keras、分布式系统、NLP等热点话题进行分享。先行者们正在关注哪些关键技术?如何从理论跨越到企业创新实践?你将从本次峰会找到答案。每个演讲时段均设有答疑交流环节,与会者和讲师可零距离互动。 



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

十分钟掌握Keras实现RNN的seq2seq学习 的相关文章

  • conda install & pip install区别 & 查看当前环境下包的情况

    conda可以方便开发管理python环境 包可以conda 安装有时使用pip整理一下不同点 conda 创建环境 conda create name a conda env python 3 6 名为a conda env python
  • SVG图标配置

    在开发项目的时候我们经常会用到svg矢量图 而且我们使用SVG以后 页面上加载的不再是图片资源 这对页面性能来说也是个很大的提升 项目背景 vue3 vite ts 安装依赖 npm install vite plugin svg icon
  • 202320读书笔记|《宋词》——竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生

    202320读书笔记 宋词 竹杖芒鞋轻胜马 谁怕 一蓑烟雨任平生 宋词 韩震主编 偶然从书友那加入书架的书 宋词挺喜欢李清照的词以及知否的 菩萨蛮 诗集 词 俳句 短歌我都很喜欢 是轻松有趣又简短的 这本书里有一些是上学时候背过的 看到的时
  • log4j2 入门学习与总结

    log4j2 2 3 入门学习与总结 大纲 log4j2 配置文件加载 log4j2 配置文件结构图 log4j2 配置文件说明 log4j2 Appenders child Filter ThresholdFilter 的使用 log4j
  • 【云原生之K8S】Yaml文件详解

    目录 一 K8S支持的文件格式 1 1 yaml和json的主要区别 二 YAML 2 1 查看API资源版本标签 2 2 编写资源配置清单 编写nginx test yaml资源配置清单 创建资源对象 查看创建的pod资源 2 3 创建s
  • C++中的适配器

    C primer中关于适配器的定义 适配器 adaptor 是使一种事物的行为类似于另外一事物的行为的一种机制 这个定义初学时觉得好抽象 为了理解C 中的适配器 不妨先了解物理上的适配器 物理上的适配器就是一个接口转换器 它可以是一个独立的
  • 我如何搞懂Javascript系列之原型和原型链

    理解原型 JavaScript 常被描述为一种基于原型的语言 每个对象拥有一个原型对象 对象以其原型为模板 从原型继承方法和属性 原型对象也可能拥有原型 并从中继承方法和属性 一层一层 以此类推 这种关系常被称为原型链 构造函数创建对象 J
  • JS常用方法

    1 删除数组中指定对象指定元素 let arr name xiaowang id 1 name xiaozhang id 2 createDate xiaoli id 3 删除id为1的对象 其中i为index 1可选择性填写 含义为删除当
  • 传递颜色

    由于颜色在片元着色器中 故不能用attribute 用uniform得到并传递 11
  • python中国古代数学问题——二鼠打洞

    任务描述 九章算术 的 盈不足篇 里有一个很有意思的老鼠打洞问题 原文是这么说的 今有垣厚十尺 两鼠对穿 大鼠日一尺 小鼠亦一尺 大鼠日自倍 小鼠日自半 问 何日相逢 各穿几何
  • 剑指 Offer 10- I. 斐波那契数列(java+python)

    写一个函数 输入 n 求斐波那契 Fibonacci 数列的第 n 项 即 F N 斐波那契数列的定义如下 F 0 0 F 1 1 F N F N 1 F N 2 其中 N gt 1 斐波那契数列由 0 和 1 开始 之后的斐波那契数就是由
  • C/C++语言 从日期格式字符串中提取年月日时分秒

    系列文章目录 文章目录 系列文章目录 前言 一 日期格式字符串 二 strftime函数 1 描述 2 声明 3 形参 4 返回值 三 strptime函数 1 形参 2 示例 3 函数封装 总结 前言 上一篇文章 C C 语言 获取系统时
  • MES管理系统如何帮助制造企业打造透明化工厂

    在制造型企业的运营中 车间现场管理至关重要 然而 面临着信息传递速度慢 跨部门协作困难 生产进度无法及时掌握 制造品质不良 设备故障不能及时处理等困境 企业需要寻求有效的解决方案 MES生产管理系统作为针对制造企业车间生产过程控制和管理的解
  • 如何在使用中文输入法的时候打出英文字符

    解决方法很简单 只需要按CTRL 就可以实现中英文字符切换 这样在按字母的时候还是会显示拼音 但输入字符时都是英文字符了 避免了频繁的shift切换
  • 【Qt学习】07:绘图与绘图设备

    OVERVIEW 绘图与绘图设备 一 QPainter 二 QPainterDevice 1 QPixmap 2 QBitmap 3 QImage 4 QPicture 绘图与绘图设备 一 QPainter Qt 的绘图系统允许使用API在
  • unsigned int用法

    注意使用unsigned int 无符号常数 正如我们所知道的 编程语句都有很多的基本数据类型 如char inf float等等 而在C和C 中还有一个特殊的类型就是无符号数 它由unsigned修饰 如unsigned int等 大家有
  • visible.sync 的作用

    我们在前端开发中经常看到 visible sync这种修饰符 很多人不知道这是干什么的 特别是在使用ElementUI的时候 里面有个弹窗el dialog组件的时候会有用到 visible sync
  • VUE项目中的全局格式化时间过滤器

    1 全局过滤器 https blog csdn net weixin 45054614 article details 105368776 全局时间格式化 对名称进行定义 提供一个function函数 originVal 为形参 Vue f
  • Chapter1 ROS概述与环境搭建

    一 序言 学习一个新的知识模块时 要先了解模块的相关概念 安装官方软件包 搭建其集成的开发环境 这些完成后 继续开始开创新领域的大门 二 ROS简介 2 1 ROS的概念 一个比喻 机器人的控制集成硬件设计 嵌入式软件设计 上层软件设计 l
  • Echart 之 timeline 时间组件 基本用法

    此处是基础版 大神请绕路 官方给的timeline组件太过于复杂 对于不熟悉的朋友 只是看逻辑就浪费很多时间 以下是基础版的示例 div style height 100 div

随机推荐

  • Altium AD20删除机械层MECH

    1 滥用MECH机械层导致的PCB过孔错误 前两天打样PCB时犯了个大毛病 导致送打样回来发现有多处网络对GND短路 更可气的是 这是在手贴了两块样板后才发现的 赔进去一下午时间和一堆元件 亏死 刚开始百思不得其解 因为在AD20中规则检查
  • 2021/9/29 TX POWER 蓝牙发射功率

    1 觉得挺奇葩 如果不是扩展包的话 就是TX power 设定 没法通过hci 下发 就是 在controller 设定好 也没法中途去变化 扩展包 有这个选项 能够改变 可以通过HCI 下发指令来更改 2 AD9361 设置发射功率 要注
  • (转)如何选择合适的射频模块

    要选择合适的射频模块 以下几个问题我们都需要搞搞清楚 无线设备该通多远 该用多大的功率 如何扩大通信距离 天线是否该重视 该选什么样的模块 初学者如何选择仪器 如何确定通信状况等等 无线设备该通多远 谈到这个话题 有必要想一想当年了 比如1
  • 一个panic bug的分析过程1

    一个panic bug的分析过程 一 2012 05 15 14 57 06 分类 LINUX 一个工作中遇到的bug的问题 分析一下流程 顺便把panic这种类似的bug流程做一些分析 环境 linux 3 0 arm 芯片平台 首先看出
  • 一台服务器部署多个tomcat

    参考文档 19条消息 一 linux部署多个tomcat 做测试的喵酱的博客 CSDN博客
  • 【算法】经典的八大排序算法

    点击链接 可视化排序 动态演示各个排序算法来加深理解 大致如下 一 冒泡排序 Bubble Sort 原理 冒泡排序 Bubble Sort 是一种简单的排序算法 它通过多次比较和交换相邻元素的方式 将最大 或最小 的元素逐步冒泡到数组的一
  • gradle更新snapshot的jar

    通常 gradle下载引用的jar文件的话 会缓存到本地 不会重复去下载 但是 我们引用的是snapshot的jar 这种jar文件一般是其他项目组的代码 这种jar一般都进行迭代开发 会重复更新上传到nexus代码仓库中 我们必须在每次启
  • linux-vmware workstation安装

    环境介绍 闲着没事测试下linux vmware workstation linux vmware workstation安装 1 搭建软件仓库 root gby mount dev sr0 mnt mount mnt WARNING de
  • TRON节点验证交易的时间容忍度

    这篇文章主要介绍深入分析TRON的节点配置文件中vm minTimeRatio和vm maxTimeRatio这两个标志的意义 这两个标志的表示的是节点 包括sr和fullnode 验证区块中智能合约交易的时间比例 时间容忍度 注 sr节点
  • 【java】swagger中api接口传多个参数 @ApiImplicitParam和@ApiImplicitParams

    目录 1 ApiImplicitParam 2 ApiImplicitParams 3 Spring Boot项目中集成Swagger knife4j并自定义访问路径 swagger常用注解使用说明 1 ApiImplicitParam 作
  • PI闭环的FPGA实现

    PID闭环的FPGA实现 1 原理分析 最近小张同学在做项目的时候发现PI闭环的FPGA学习资料很少 秉持着 既然没有轮子 那么自己就造一个的原则 于是乎自己写了个PI的Verilog程序 FPGA中实现PI闭环与DSP STM32 arm
  • docker安装kibana报Kibana server is not ready yet解决

    今天通过docker安装了es集群 想再起一个kibana容器进行管理 安装还算方便 直接联网用docker pull与es同版本的kibana镜像下来启动容器即可 奈何用浏览器访问http 127 0 0 1 5601 时一直报Kiban
  • java synchronized用法

    总结一下synchronized的用法 1 修饰静态方法 2 修饰实例方法 3 修饰代码块 一 首先看一下修饰静态方法和修饰实例方法的区别 直接上代码 synchronized 修饰实例方法 修饰静态方法 public class Sync
  • 第十章 Flink

    1 Flink初识 1 1 数据处理架构的发展和演变 流处理和批处理 流处理对应实时计算 批处理对应离线计算 传统事务处理 传统的事务处理 就是最基本的流处理架构 缺点 传统事务处理对表和数据库的设计要求很高 当数据规模越来越庞大 系统越来
  • python中os模块中文帮助文档

    python中os模块中文帮助文档 翻译者 butalnd 翻译于2010 1 7 2010 1 8 个人博客 url http butlandblog appspot com url 注此模块中关于unix中的函数大部分都被略过 翻译主要
  • kafka面试题02

    kafka 消费者是否从指定偏移量开始消费 可以 通过seek指定偏移量后再开始消费 客户端操作kafka消息是采用poll模式 还是push模式 kafka最初考虑的问题是 customer应该从brokes拉取消息还是brokers将消
  • topaz sharpen ai怎么设置为中文

    topaz sharpen ai是一款非常强大的图片锐化处理工具 采用了先进的人工智能技术 即使在手持 夜间或在浅景深拍摄时也可以创建清晰的图像 但该软件默认是英文语言 不支持简体中文语言 让国内许多用户都无从下手 所以小编带来了topaz
  • Oracle的load_balance和failover

    jdbc oracle thin description TRANSPORT CONNECT TIMEOUT 1 address list load balance off failover on address protocol tcp
  • RC并联电路常见应用总结

    阻容串联电路应用可以参考以下链接 链接 https blog csdn net weixin 45633643 article details 107740111
  • 十分钟掌握Keras实现RNN的seq2seq学习

    作者 Francois Chollet 编译 雁惊寒 seq2seq是一种把序列从一个域 例如英语中的句子 转换为另一个域中的序列 例如把相同的句子翻译成法语 的模型训练方法 目前有多种方法可以用来处理这个任务 可以使用RNN 也可以使用一