Keras Lambda Layer给出ValueError:尝试拟合模型时不支持任何值

时间:2017-06-09 23:34:12

标签: python machine-learning tensorflow keras

我在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

0 个答案:

没有答案