train_dir = "weibo21/data/train.txt" vocab_dir = "weibo21/data/vocab.pkl" pretrain_dir = "weibo21/data/sgns.sogou.char" emb_dim = 300 filename_trimmed_dir = "weibo21/data/embedding_SougouNews" if os.path.exists(vocab_dir): word_to_id = pkl.load(open(vocab_dir, 'rb')) else: # tokenizer = lambda x: x.split(' ') # 以词为单位构建词表(数据集中词之间以空格隔开) tokenizer = lambda x: [y for y in x] # 以字为单位构建词表 word_to_id = build_vocab(train_dir, tokenizer=tokenizer, max_size=MAX_VOCAB_SIZE, min_freq=1) pkl.dump(word_to_id, open(vocab_dir, 'wb')) embeddings = np.random.rand(len(word_to_id), emb_dim) f = open(pretrain_dir, "r", encoding='UTF-8') for i, line in enumerate(f.readlines()): # if i == 0: # 若第一行是标题,则跳过 # continue lin = line.strip().split(" ") if lin[0] in word_to_id: idx = word_to_id[lin[0]] emb = [float(x) for x in lin[1:301]] embeddings[idx] = np.asarray(emb, dtype='float32') f.close() np.savez_compressed(filename_trimmed_dir, embeddings=embeddings)
时间: 2024-04-28 14:21:03 浏览: 204
这段代码的作用是:
- 定义了一些变量,例如 `train_dir` 存储训练数据的文件路径,`vocab_dir` 存储词表的路径,`pretrain_dir` 存储预训练词向量的路径,`emb_dim` 存储词向量的维度,`filename_trimmed_dir` 存储截断后词向量的路径。
- 判断词表文件是否存在,若存在则从文件中读取词表,否则根据训练数据构建词表并将其保存到文件中。
- 初始化一个随机的词向量矩阵 `embeddings`,其行数为词表的大小,列数为指定的词向量维度。
- 读取预训练词向量文件并将其加载到 `embeddings` 矩阵中,若预训练词向量中有某个词汇在词表中不存在,则该词汇的词向量使用随机值进行初始化。
- 将截断后的词向量矩阵保存到文件中。
相关问题
train_dir = "weibo21/data/train.txt" vocab_dir = "weibo21/data/vocab.pkl" pretrain_dir = "weibo21/data/sgns.sogou.char" emb_dim = 300 filename_trimmed_dir = "weibo21/data/embedding_SougouNews"
这段代码定义了一些变量,其作用如下:
- train_dir:指定训练数据的文件路径;
- vocab_dir:指定词表文件的路径;
- pretrain_dir:指定预训练词向量文件的路径;
- emb_dim:指定词向量的维度;
- filename_trimmed_dir:指定处理后的词向量文件的路径。
这些变量的设置是为了方便后续在训练模型时使用。具体来说,训练数据可以通过train_dir指定,词表可以通过vocab_dir指定,预训练词向量文件可以通过pretrain_dir指定,在训练过程中需要指定词向量维度,因此通过emb_dim进行设置,最后,处理后的词向量文件可以通过filename_trimmed_dir指定。
# 最佳权重保存路径 BEST_MODEL_PATH = './best_model.h5'
好的,你可以将最佳权重保存路径添加到代码中,如下所示:
```python
import numpy as np
import tensorflow as tf
import os
# 加载数据集
with open('poems.txt', 'r', encoding='utf-8') as f:
data = f.read()
# 构建词典
vocab = sorted(set(data))
char2idx = {char: idx for idx, char in enumerate(vocab)}
idx2char = np.array(vocab)
# 将文本数据转换为数字
text_as_int = np.array([char2idx[c] for c in data])
# 定义训练数据和标签
seq_length = 100
examples_per_epoch = len(data) // (seq_length + 1)
char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)
sequences = char_dataset.batch(seq_length + 1, drop_remainder=True)
def split_input_target(chunk):
input_text = chunk[:-1]
target_text = chunk[1:]
return input_text, target_text
dataset = sequences.map(split_input_target)
BATCH_SIZE = 128
BUFFER_SIZE = 10000
dataset = dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE, drop_remainder=True)
# 构建模型
vocab_size = len(vocab)
embedding_dim = 256
rnn_units = 1024
def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
model = tf.keras.Sequential([
tf.keras.layers.Embedding(vocab_size, embedding_dim,
batch_input_shape=[batch_size, None]),
tf.keras.layers.GRU(rnn_units,
return_sequences=True,
stateful=True,
recurrent_initializer='glorot_uniform'),
tf.keras.layers.Dense(vocab_size)
])
return model
model = build_model(
vocab_size=len(vocab),
embedding_dim=embedding_dim,
rnn_units=rnn_units,
batch_size=BATCH_SIZE)
# 定义损失函数
def loss(labels, logits):
return tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True)
# 编译模型
model.compile(optimizer='adam', loss=loss)
# 定义检查点
checkpoint_dir = './training_checkpoints'
checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")
checkpoint_callback=tf.keras.callbacks.ModelCheckpoint(
filepath=checkpoint_prefix,
save_weights_only=True)
# 定义最佳权重检查点
BEST_MODEL_PATH = './best_model.h5'
best_checkpoint = tf.keras.callbacks.ModelCheckpoint(BEST_MODEL_PATH,
monitor='val_loss',
save_best_only=True,
mode='min',
save_weights_only=True)
# 训练模型
EPOCHS = 50
history = model.fit(dataset, epochs=EPOCHS, callbacks=[checkpoint_callback, best_checkpoint])
# 生成诗歌
def generate_text(model, start_string):
num_generate = 100
input_eval = [char2idx[s] for s in start_string]
input_eval = tf.expand_dims(input_eval, 0)
text_generated = []
temperature = 1.0
model.reset_states()
for i in range(num_generate):
predictions = model(input_eval)
predictions = tf.squeeze(predictions, 0)
predictions = predictions / temperature
predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()
input_eval = tf.expand_dims([predicted_id], 0)
text_generated.append(idx2char[predicted_id])
return (start_string + ''.join(text_generated))
# 加载检查点
model = build_model(vocab_size, embedding_dim, rnn_units, batch_size=1)
model.load_weights(BEST_MODEL_PATH)
model.build(tf.TensorShape([1, None]))
# 生成一首诗
print(generate_text(model, start_string=u"山中"))
```
现在,模型将保存最佳的权重到文件 `best_model.h5`。
阅读全文