这实现了 99.74% 的准确率和 99.69% 的验证准确率。
import tensorflow as tf, numpy as np
def int2bits(i,fill=20):
return list(map(int,bin(i)[2:].zfill(fill)))
def bits2int(b):
return sum(i*2**n for n,i in enumerate(reversed(b)))
# Data.
I = np.random.randint(0,2**20,size=(250_000,))
X = np.array(list(map(int2bits,I)))
Y = np.array([int2bits(2**i,7) for i in I % 7])
# Test Data.
It = np.random.randint(0,2**20,size=(10_000,))
Xt = np.array(list(map(int2bits,It)))
Yt = np.array([int2bits(2**i,7) for i in It % 7])
# Model.
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(1000,'relu'),
tf.keras.layers.Dense(7,'softmax'),
])
model.compile('adam','categorical_crossentropy',['accuracy'])
# Train.
model.fit(X,Y,10_000,100,validation_data=(Xt,Yt))
一些要点:
1)你的数据太少了。您对从 0 到 2**20 的点进行统一采样,但只采样了 10,000 个,这仅占模型应该了解的可能向量的 1% 左右。关键是,许多组件(以二进制表示形式)大多固定为 0 或 1,而没有机会了解它们在整体数据中的功能或它们如何与其他组件交互。
2)你需要一个嵌入层,即将空间扩展到一些巨大的更高维度,这样神经元就可以更容易地移动。这使得学习能够更好地洗牌,希望找到您正在寻找的算法。单个 Dense(1000) 似乎可以工作。
3) 运行 10_000 批(只是为了最大限度地提高 CPU 使用率)。跑了 100 个 epoch。在训练中包含我的validation_data,这样我就可以看到验证集在每个时期的表现如何(这不会影响训练,只是可以更容易地看到模型在训练时是否表现良好)。
谢谢。 :-)