时间:2021-07-01 10:21:17 帮助过:19人阅读
[[‘one‘, ‘two‘, ‘three‘, ‘four‘, ‘five‘], [‘six‘, ‘seven‘, ‘eight‘, ‘nine‘, ‘ten‘], [‘eleven‘, ‘twelve‘, ‘thirteen‘, ‘fourteen‘, ‘fifteen‘], [‘sixteen‘, ‘seventeen‘, ‘eighteen‘, ‘nineteen‘, ‘twenty‘], [‘twenty_one‘, ‘twenty_two‘, ‘twenty_three‘, ‘twenty_four‘, ‘twenty_five‘]]
训练输入数据【en_de_model.fit(inputs_train, tars_train, batch_size=3, nb_epoch=1, show_accuracy=True)】:
array([[ 1, 12, 19, 20, 21],
[22, 23, 24, 25, 2],
[ 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 13],
[14, 15, 16, 17, 18]], dtype=int32)
array([[[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, True],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]],
[[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]],
[[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]],
[[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]],
[[False, False, False, ..., False, False, False],
[False, False, False, ..., False, True, False],
[False, False, False, ..., True, False, False],
[False, False, False, ..., False, False, False],
[False, False, False, ..., False, False, False]]], dtype=bool)
来看一个完整的keras0.3版本的code:
decoder_mode = 1 # 0 最简单模式,1 [1]向后模式,2 [2] Peek模式,3 [3]Attention模式
# encoder部分
if decoder_mode == 3:
encoder_top_layer = LSTM(hidden_dim, return_sequences=True)
else:
encoder_top_layer = LSTM(hidden_dim)
# decoder部分
if decoder_mode == 0:
decoder_top_layer = LSTM(hidden_dim, return_sequences=True)
decoder_top_layer.get_weights()
elif decoder_mode == 1:
decoder_top_layer = LSTMDecoder(hidden_dim=hidden_dim, output_dim=hidden_dim
, output_length=tar_maxlen, state_input=False, return_sequences=True)
elif decoder_mode == 2:
decoder_top_layer = LSTMDecoder2(hidden_dim=hidden_dim, output_dim=hidden_dim
, output_length=tar_maxlen, state_input=False, return_sequences=True)
elif decoder_mode == 3:
decoder_top_layer = AttentionDecoder(hidden_dim=hidden_dim, output_dim=hidden_dim
, output_length=tar_maxlen, state_input=False, return_sequences=True)
# 模型构建
en_de_model = Sequential()
en_de_model.add(Embedding(input_dim=vocab_size,
output_dim=hidden_dim,
input_length=input_maxlen))
en_de_model.add(encoder_top_layer)
if decoder_mode == 0:
en_de_model.add(RepeatVector(tar_maxlen))
en_de_model.add(decoder_top_layer)
en_de_model.add(TimeDistributedDense(output_dim))
en_de_model.add(Activation(‘softmax‘))
en_de_model.compile(loss=‘categorical_crossentropy‘, optimizer=‘rmsprop‘)
en_de_model.fit(inputs_train, tars_train, batch_size=3, nb_epoch=1, show_accuracy=True)
其中遇到的报错:
from keras import activations, initializers # py3要这么写
from keras import activations, initializations # py2要这么写
TypeError: build() takes exactly 1 argument (2 given) # py2无此报错
.
本github里面用Keras做的seq2seq封装比较好,使用的方法有点类似上述的模式二
其中有5款seq2seq款式可以选择:
import seq2seq
from seq2seq.models import SimpleSeq2Seq
model = SimpleSeq2Seq(input_dim=5, hidden_dim=10, output_length=8, output_dim=8)
model.compile(loss=‘mse‘, optimizer=‘rmsprop‘)
depth=3(效果为3 + 3 = 6)或者也可设置深度为(4, 5)
import seq2seq
from seq2seq.models import SimpleSeq2Seq
model = SimpleSeq2Seq(input_dim=5, hidden_dim=10, output_length=8, output_dim=8, depth=3)
model.compile(loss=‘mse‘, optimizer=‘rmsprop‘)
import seq2seq
from seq2seq.models import Seq2Seq
model = Seq2Seq(batch_input_shape=(16, 7, 5), hidden_dim=10, output_length=8, output_dim=20, depth=4)
model.compile(loss=‘mse‘, optimizer=‘rmsprop‘)
the decoder gets a ‘peek’ at the context vector at every timestep.
打开peek=True,类似于上述的模式三
import seq2seq
from seq2seq.models import Seq2Seq
model = Seq2Seq(batch_input_shape=(16, 7, 5), hidden_dim=10, output_length=8, output_dim=20, depth=4, peek=True)
model.compile(loss=‘mse‘, optimizer=‘rmsprop‘)
类似于模式四,带注意力机制
import seq2seq
from seq2seq.models import AttentionSeq2Seq
model = AttentionSeq2Seq(input_dim=5, input_length=7, hidden_dim=10, output_length=8, output_dim=20, depth=4)
model.compile(loss=‘mse‘, optimizer=‘rmsprop‘)
来看一个案例:
def test_Seq2Seq():
x = np.random.random((samples, input_length, input_dim))
y = np.random.random((samples, output_length, output_dim))
models = []
models += [Seq2Seq(output_dim=output_dim, hidden_dim=hidden_dim, output_length=output_length, input_shape=(input_length, input_dim))]
models += [Seq2Seq(output_dim=output_dim, hidden_dim=hidden_dim, output_length=output_length, input_shape=(input_length, input_dim), peek=True)]
models += [Seq2Seq(output_dim=output_dim, hidden_dim=hidden_dim, output_length=output_length, input_shape=(input_length, input_dim), depth=2)]
models += [Seq2Seq(output_dim=output_dim, hidden_dim=hidden_dim, output_length=output_length, input_shape=(input_length, input_dim), peek=True, depth=2)]
for model in models:
model.compile(loss=‘mse‘, optimizer=‘sgd‘)
model.fit(x, y, epochs=1)
model = Seq2Seq(output_dim=output_dim, hidden_dim=hidden_dim, output_length=output_length, input_shape=(input_length, input_dim), peek=True, depth=2, teacher_force=True)
model.compile(loss=‘mse‘, optimizer=‘sgd‘)
model.fit([x, y], y, epochs=1)
其中遇到以下报错:
执行:
SimpleSeq2Seq(Input(shape=(5,), dtype=‘int32‘), hidden_dim=10, output_length=8, output_dim=8)
报错:
/home/amax/.local/lib/python2.7/site-packages/keras/engine/topology.py:1513: UserWarning: Model inputs must come from a Keras Input layer,
they cannot be the output of a previous non-Input layer. Here,
a tensor specified as input to "model_86" was not an Input tensor, it was generated by layer dropout_17.
Note that input tensors are instantiated via `tensor = Input(shape)`.
其中dropout设置不正确,加入dropout=0.3就可以执行
ValueError: Shape must be rank 2 but is rank 3 for ‘lambda_272/MatMul‘ (op: ‘MatMul‘) with input shapes: [?,2], [?,2,2].
笔者之前一直用py2,改用了py3后就无报错了
.
本节参考博文《使用 Keras 实现简单的 Sequence to Sequence 模型》 相关code可见:github
train_x 和 train_y 必须是 3-D 的数据
直接上案例:
from keras.models import Sequential
from keras.layers.recurrent import LSTM
from keras.layers.wrappers import TimeDistributed
from keras.layers.core import Dense, RepeatVector
def build_model(input_size, seq_len, hidden_size):
"""建立一个 sequence to sequence 模型"""
model = Sequential()
model.add(GRU(input_dim=input_size, output_dim=hidden_size, return_sequences=False))
model.add(Dense(hidden_size, activation="relu"))
model.add(RepeatVector(seq_len))
model.add(GRU(hidden_size, return_sequences=True))
model.add(TimeDistributed(Dense(output_dim=input_size, activation="linear")))
model.compile(loss="mse", optimizer=‘adam‘)
return model
之所以说是 “简单的 seq2seq 模型”,就在于第 3 点其实并不符合两篇论文的模型要求,不过要将 Decoder 的每一个时刻的输出作为下一个时刻的输入,会麻烦很多,所以这里对其进行简化,但用来处理 Pig Latin 这样的简单问题,这种简化问题是不大的。
另外,虽然 seq2seq 模型在理论上是能学习 “变长输入序列-变长输出序列” 的映射关系,但在实际训练中,Keras 的模型要求数据以 Numpy 的多维数组形式传入,这就要求训练数据中每一条数据的大小都必须是一样的。针对这个问题,现在的常规做法是设定一个最大长度,对于长度不足的输入以及输出序列,用特殊的符号进行填充,使所有输入序列的长度保持一致(所有输出序列长度也一致)。
.
相关github: https://github.com/ichuang/tflearn_seq2seq
来简单看看实现:
输入:0 1 2 3 4 5 6 7 8 9
输出:prediction=[8 8 5 3 6 5 4 2 3 1] (expected=[9 8 7 6 5 4 3 2 1 0])
[TFLearnSeq2Seq] model weights loaded from t2s__basic__sorted_1.tfl
==> For input [9, 8, 7, 6, 5, 4, 3, 2, 1, 2, 5, 1, 8, 7, 7, 3, 9, 1, 4, 6], prediction=[1 1 1 2 2 3 3 4 4 5 5 6 6 7 7 7 7 8 8 8] (expected=[1 1 1 2 2 3 3 4 4 5 5 6 6 7 7 7 8 8 9 9])
tensorflow实现的中文自动标题生成案例可见:https://github.com/rockingdingo/deepnlp/tree/master/deepnlp/textsum
textsum基于tensorflow (1.0.0) 实现的Seq2Seq-attention模型, 来解决中文新闻标题自动生成的任务。
Example:
Output examples
news: 中央 气象台 TAG_DATE TAG_NUMBER 时 继续 发布 暴雨 蓝色 预警 TAG_NAME_EN 预计 TAG_DATE TAG_NUMBER 时至 TAG_DATE TAG_NUMBER 时 TAG_NAME_EN 内蒙古 东北部 、 山西 中 北部 、 河北 中部 和 东北部 、 京津 地区 、 辽宁 西南部 、 吉林 中部 、 黑龙江 中部 偏南 等 地 的 部分 地区 有 大雨 或 暴雨 。
headline: 中央 气象台 发布 暴雨 蓝色 预警 华北 等 地 持续 暴雨
news: 美国 科罗拉多州 山林 大火 持续 肆虐 TAG_NAME_EN 当地 时间 TAG_DATE 横扫 州 内 第二 大 城市 科罗拉多斯 普林斯 一 处 居民区 TAG_NAME_EN 迫使 超过 TAG_NUMBER TAG_NAME_EN TAG_NUMBER 万 人 紧急 撤离 。 美国 正 值 山火 多发 季 TAG_NAME_EN 现有 TAG_NUMBER 场 山火 处于 活跃 状态 。
headline: 美国 多地 山火 致 TAG_NUMBER 人 死亡
keras系列︱seq2seq系列相关实现与案例(feedback、peek、attention类型)
标签:cti jpg mos get 总结 分享 word drop sop