① 数据处理

首先,我们需要将字符转换为数字,以便于在神经网络中进行处理。我们可以使用Python的ord()函数将字符转换为ASCII码,然后将其减去96(因为我们只使用了小写字母a-z,其ASCII码从97开始)。

text = 'if you want you like'
chars = sorted(list(set(text)))
char_to_int = dict((c, i) for i, c in enumerate(chars))
int_to_char = dict((i, c) for i, c in enumerate(chars))

seq_length = 20
dataX = []
dataY = []
for i in range(len(text) - seq_length):
    seq_in = text[i:i+seq_length]
    seq_out = text[i+seq_length]
    dataX.append([char_to_int[char] for char in seq_in])
    dataY.append(char_to_int[seq_out])
n_patterns = len(dataX)
X = numpy.reshape(dataX, (n_patterns, seq_length, 1))
X = X / float(len(chars))
y = np_utils.to_categorical(dataY)

这段代码将文本分成了20个字符的序列,每个序列作为一个输入,下一个字符作为输出。我们还将字符转换为0到1之间的浮点数,以便于神经网络处理。

② 模型创建

model = Sequential()
model.add(LSTM(256, input_shape=(X.shape[1], X.shape[2]), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(256))
model.add(Dropout(0.2))
model.add(Dense(y.shape[1], activation='softmax'))

optimizer = RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

model.fit(X, y, epochs=50, batch_size=64)

我们使用了两层LSTM,每层包含256个单元。我们还添加了一个dropout层,以避免过拟合。我们选择了RMSprop优化器和分类交叉熵作为损失函数。我们进行了50个轮次的训练,并使用64个样本进行了一次训练。

③ 模型预测

start = 'if you want you lik'
pattern = [char_to_int[char] for char in start]
for i in range(20):
    x = numpy.reshape(pattern, (1, len(pattern), 1))
    x = x / float(len(chars))
    prediction = model.predict(x, verbose=0)
    index = numpy.argmax(prediction)
    result = int_to_char[index]
    seq_in = [int_to_char[value] for value in pattern]
    sys.stdout.write(result)
    pattern.append(index)
    pattern = pattern[1:len(pattern)]

这段代码使用了我们训练好的模型,以'if you want you lik'作为输入,逐个字符地预测下一个字符,直到生成20个字符的序列。最终输出的结果应该为'if you want you like'。

使用keras完成字符串预测①	数据处理1	创建字符串 if you want you like2	使用 if you want you lik预测if you want you like3	对数据进行合理预处理②	模型创建1	模型使用两层长短期记忆2	进行训练合理选择优化器损失函数和循环次数③	模型预测1	打印预测值对应的字符串

原文地址: http://www.cveoy.top/t/topic/77F 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录