我正在尝试使用s2s模型,以下- https://chunml.github.io/ChunML.github.io/project/Sequence-To-Sequence/来执行印地语到英语的翻译。
我使用了包含37726句句子的https://github.com/karimkhanp/Seq2Seq/tree/master/data数据集进行训练。
在我的8GB机器上训练大约花了44个小时。我考虑过3 layers, 10 epoch, 20000 vocap size
其他参数
ap.add_argument('-max_len', type=int, default=200)
ap.add_argument('-vocab_size', type=int, default=20000)
ap.add_argument('-batch_size', type=int, default=100)
ap.add_argument('-layer_num', type=int, default=3)
ap.add_argument('-hidden_dim', type=int, default=1000)
ap.add_argument('-nb_epoch', type=int, default=10)
ap.add_argument('-mode', default='train') 但是现在,当我用印地语进行测试时,它给出了所有单词的UNK。虽然我的测试和训练一样,但它说的是UNK的结果。
测试句子:
डेली हिन्दी न्यूज - बुंदेलखंड का प्रथम अन्तरजालीय स्थल
मैं भारत से प्यार करता हूँ
ज़बूर जो कि दाउद को प्रदान की गयी
प्रशासनिक विभाजन
वे इस देश के प्रथम UNK -LRB- अफ्रीकी UNK -RRB-
नेपाली विदेश
वेल्श खिलाड़ी इंग्लैंड के लिए खेलने के लिए पात्र हैं
उनके बड़े भाई अजीत तेंडुलकर ने उन्हें खेलने के लिये प्रोत्साहित किया था ।
फिर एक मिनट के बाद किताब छत की ओर उछालकर उन्होंने कहा - चलो ।结果:
of of of
of of of
the of of of
lrb lrb rrb rrb
the the of of of
the the of of of of
the the the of of of of我不明白这个结果背后的问题。我用过一些和训练句一样的句子。至少对他们来说答案应该是正确的。
我做错什么了吗?我真的很感激你的帮助
回答-
if MODE == 'train':
k_start = 1
t1 = time()
# If any trained weight was found, then load them into the model
if len(saved_weights) != 0:
print('[INFO] Saved weights found, loading...')
epoch = saved_weights[saved_weights.rfind('_')+1:saved_weights.rfind('.')]
model.load_weights(saved_weights)
k_start = int(epoch) + 1
i_end = 0
for k in range(k_start, NB_EPOCH+1):
# Shuffling the training data every epoch to avoid local minima
indices = np.arange(len(X))
np.random.shuffle(indices)
X = X[indices]
y = y[indices]
# Training 1000 sequences at a time
for i in range(0, len(X), 1000):
if i + 1000 >= len(X):
i_end = len(X)
else:
i_end = i + 1000
y_sequences = process_data(y[i:i_end], y_max_len, y_word_to_ix)
print('[INFO] Training model: epoch {}th {}/{} samples'.format(k, i, len(X)))
model.fit(X[i:i_end], y_sequences, batch_size=BATCH_SIZE, nb_epoch=1, verbose=2)
model.save_weights('checkpoint_epoch_{}.hdf5'.format(k))
print("Time taken to train the data in hour=>", (time()-t1)/3600)
# Performing test if we chose test mode
else:
# Only performing test if there is any saved weights
if len(saved_weights) == 0:
print("The network hasn't been trained! Program will exit...")
sys.exit()
else:
# import pdb
# pdb.set_trace()
X_test = load_test_data('test', X_word_to_ix, MAX_LEN)
X_test = pad_sequences(X_test, maxlen=X_max_len, dtype='int32')
model.load_weights(saved_weights)
# print(X_test)
# print(model.predict(X_test))
predictions = np.argmax(model.predict(X_test), axis=2)
# print(predictions)
# print(y_ix_to_word)
sequences = []
for prediction in predictions:
sequence = ' '.join([y_ix_to_word[index] for index in prediction if index > 0])
print(sequence)
sequences.append(sequence)发布于 2017-08-28 11:40:38
显然,优化你的损失函数只能预测英语中最常见的单词。换句话说,可能性显然很小。我不是专家,但我会检查三件事。1.损失汇合需要多长时间?通过输出,您可以看到它很可能不需要很长时间。2.也许试着过滤掉,这样你在句子中就有了不同的单词。3.检查它是否有助于优化另一个会偏向于更多不同句子的损失函数。我希望这至少能给你一些想法。
发布于 2017-08-28 11:50:50
这是Seq2Seq模型中常见的问题。我还没有尝试过机器翻译,但是我尝试过文本生成,并且被这个重复单词的问题困住了。问题是学习重量,我相信。即使使用GPU,也要花费近一周的时间才能获得相当好的效果。我猜你用过CPU。当然,CPU花费的时间比44小时要长得多。
https://datascience.stackexchange.com/questions/22644
复制相似问题