【问题标题】:Predict Name Origin with RNN使用 RNN 预测名称来源
【发布时间】:2020-04-05 17:24:41
【问题描述】:

我正在尝试训练一个 RNN 来预测名称的来源。数据集来自 Pytorch 教程,我基本上需要使用 tensorflow/keras 重做教程。

数据集:

    !wget https://download.pytorch.org/tutorial/data.zip
    !unzip data.zip

    data = []
    for filename in glob('data/names/*.txt'):
      origin = filename.split('/')[-1].split('.txt')[0]
      names = open(filename).readlines()
      for name in names:
        data.append((name.strip(), origin))

    names, origins = zip(*data)
    names_train, names_test, origins_train, origins_test = train_test_split(names, origins, test_size=0.25, shuffle=True, random_state=123)

    for name, origin in zip(names_train[:20], origins_train[:20]):
      print(name.ljust(20), origin)

Bazhinov             Russian
Wasem                Arabic
Tumashev             Russian
Andreyanov           Russian
Dobrovolsky          Russian
Xie                  Chinese
Zhvykin              Russian
Belkov               Russian
Rahletzky            Russian
Jakuba               Russian
Kalinchuk            Russian
Jankin               Russian
Vanslov              Russian
Seif                 Arabic
Asghar               Arabic
Osladil              Czech
Brand                German
Findley              English
Cameron              English
Tsalikov             Russian

数据预处理:

encoder_train = tf.keras.preprocessing.text.Tokenizer(char_level=True)
encoder_train.fit_on_texts(names_train)

encoder_test = tf.keras.preprocessing.text.Tokenizer(char_level=True)
encoder_test.fit_on_texts(names_test)

sequences = encoder_train.texts_to_sequences(names_train)
sequences= tf.keras.preprocessing.sequence.pad_sequences(sequences)

sequences_test= encoder_test.texts_to_sequences(names_test)
sequences_test= tf.keras.preprocessing.sequence.pad_sequences(sequences_test)

encoder_org_train = tf.keras.preprocessing.text.Tokenizer(lower=False)
encoder_org_train.fit_on_texts(origins_train)

encoder_org_test = tf.keras.preprocessing.text.Tokenizer(lower=False)
encoder_org_test.fit_on_texts(origins_test)

origins_vec_train = encoder_org_train.texts_to_sequences(origins_train)
origins_vec_train = np.asarray(origins_vec_train)

origins_vec_test = encoder_org_test.texts_to_sequences(origins_test)
origins_vec_test = np.asarray(origins_vec_test)

embedding_input_dim = max(encoder_train.index_word) + 1
embedding_output_dim = 32

RNN 模型:

model = tf.keras.models.Sequential(layers=[
  tf.keras.layers.Embedding(input_dim=embedding_input_dim,
                            output_dim=embedding_output_dim,
                            mask_zero=True),
  tf.keras.layers.LSTM(64, return_sequences= True),
  tf.keras.layers.LSTM(32),
  tf.keras.layers.Dense(19, activation='sigmoid')
])
model.compile(loss=tf.keras.losses.SparseCategoricalCrossentropy(),
              optimizer=tf.keras.optimizers.Adam(lr=0.075),
              metrics=['accuracy'])
history = model.fit(sequences, origins_vec_train, epochs=10, batch_size= 200, validation_data= (sequences_test, origins_vec_test))

我的模型训练得很好,并且我得到了比我最初希望的更好的准确度。基本上,我现在要做的是创建一个函数,该函数接受字符串输入,并根据网络的训练输出一个原点(即输入 = 'Sergey',输出 = 'Russian')。 Pytorch 教程中执行此操作的函数需要几个其他函数。我基本上想重新创建这个功能:

def predict(input_line, n_predictions=3):
    print('\n> %s' % input_line)
    with torch.no_grad():
        output = evaluate(lineToTensor(input_line))

        # Get top N categories
        topv, topi = output.topk(n_predictions, 1, True)
        predictions = []

        for i in range(n_predictions):
            value = topv[0][i].item()
            category_index = topi[0][i].item()
            print('(%.2f) %s' % (value, all_categories[category_index]))
            predictions.append([value, all_categories[category_index]])

在我创建的神经网络的上下文中。

【问题讨论】:

  • 请注意,您应该应用 softmax 而不是 sigmoid,因为您正在进行多类分类。
  • 好点,谢谢。
  • 你能说得更具体点吗?请参阅How to Askhelp center

标签: python tensorflow keras neural-network text-classification


【解决方案1】:

您可以使用model.predict 生成预测:docs

另请注意,您对训练集和测试集使用了不同的标记器。如果由于某种原因您的测试集包含训练集中不存在的字符,这将导致问题。你应该只使用一个,你只适合训练集,并使用 out of vocabulary 参数 Tokenizer(char_level=True, oov_token='UNK') 例如。

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 2021-11-03
    • 1970-01-01
    • 2014-08-19
    • 2018-07-23
    • 2018-06-20
    • 2022-07-28
    • 1970-01-01
    • 2020-04-18
    相关资源
    最近更新 更多