我正在尝试使用keras训练n元网络。n元组网络只是一个单热激活模式的稀疏数组。想象一个有64个方格的棋盘,每个方格包含可能的N种类型的棋子,所以总是有64个激活的棋子,对于64*N个可能的参数,并存储为二维数组[64][N]。或者每一个可能的2x2平方,所以每一个这样的平方有N^4个可能的构型。这种网络是线性的,输出1个值。培训是一个很好的老SGD之类的。
我成功地训练了网络使用我的代码在c++中,使用查找表和求和。但我试着做keras,因为keras允许不同的优化算法,使用gpu等。首先,我将2d数组更改为大向量,但很快就变得不切实际。有数千个可能的参数,其中只有少数(固定)数量的1,其余的都是0。
我想知道是否在keras(或类似的库)中可以使用这样的训练数据:13,16,11,11,5,…,3,其中这些数字将是索引,而不是使用一个大向量0,0,0,1,0,0,0,......,1,0,0,0,....,1,0,0,0,…
您可以使用,tf.sparse.SparseTensor(…),然后为tf.keras.Input(…)设置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, ...)