在深度学习中,可以将每一层的卷积结果进行输出显示或保存。该代码可以实现每一层的卷积结果进行输出显示或保存。可以查看每一个卷积之后的效果。
代码:
# coding=utf-8
import tensorflow as tf
import numpy as np
import pdb
from datetime import datetime
import cv2
import os
import matplotlib.pyplot as plt
def conv_imshow(path, model, layer_type, layer_name):
model_dir = "./model/" # model.ckpt文件夹路径
# 加载预训练模型打印及保存
reader = tf.train.NewCheckpointReader(tf.train.get_checkpoint_state(model_dir).model_checkpoint_path)
im = cv2.imread(path)
im = cv2.resize(im, (224, 224)) # * (1. / 255)
in_put = np.expand_dims(im, axis=0)
in_put = tf.convert_to_tensor(in_put, dtype=tf.float32) # np转tf
# 训练模型
for name in model:
ind = int(np.argwhere(model == name)) # 对应索引下标
if layer_type[ind] != 'pool': # maxpooling无权重值,不提取权重
weights = reader.get_tensor(name)
if layer_type[ind] == 'weights':
in_put = tf.nn.conv2d(in_put, weights, strides=[1, 1, 1, 1], padding='SAME')
elif layer_type[ind] == 'bias':
in_put = tf.nn.relu(tf.nn.bias_add(in_put, weights))
elif layer_type[ind] == 'pool':
in_put = tf.nn.max_pool(in_put, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID')
# elif layer_type[ind] == 'fw':
# in_put = tf.matmul(in_put, weights)
# elif layer_type[ind] == 'fb':
# in_put = tf.nn.relu(tf.nn.bias_add(in_put, weights))
else:
break
if name == layer_name:
return in_put
return in_put
if __name__ == '__main__':
imgpath = './image/0.jpg' # 测试图像路径
# 训练模型层定义列表
model = np.array(['conv1_1/weights', 'conv1_1/bias', 'conv1_2/weights', 'conv1_2/bias', 'pool1',
'conv2_1/weights', 'conv2_1/bias', 'conv2_2/weights', 'conv2_2/bias', 'pool2',
'conv3_1/weights', 'conv3_1/bias', 'conv3_2/weights', 'conv3_2/bias', 'conv3_3/weights', 'conv3_3/bias', 'pool3',
'conv4_1/weights', 'conv4_1/bias', 'conv4_2/weights', 'conv4_2/bias', 'conv4_3/weights', 'conv4_3/bias', 'pool4',
'conv5_1/weights', 'conv5_1/bias', 'conv5_2/weights', 'conv5_2/bias', 'conv5_3/weights', 'conv5_3/bias', 'pool5',
'fc6/weights', 'fc6/bias', 'fc7/weights', 'fc7/bias', 'fc8/weights', 'fc8/bias'])
# 训练模型层操作定义列表
layer_type = np.array(['weights', 'bias', 'weights', 'bias', 'pool',
'weights', 'bias', 'weights', 'bias', 'pool',
'weights', 'bias', 'weights', 'bias', 'weights', 'bias', 'pool',
'weights', 'bias', 'weights', 'bias', 'weights', 'bias', 'pool',
'weights', 'bias', 'weights', 'bias', 'weights', 'bias', 'pool',
'fw', 'fb', 'fw', 'fb'])
conv = conv_imshow(imgpath, model, layer_type, 'pool1')
sess = tf.InteractiveSession()
sess.run(tf.global_variables_initializer())
img_conv = sess.run(conv)
img_conv_sum = np.sum(np.squeeze(img_conv), axis=2) # 卷积结果求和
# 显示图像
plt.imshow(img_conv_sum, cmap="gray")
plt.savefig('./image/result.jpg') # 保存图像
plt.show()
sess.close()
这里需要注意,全连接层无法显示图像。