上课代码(备用版)

from tensorflow.keras.models import Sequential, Model
from tensorflow.keras.layers import Input, Embedding, Dense, Activation, SimpleRNN, Flatten, LSTM
from tensorflow.keras import losses, optimizers

导入TensorFlow Keras库中的Sequential、Model、Input、Embedding、Dense、Activation、SimpleRNN、Flatten、LSTM等模块和losses、optimizers等子模块。
hidden_size = 256
vocab_size = 10000

定义隐藏层的大小为256,词汇表的大小为10000。
inp = Input(shape=(32,))
x = Embedding(vocab_size, hidden_size)(inp)
x = SimpleRNN(hidden_size)(x)
x = Flatten()(x)
x = Dense(vocab_size)(x)
pred = Activation('softmax')(x)

定义输入层,输入形状为(32,)。使用嵌入层将输入映射到hidden_size维度的向量上,然后使用简单循环神经网络层对向量序列进行处理。接着通过展平层将输出转化为一维向量,再通过全连接层将向量映射到词汇表大小的向量上。最后,用softmax函数激活输出。
model = Model(inp, pred)
model.summary()

定义模型,并输出模型的摘要信息。
from sklearn.model_selection import train_test_split
X_train, X_test, Y_train, Y_test = train_test_split(X_digit, Y_digit, test_size=0.2, random_state=0)

从sklearn库中导入train_test_split方法,将数据集分为训练集和测试集。
model.compile(loss='sparse_categorical_crossentropy', optimizer=optimizers.Adam(learning_rate=0.001))
model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=10000, epochs=10)

编译模型,使用稀疏分类交叉熵损失函数和Adam优化器进行训练。使用训练集和测试集进行训练,每批处理10000个样本,共进行10轮迭代。
sample_text = ['床', '前', '明']
print(sample_text)

定义一个文本样本,并输出该样本。
tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(sample_text)

sample_index = tokenizer.texts_to_sequences(sample_text)
print(sample_index)

使用Tokenizer将文本转化为序列,并将序列输出。
word_prob = model.predict(np.array(sample_index).reshape(1, 3))[0]
print(tokenizer.index_word[word_prob.argmax()], word_prob.max())

将序列输入到模型中进行预测,并输出预测结果对应的词汇表中的词语和概率值

```
import numpy as np
import pandas as pd
poems_text = pd.read_table('poems_clean.txt', header=None)
poems_text.columns = ["text"]
poems_text.head()
```
导入NumPy和Pandas库,读取名为'poems_clean.txt'的文本文件,将其转换为Pandas数据框,并命名列名为"text"。最后输出数据框的前几行。

```
poems_new = []
for line in poems_text['text']:
    title, poem = line.split(':')
    poem = poem.replace('\n', '')
    poems_new.append(list(poem))
XY = []
for poem in poems_new:
    for i in range(len(poem) - 3):
        x1 = poem[i]
        x2 = poem[i+1]
        x3 = poem[i+2]
        y = poem[i+3]
        XY.append([x1, x2, x3, y])
print("原始诗句:")
print(poems_text['text'][3864])
print("训练数据:")
print(["X1", "X2", "X3", "y"])
for i in range(132763, 132773):
    print(xy[i])
```
对读取的文本进行预处理,将每个句子分成标题和正文两部分,去除正文中的换行符并将正文转换为列表形式。然后将每个句子拆分成长度为4的序列,前三个元素作为输入X,最后一个元素作为输出Y。最后输出一些训练数据,包括X和Y。

```
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(poems_new)
vocab_size = len(tokenizer.word_index) + 1
print(tokenizer.word_index)
XY_digit = np.array(tokenizer.texts_to_sequences(XY))
X_digit = XY_digit[:, :3]
Y_digit = XY_digit[:, 3]
```
从Keras库中导入Tokenizer模块,使用它将处理后的文本转换为序列,得到词汇表大小。然后将训练数据中的X和Y转换为数字形式。

```
for i in range(132763, 132773):
    print("{:<30}".format(str(xy[i])), "\t", "{:<30}".format(str(list(x_digit[i]))), "\t", y_digit[i])
```
输出部分数字化后的训练数据,包括原始文本、数字化后的X和Y。

猜你喜欢

转载自blog.csdn.net/hello__D/article/details/131176374
今日推荐