使用keras完成字符串预测① 数据处理1 创建字符串 if you want you like2 使用 if you want you lik预测if you want you like3 对数据进行合理预处理② 模型创建1 模型使用两层长短期记忆2 进行训练合理选择优化器损失函数和循环次数③ 模型预测1 打印预测值对应的字符串
① 数据处理
首先,我们需要将字符转换为数字,以便于在神经网络中进行处理。我们可以使用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'。
原文地址: http://www.cveoy.top/t/topic/77F 著作权归作者所有。请勿转载和采集!