实施 One-Shot Attention 示例
Posted
技术标签:
【中文标题】实施 One-Shot Attention 示例【英文标题】:Implementing One-Shot Attention Example 【发布时间】:2018-04-05 08:49:43 【问题描述】:我正在尝试实现一次性注意示例:this
如您所见,有一个 data/train_arithmetic.tsv
文件,它在 X (2+70) 中具有算术运算,在 Y (72) 中具有结果。
我理解示例代码:
model = Sequential()
model.add(Bidirectional(GRU(hidden_size, return_sequences=True), merge_mode='concat',
input_shape=(None, input_size)))
model.add(Concurrence())
model.add(RepeatVector(max_out_seq_len + 1))
model.add(GRU(hidden_size * 2, return_sequences=True))
model.add(TimeDistributed(Dense(output_dim=output_size, activation="softmax")))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop")
但对于本例,我不太确定哪些值具有 hidden_size
、input_size
、output_size
和 max_out_seq_len
。
所以我是这样定义的:
hidden_size = 1
input_size = 1 # this is maybe 3
output_size = 1
max_out_seq_len = 1
然后我得到了 x-y_train 和 x-y_set:
X_train, X_test, Y_train, Y_test = train_test_split(data_set[:, 0:1], data_set[:, 1],
test_size=0.25, random_state=87)
np.random.seed
和一切。
我打印了它以确保它产生:
x_train: ['38620+1776']
x_test: ['11+52']
y_train: 40396
y_test: 63
这对我来说很有意义,我可以说它看起来不错。 (我当然可能是错的)
然后我 fit_transform 它:
fitted_x_train = scaler.fit_transform(X_train)
fitted_x_test = scaler.fit_transform(X_test)
它产生:
x_train_fitted: 56867
x_test_fitted: 12870
看起来又不错。
我用的是普通的EarlyStopping
:
early_stop_criteria = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0,
patience=20, verbose=0, mode='auto')
然后试着去适应它:
model_fitted = model.fit(fitted_x_train, Y_train, epochs=1000, verbose=0,
batch_size=X_train.shape[0], initial_epoch=0, callbacks=[early_stop_criteria],
validation_split=0.2)
但是我收到了这个错误:
ValueError:检查输入时出错:预期 bidirectional_1_input 为 3 维,但得到的数组形状为 (75000, 1)
这对我来说很有意义,因为它正在等待 11
+ +
+ 52
而不仅仅是 11+52
。但其实我已经没有头绪了……
也许我做错了整个事情并且有另一种方法来实现它,或者也许我走在正确的道路上,我只需要得到 (75000, 3) 的拆分,这似乎不是那么微不足道对我来说,因为可能有-11+52
也许有人以前实现过这个例子,或者至少知道它应该如何工作。我显然错过了一些东西......
【问题讨论】:
【参考方案1】:我找到了答案。
我完全错了。
hidden_size,我选的是128。
因为它是一个 seq2seq 问题,所以输入大小应该是整个词汇表的长度,在我的例子中,我增加了 2 个,因为“零”和“未知”。
输出大小与输入大小相同。
max_out_seq_len 是句子长度最大的长度。
因为这是一个注意力问题,所以:
X_train, X_test, Y_train, Y_test = train_test_split(data_set[:, 0:1], data_set[:, 1],test_size=0.25, random_state=87)
没有意义。
这就是我改变这个的原因:
X_train, X_test, Y_train, Y_test = train_test_split(data_set[:, 0:],
[str(i[0].split("\t", 1)[1]) for i in data_set[:]],
test_size=0.3, random_state=87)
x 看起来是这样的:x_train: ['1-116\t-115']
和你这样:y_train: -115
这也是一个错误:
model_fitted = model.fit(fitted_x_train, Y_train, epochs=1000, verbose=0,
batch_size=X_train.shape[0], initial_epoch=0, callbacks=[early_stop_criteria],
validation_split=0.2)
应该是这样的:
model_output = model.fit(x_sequences, y_sequences, epochs=10000, verbose=1, batch_size=BATCH_SIZE,
initial_epoch=0, callbacks=[early_stop_criteria], validation_split=0.2)
在哪里BATCH_SIZE = 128
我得到了错误,因为Bidirectional
需要一个 3D 数组。
所以我就这样解决了:
def process_data(word_sentences, max_len, word_to_ix):
# Vectorizing each element in each sequence
sequences = np.zeros((len(word_sentences), max_len, len(word_to_ix)))
for i, sentence in enumerate(word_sentences):
for j, word in enumerate(sentence):
sequences[i, j, word] = 1.
return sequences
我只对关注感兴趣,这就是为什么"1+1\t2" => "2"
有了 gitHub 仓库的数据,我进入了第 6 个 Epoch
56000/56000 [==============================] - 79s - loss: 0.0154 - acc: 0.9955 - val_loss: 0.0030 - val_acc: 0.9991
所以它似乎工作得很好。我得试试更难的数据。
【讨论】:
以上是关于实施 One-Shot Attention 示例的主要内容,如果未能解决你的问题,请参考以下文章
使用暹罗{(Xiānluó),泰国的旧称 one-shot} 网络进行人脸识别