【问题标题】:Is there a way to apply K-Means to the output of Conv/Dense layers in tensorflow?有没有办法将 K-Means 应用于 tensorflow 中的 Conv/Dense 层的输出?
【发布时间】:2020-06-05 11:22:08
【问题描述】:

我已经使用以下配置对时尚 MNIST 数据训练了一个 CNN: Conv-Pool-Dropout-Conv-Pool-Dropout-Flat-Dense-Dropout-Output 我想将配置更改为: Conv-Clustering-Pool-Dropout-Conv-Clustering-Pool-Dropout-Flat-Dense-Clustering-Dropout-Output 但是,我希望这个新配置仅用于测试而不是训练模型(我可以使用训练模型中的权重并将它们设置为具有聚类配置的模型)。有没有办法使用 tensorflow 添加聚类层? 我想使用聚类质心来表示 Conv 和 Dense 层的输出,以检查对模型准确性的影响。

【问题讨论】:

    标签: python tensorflow deep-learning


    【解决方案1】:

    你问的其实是两个问题:

    1. 如何仅在某些配置中应用操作而不在其他配置中应用操作?
    2. 如何应用 k-means?

    以下是答案:

    1. 要根据某个 tensorflow 变量 do_clustering 的值应用操作,您可以使用 tf.cond 和:

      maybe_clustered_ouput = tf.cond(do_clustering,
                                      lambda: my_clustering_operation(input),
                                      lambda: input)
      
    2. 要应用 k-means 聚类,您可以使用 tf.compat.v1.estimator.experimental.KMeans(并将其替换为上述 sn-p 中的 my_clustering_operation`)

    祝你好运:)

    【讨论】:

    • 感谢您的建议。我试过这样的东西: conv1 = Conv2D(64, kernel_size=(3,3), padding='same', activation='relu', name='Conv1')(inputs) Test = Lambda(k_means_activations, name= 'Test_Layer')(conv1) 其中 k_means_activation 是使用 tf.compat.v1.estimator.experimental.KMeans 的函数。但是,我得到了错误: ValueError: Tensor("Test_Layer/strided_slice:0", shape=(), dtype=int32) must be from the same graph as Tensor("Equal:0", shape=(), dtype=布尔)。我没有使用这个模型进行训练,而只是使用训练模型的权重进行测试。这个错误明显吗?
    • 避免以这种方式使用 Lambda,因为 AFAIK 这不是它应该被使用的方式(根据tensorflow.org/api_docs/python/tf/keras/layers/Lambda,它应该接收一个函数作为第一个参数,而不是一个激活层)。尝试做一些更类似于我建议的 sn-p 的事情?
    • 我应该澄清 k_means_activations 是我使用 KMeans 估计器的函数。但是,我会完全按照您的建议进行尝试。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2018-06-21
    • 2012-07-13
    • 1970-01-01
    • 2020-08-03
    • 2016-10-20
    相关资源
    最近更新 更多