如何从Keras模型中获取数据以进行可视化?

时间:2018-11-21 19:18:05

标签: python tensorflow keras conv-neural-network

我正在使用Tensorflow 1.12,该版本将Keras与Python 3.6.x集成在一起

我希望使用Keras简化模型构建,但也希望使用中间层上的数据可视化特征图和内核,以更好地理解机器学习的工作原理(尽管这显然不是很明显)

我正在使用mnist数据库和一个非常基本的Keras模型来尝试做我想做的事情。

这是代码

import tensorflow as tf
from tensorflow.keras import layers
from tensorflow import keras

print(tf.VERSION)
print(tf.keras.__version__)

tf.keras.backend.clear_session()

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train_shaped = np.expand_dims(x_train, axis=3) / 255.0
x_test_shaped = np.expand_dims(x_test, axis=3) / 255.0

def create_model():

  model = tf.keras.models.Sequential([
    keras.layers.Conv2D(32, kernel_size=(4, 4),strides=(1,1),activation='relu', input_shape=(28,28,1)),
    keras.layers.Dropout(0.5),
    keras.layers.MaxPooling2D(pool_size=(2,2), strides=(2,2)),
    keras.layers.Conv2D(24, kernel_size=(8, 8),strides=(1,1)),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.5),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
  ])

  model.compile(optimizer=tf.keras.optimizers.Adam(), 
            loss=tf.keras.losses.sparse_categorical_crossentropy,
            metrics=['accuracy'])

  return model

上面设置了数据集和模型 接下来,我定义Tensorflow的课程并进行培训。

这一切都很好,但是现在我想获取第一层的数据,最好是一个可以进行可视化的numpy数组。

我的model.layers[0].output给了我Tensor的{​​{1}},现在我尝试做一个(?,25,25,32),然后尝试一个eval()方法来得到我的结果

错误消息是

.numpy()

我正在寻求有关如何获取数据(32个25x25像素的特征图)作为numpy数组进行可视化的帮助。

You must feed a value for placeholder tensor 'conv2d_6_input' with dtype float and shape [?,28,28,1]

1 个答案:

答案 0 :(得分:1)

首先,必须注意,只有在向输入层提供一些数据时,才有意义获取模型或层的输出。您得到模型的某些东西(即输入数据),得到一些回报(即输出或特征图或激活图)。这就是为什么它将产生以下错误的原因:

  

您必须输入占位符张量“ conv2d_6_ 输入

的值

您还没有喂婴儿,所以它会哭:)

  

现在,建立新的Keras模型的想法适得其反。首先,当您拥有大型模型时,您希望插入某种现成的代码,这些代码可以获取要素图的输出并对其进行可视化。因此,这条路线似乎并不是很有趣。

我认为您错误地认为,当您从另一个模型的各层构造一个新模型时,会克隆一个全新的模型。并非如此,因为将共享图层的参数。

具体来说,您正在寻找的东西可以这样实现:

viz_conv = Model(model.input, model.layers[0].output)
conv_active = viz_conv(my_input_data)  # my_input_data is a numpy array of shape `(num_samples,28,28,1)`

viz_conv的所有参数都与model共享,它们也没有被复制。他们在引擎盖下使用了相同重量的张量。

或者,您可以定义一个后端函数来做到这一点:

from tensorflow.keras import backend as K

viz_func = K.function([model.input], [any layer(s) you would like in the model])
output = viz_func([my_input_data])

Keras documentation对此进行了介绍,我强烈建议您也阅读该文章。