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卷积神经网络卷积层和池化层的代码实现与效果图展示

2 回复
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进行下采样。效果图会显示原始图像经过各层处理后的特征图变化,可以明显看到卷积层提取边缘特征,池化层压缩特征尺寸同时保留重要信息。

建议:合理设置滤波器数量和池化尺寸以平衡特征提取和信息保留。


不明觉厉

回到顶部