首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于seq2seq模型的机器翻译

基于seq2seq模型的机器翻译
EN

Data Science用户
提问于 2017-08-28 11:18:00
回答 2查看 1.2K关注 0票数 5

我正在尝试使用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

其他参数

代码语言:javascript
复制
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的结果。

测试句子:

代码语言:javascript
复制
डेली हिन्दी न्यूज - बुंदेलखंड का प्रथम अन्तरजालीय स्थल
मैं भारत से प्यार करता हूँ
ज़बूर जो कि दाउद को प्रदान की गयी
प्रशासनिक विभाजन
वे इस देश के प्रथम UNK -LRB- अफ्रीकी UNK -RRB-
नेपाली विदेश
वेल्श खिलाड़ी इंग्लैंड के लिए खेलने के लिए पात्र हैं
उनके बड़े भाई अजीत तेंडुलकर ने उन्हें खेलने के लिये प्रोत्साहित किया था ।
फिर एक मिनट के बाद किताब छत की ओर उछालकर उन्होंने कहा - चलो ।

结果:

代码语言:javascript
复制
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

我不明白这个结果背后的问题。我用过一些和训练句一样的句子。至少对他们来说答案应该是正确的。

我做错什么了吗?我真的很感激你的帮助

回答-

代码语言:javascript
复制
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)
EN

回答 2

Data Science用户

发布于 2017-08-28 11:40:38

显然,优化你的损失函数只能预测英语中最常见的单词。换句话说,可能性显然很小。我不是专家,但我会检查三件事。1.损失汇合需要多长时间?通过输出,您可以看到它很可能不需要很长时间。2.也许试着过滤掉,这样你在句子中就有了不同的单词。3.检查它是否有助于优化另一个会偏向于更多不同句子的损失函数。我希望这至少能给你一些想法。

票数 3
EN

Data Science用户

发布于 2017-08-28 11:50:50

这是Seq2Seq模型中常见的问题。我还没有尝试过机器翻译,但是我尝试过文本生成,并且被这个重复单词的问题困住了。问题是学习重量,我相信。即使使用GPU,也要花费近一周的时间才能获得相当好的效果。我猜你用过CPU。当然,CPU花费的时间比44小时要长得多。

票数 3
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/22644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档