用于 N 元组网络的 Keras(稀疏输入)

Keras for N-tuple Network (sparse input)

我正在尝试使用 keras 训练 N 元组网络。 N 元组网络只是单热激活模式的稀疏数组。想象一下有 64 个方格的棋盘,每个方格包含 N 种可能的棋子,因此对于 64*N 种可能的参数,总会有 64 个激活的棋子,并存储为二维数组 [64][N]。或者每个可能的 2x2 正方形,因此每个这样的正方形都有 N^4 个可能的配置。这样的网络是线性的,将输出 1 个值。训练好的老新元之类的

我使用我的 C++ 代码、查找表和求和成功地训练了网络。但我尝试在 keras 上进行,因为 keras 允许不同的优化算法,使用 GPU 等。对于初学者,我将 2d 数组更改为大向量,但很快就变得不切实际了。有数千个可能的参数,其中只有少数(固定)个数,其余为零。

我想知道在 keras(或类似库)中是否可以使用这样的训练数据:13,16,11,11,5,...,3,这些数字将是索引,而不是使用一个大向量 0,0,0,1,0,0,......,1,0,0,0,....,1,0,0,0,...

你可以使用,tf.sparse.SparseTensor(...), then set sparse=True, for 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 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, ...)