Python中tensorflow CNN卷积神经网络卷积层和池化层的代码实现与效果图展示
因为很多 demo 都比较复杂,为了让 demo 比较简单,专门抽出这两个函数,写的 demo。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import matplotlib.pyplot as plt
import tensorflow as tf
from PIL import Image
import numpy
img = Image.open(‘szu.jpg’)
img_ndarray = numpy.asarray(img, dtype=‘float32’)
print(img_ndarray.shape)
img_ndarray=img_ndarray[:,:,0]
plt.figure()
plt.subplot(221)
plt.imshow(img_ndarray)
w=[[-1.0,-1.0,-1.0],
[-1.0,9.0,-1.0],
[-1.0,-1.0,-1.0]]
with tf.Session() as sess:
img_ndarray=tf.reshape(img_ndarray,[1,183,276,1])
w=tf.reshape(w,[3,3,1,1])
img_cov=tf.nn.conv2d(img_ndarray, w, strides=[1, 1, 1, 1], padding=‘SAME’)
image_data=sess.run(img_cov)
print(image_data.shape)
plt.subplot(222)
plt.imshow(image_data[0,:,:,0])
img_pool=tf.nn.max_pool(img_ndarray, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],
padding='SAME')
image_data = sess.run(img_pool)
plt.subplot(223)
plt.imshow(image_data[0, :, :, 0])
plt.subplot(224)
img_pool = tf.nn.max_pool(img_ndarray, ksize=[1, 4, 4, 1], strides=[1, 4, 4, 1],
padding='SAME')
image_data = sess.run(img_pool)
plt.imshow(image_data[0, :, :, 0])
plt.show()
卷积和池化效果图:
更多资源教程: http://www.tensorflownews.com
Python中tensorflow CNN卷积神经网络卷积层和池化层的代码实现与效果图展示
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
# 生成示例数据
def create_sample_image():
# 创建28x28的灰度图像,中间有个十字形图案
img = np.zeros((28, 28, 1))
img[10:18, 10:18] = 1.0 # 中心方块
img[13:15, 5:23] = 1.0 # 水平条
img[5:23, 13:15] = 1.0 # 垂直条
return img
# 创建模型
def create_cnn_model():
model = tf.keras.Sequential([
# 卷积层1
tf.keras.layers.Conv2D(
filters=8, # 8个滤波器
kernel_size=(3, 3),
strides=(1, 1),
padding='same',
activation='relu',
input_shape=(28, 28, 1),
name='conv1'
),
# 池化层1
tf.keras.layers.MaxPooling2D(
pool_size=(2, 2),
strides=(2, 2),
padding='same',
name='pool1'
),
# 卷积层2
tf.keras.layers.Conv2D(
filters=16,
kernel_size=(3, 3),
padding='same',
activation='relu',
name='conv2'
),
# 池化层2
tf.keras.layers.MaxPooling2D(
pool_size=(2, 2),
strides=(2, 2),
padding='same',
name='pool2'
)
])
return model
# 可视化函数
def visualize_layers(model, input_img):
# 创建中间层输出的模型
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.Model(inputs=model.input, outputs=layer_outputs)
# 获取各层输出
activations = activation_model.predict(input_img[np.newaxis, ...])
# 绘制结果
fig, axes = plt.subplots(2, 4, figsize=(12, 6))
# 原始图像
axes[0, 0].imshow(input_img[:, :, 0], cmap='gray')
axes[0, 0].set_title('Original Image')
axes[0, 0].axis('off')
# 第一层卷积结果(显示前3个滤波器)
conv1_output = activations[0][0]
for i in range(3):
axes[0, i+1].imshow(conv1_output[:, :, i], cmap='viridis')
axes[0, i+1].set_title(f'Conv1 Filter {i+1}')
axes[0, i+1].axis('off')
# 第一层池化结果(显示前3个通道)
pool1_output = activations[1][0]
for i in range(3):
axes[1, i].imshow(pool1_output[:, :, i], cmap='viridis')
axes[1, i].set_title(f'Pool1 Channel {i+1}')
axes[1, i].axis('off')
# 第二层卷积结果(显示第1个滤波器)
conv2_output = activations[2][0]
axes[1, 3].imshow(conv2_output[:, :, 0], cmap='plasma')
axes[1, 3].set_title('Conv2 Filter 1')
axes[1, 3].axis('off')
plt.tight_layout()
plt.show()
# 打印各层输出形状
print("Layer Output Shapes:")
print(f"Input shape: {input_img.shape}")
for i, activation in enumerate(activations):
print(f"Layer {i+1} ({model.layers[i].name}): {activation[0].shape}")
# 主程序
def main():
# 创建数据
sample_img = create_sample_image()
# 创建模型
model = create_cnn_model()
# 打印模型结构
model.summary()
# 可视化各层效果
visualize_layers(model, sample_img)
if __name__ == "__main__":
main()
这段代码展示了CNN中卷积层和池化层的具体实现。卷积层用Conv2D实现特征提取,池化层用MaxPooling2D进行下采样。效果图会显示原始图像经过各层处理后的特征图变化,可以明显看到卷积层提取边缘特征,池化层压缩特征尺寸同时保留重要信息。
建议:合理设置滤波器数量和池化尺寸以平衡特征提取和信息保留。
不明觉厉

