【发布时间】: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 Ask、help center。
标签: python tensorflow keras neural-network text-classification