卷积层可视化错误(缺少前一层元数据)



我试图可视化卷积层输出,看看模型是如何从图像中学习的。但是在可视化过程中,它显示的误差如下。该模型训练得很好,也为测试数据返回了一个真实值,但无法可视化卷积层。

模型

model = tf.keras.models.Sequential([
# first convolution
tf.keras.layers.Conv2D(16, (3, 3), activation=tf.nn.relu, input_shape=(300, 300, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
# second convolution
tf.keras.layers.Conv2D(32, (3, 3), activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(2, 2),
# third convolution
tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(2, 2),
# fourth convolution
tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(2, 2),
# fifth convolution
tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(2, 2),
# flatten the results to feed into a DNN
tf.keras.layers.Flatten(),
# hidden layers
tf.keras.layers.Dense(512, activation=tf.nn.relu),
# output layer
tf.keras.layers.Dense(1, activation=tf.nn.sigmoid)
])

可视化代码

for layer_name, feature_map in zip(layer_names, successive_feature_maps):
if len(feature_map.shape) == 4:
# Just do this for the conv / max pool layers, not the fully-connected layers
n_features = feature_map.shape[-1]  # number of features in feature map
# The feature map has shape (1, size, size, n_features)
size = feature_map.shape[1]
# We will tile our images in this matrix
display_grid = np.zeros((size, size * n_features))
for i in range(n_features):
# Postprocessor the feature to make it visually palatable
x = feature_map[0, :, :, i]
x -= x.mean()
x /= x.std()
x *= 64
x += 128
x = np.clip(x, 0, 255).astype('uint8')
# We'll tile each filter into this big horizontal grid
display_grid[:, i * size: (i + 1) * size] = x
# Display the grid
scale = 20. / n_features
plt.figure(figsize=(scale * n_features, scale))
plt.title(layer_name)
plt.grid(False)
plt.imshow(display_grid, aspect='auto', cmap='viridis')

错误如下:

Traceback(最近一次调用):文件" datvisualization .py",第51行visualization_model = tf.keras.models.Model(输入=模型)。层,输出= successive_outputs)文件"/home/vedantdave77/PycharmProjects/HorseVsHuman/venv/lib/python3.8/site-packages/tensorflow/python/training/tracking/base.py",第517行,在_method_wrapperResult = method(self, *args, **kwargs)文件"/home/vedantdave77/PycharmProjects/HorseVsHuman/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/function .py",第120行,在init自我。_init_graph_network(输入、输出)文件"/home/vedantdave77/PycharmProjects/HorseVsHuman/venv/lib/python3.8/site-packages/tensorflow/python/training/tracking/base.py",第517行,在_method_wrapperResult = method(self, *args, **kwargs)文件"/home/vedantdave77/PycharmProjects/HorseVsHuman/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/function .py",第157行,在_init_graph_networkself._validate_graph_inputs_and_outputs ()文件"/home/vedantdave77/PycharmProjects/HorseVsHuman/venv/lib/python3.8/site-packages/tensorflow/python/keras/engine/function .py",第688行,在_validate_graph_inputs_and_outputs抛出ValueError('输入张量为' + cls_name + ' ' +ValueError:函数的输入张量必须来自tf.keras.Input。收到:& lt; tensorflow.python.keras.layers.convolutional。Conv2D对象在0x7f3db89184c0>(缺少前一层元数据)。

如何解决?提前感谢!

在你的代码中:

tf.keras.models.Model(inputs=model.layers, outputs=successive_outputs)

如错误所示,您必须将tf.keras.Input传递给keras Modelinputs参数,而不是model.layers

试试这样写:

tf.keras.models.Model(inputs=model.inputs, outputs=model.layers)

我使用model.inputs作为输入,layer successive outputs作为输出,它工作了。谢谢你@ benjamin H.

代码更改:

visualization_model = tf.keras.models.Model(inputs=model.inputs, outputs=successive_outputs)

, successive_outputs…

successive_outputs = [layer.output for layer in model.layers[1:]]

相关内容