我在Keras写了一个lambda图层来稀疏输入:
def sparsify(x, percent_zero_dims):
k_val = int((1.0 - percent_zero_dims / 100.0) * K.int_shape(x)[1])
values, indices = tf.nn.top_k(x, k=k_val, sorted=False)
# We need to create full indices like [[0, 0], [0, 1], [1, 2], [1, 1]]
my_range = tf.expand_dims(tf.range(0, K.shape(indices)[0]), 1) # will be [[0], [1]]
my_range_repeated = tf.tile(my_range, [1, k_val]) # will be [[0, 0], [1, 1]]
# change shapes to [N, k, 1] and [N, k, 1], to concatenate into [N, k, 2]
full_indices = tf.concat([tf.expand_dims(my_range_repeated, 2), tf.expand_dims(indices, 2)], 2)
full_indices = tf.reshape(full_indices, [-1, 2])
output = tf.sparse_to_dense(full_indices, K.shape(x), tf.reshape(values, [-1]), default_value=0.,
validate_indices=False)
return output
我在我的模型中通过以下方式调用lambda图层:
sparse = Lambda(lambda x: sparsify(x, sparse_perc))(relu)
输入形状为(None,32),并且(None,32)正在输出。我还将此lambda图层编写为自定义图层,这会引发相同的错误。如果我将模型输出设置为relu,它会很好地训练,但是当我使用稀疏作为输出时,模型会抛出
line 360, in make_tensor_proto
raise ValueError("None values not supported.")
我可以预测模型,编译,没有问题并获得预期的结果,但是当我尝试拟合它时,模型会抛出错误。我相信它与从此输出生成的无效丢失有关,如堆栈跟踪中所示:
line 1014, in _make_train_function
self.total_loss)...
我尝试从稀疏层的输出中删除任何nans(我知道这不是一个好习惯,但我只是想弄清楚它在哪里/如何破坏):
Lambda(lambda x: tf.where(tf.is_nan(x), tf.zeros_like(x), x))(sparse)
这种情况发生在模型中的其他几个自定义图层上,但不是全部,这就是为什么我感到困惑。
规格: python 3.5
mac osx
Keras 2.0.4
1.19