今天我试着看看神经网络是否可以预测由20个以前的随机数序列生成的下一个随机数。然而,当我实际使用该模型进行预测时,它只是返回了最常见的数字。我对keras和tensorflow很陌生,所以我不知道如何处理这个问题,也不知道这是否可能。这是代码。
from random import randint
import numpy as np
import tensorflow as tf
def generate_sequence(length=1000000):
rList = []
for i in range(length):
rInt = randint(0, 99)
if rInt >= 0 and rInt <= 47:
rList.append(0)
elif rInt > 47 and rInt <= 71:
rList.append(1)
elif rInt > 71 and rInt <= 87:
rList.append(2)
elif rInt > 87 and rInt <= 95:
rList.append(3)
else:
rList.append(4)
return rList
data = generate_sequence()
train_data = data[:800000]
test_data = data[800000:]
x_train = []
y_train = []
x_test = []
y_test = []
for i in range(0, 799980, 20):
x_train.append(train_data[i:i+20])
y_train.append(train_data[i+20])
for i in range(0, 199980, 20):
x_test.append(test_data[i:i+20])
y_test.append(test_data[i+20])
x_train = tf.keras.utils.normalize(x_train, axis=1)
x_test = tf.keras.utils.normalize(x_test, axis=1)
x_train = np.asarray(x_train)
y_train = np.asarray(y_train)
x_test = np.asarray(x_test)
y_test = np.asarray(y_test)
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(625, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(125, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(25, activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(5, activation=tf.nn.softmax))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss, val_acc)
prediction = model.predict([x_test])
for pred in prediction:
print(np.argmax(pred))
我认为您无法根据过去的输出从Python的随机模块中预测数字。random
模块使用仅在2^19937-1
数字之后重复的Mersenne Twister。神经网络无法根据以前的数字预测以下数字。
你的神经网络返回最常见的数字的原因是,由于之前的20个数字和下面的数字之间没有相关性,神经网络能做的最好的事情就是猜测最常见的,因为这是训练中得分最高的数字。
如果你的目标是破解Python的随机模块,那么这个建议计算Mersenne Twister状态的答案可能会有所帮助。