Python N元组网络的Keras(稀疏输入)
我正在尝试使用keras训练N元组网络。N元组网络只是一个热激活模式的稀疏数组。假设棋盘上有64个方块,每个方块包含可能的N种棋子,因此,对于64*N个可能的参数,将始终有64个激活的方块,并存储为2d数组[64][N]。或者每个可能的2x2正方形,因此每个正方形有N^4个可能的配置。这种网络是线性的,将输出1个值。培训是一个很好的老SGD之类的Python N元组网络的Keras(稀疏输入),python,tensorflow,machine-learning,keras,sparse-matrix,Python,Tensorflow,Machine Learning,Keras,Sparse Matrix,我正在尝试使用keras训练N元组网络。N元组网络只是一个热激活模式的稀疏数组。假设棋盘上有64个方块,每个方块包含可能的N种棋子,因此,对于64*N个可能的参数,将始终有64个激活的方块,并存储为2d数组[64][N]。或者每个可能的2x2正方形,因此每个正方形有N^4个可能的配置。这种网络是线性的,将输出1个值。培训是一个很好的老SGD之类的 我用C++中的代码,使用查找表和求和,成功地训练了网络。但我尝试使用keras,因为keras允许使用不同的优化算法、GPU等。对于初学者,我将2d数
我用C++中的代码,使用查找表和求和,成功地训练了网络。但我尝试使用keras,因为keras允许使用不同的优化算法、GPU等。对于初学者,我将2d数组更改为大向量,但很快它就变得不切实际了。有数千个可能的参数,其中只有少数(固定)个1,其余为0
我想知道在keras(或类似的库)中是否可以使用这样的训练数据:13,16,11,11,5,…,3,其中这些数字将是索引,而不是使用一个大向量0,0,0,0,0,…,1,0,0,0,…,1,0,0,…,0,你可以使用,),然后设置sparse=True
非常感谢。也许它现在并没有完全解决我的问题,至少我知道该找什么了。
def sparse_one_hot(y):
m = len(y)
n_classes = len(tf.unique(tf.squeeze(y))[0])
dim2 = tf.range(m, dtype='int64')[:, None]
indices = tf.concat([y, dim2], axis=1)
ones = tf.ones(shape=(m, ), dtype='float32')
sparse_y = tf.sparse.SparseTensor(indices, ones, dense_shape=(m, n_classes))
return sparse_y
import tensorflow as tf
y = tf.random.uniform(shape=(10, 1), minval=0, maxval=4, dtype=tf.int64)
sparse_y = sparse_one_hot(y) # sparse_y.values, sparse_y.indices
# set sparse=True, for Input
# tf.keras.Input(..., sparse=True, ...)