实施一次性注意示例

时间:2017-10-24 13:59:23

标签: python neural-network keras artificial-intelligence recurrent-neural-network

我正在尝试实施一次性关注示例: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_sizeinput_sizeoutput_sizemax_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 it:

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 个答案:

答案 0 :(得分:0)

我找到了答案。

我完全错了。

hidden_​​size,我选择了128.

因为它是一个seq2seq问题,输入大小应该是整个词汇表的长度,在我的情况下我增加了2个,因为' ZERO'和' UNKNOWN'。

输出大小与输入大小相同。

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所以: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存储库的数据,我即将进入第六纪元

56000/56000 [==============================] - 79s - loss: 0.0154 - acc: 0.9955 - val_loss: 0.0030 - val_acc: 0.9991

所以看起来效果很好。我要尝试更难的数据。