我正在尝试实施一次性关注示例: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 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
也许某人之前已经实施了这个例子,或者至少知道它应该如何运作。我显然错过了一些东西......
答案 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
所以看起来效果很好。我要尝试更难的数据。