我正在尝试使用Keras训练N元组网络。N元组网络只是一组稀疏的独热编码激活模式。想象一下一个有64个方格的棋盘,每个方格可以包含N种类型的棋子,因此总会有64个被激活的棋子,共有64*N个可能的参数,并存储为2维数组[64][N]。或者每个可能的2×2方格,如此每个方格有N^4种可能的配置。这种网络是线性的,将输出一个值。训练使用的是传统的SGD及其变体。
我使用C++编写的代码成功训练了网络,使用了查找表和求和方法。但我尝试使用Keras来做,因为Keras允许使用不同的优化算法、GPU等。起初,我将2维数组转换为一个大向量,但很快就变得不切实际。有数千个可能的参数,其中只有少数(固定数量)的1,其余都是0。
我想知道在Keras(或类似的库)中是否可以使用这样的训练数据:13,16,11,11,5,…,3,这些数字将作为索引,而不是使用一个大的向量,如0,0,0,1,0,0,……,1,0,0,0,….,1,0,0,0,…
回答:
你可以使用,tf.sparse.SparseTensor(…),然后设置sparse=True
,用于tf.keras.Input(…)。
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 tfy = 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, ...)