手写代码实现池化操作(Python)

在图片降采样的过程中,常采用pooling(池化)方法来降采样。

计算图像一个区域上的某个特定特征的平均值或最大值,这种聚合操作叫做池化。

池化后的这些统计特征不仅具有低得多的维度,同时训练结果不容易过拟合。

常用的池化方法:

       1.均值池化:对池化区域内的像素点取均值,这种方法得到的特征数据对背景信息更敏感

        2.最大池化:对池化区域的所有像素值取最大值,这种方法得到的特征数据对纹理信息更加敏感

 

一:导入需要使用到的库

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

二:读取图片,并可视化

img = Image.open('小镇.jpg')
plt.imshow(img)
plt.axis('off')

 三:RGB三通道数据分离

r, g, b = img.split()
plt.imshow(r)
plt.axis('off')

 

四:定义池化函数

#均值池化
def pooling(data, m, n):
    a,b = data.shape
    img_new = []
    for i in range(0,a,m):
        line = []#记录每一行
        for j in range(0,b,n):
            x = data[i:i+m,j:j+n]#选取池化区域
            line.append(np.sum(x)/(n*m))
        img_new.append(line)
    return np.array(img_new)

 原图片的分辨率为:

np.array(r).shape
(576, 1024)

是一张576*1024的图片,我们使用2*2的池化区域,对图片进行池化:

img_new = pooling(np.array(r), 2, 2)
plt.imshow(img_new)
plt.axis('off')

 它的分辨率降到了:288*512

使用5*5的池化区域,其分辨率的降低可以更显著:

这是均值池化的效果,我们试一下最大值池化:

#最大池化
def pooling(data, m, n):
    a,b = data.shape
    img_new = []
    for i in range(0,a,m):
        line = []
        for j in range(0,b,n):
            x = data[i:i+m,j:j+n]
            line.append(np.max(x))
        img_new.append(line)
    return np.array(img_new)

 分别使用2*2,和5*5的池化来看一下效果:

 可以明显看出,均值池化和最大池化的区别。

  • 10
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
以下是一个使用Keras库实现手写数字识别的Python代码: ```python import numpy as np import matplotlib.pyplot as plt from keras.datasets import mnist from keras.models import Sequential from keras.layers import Dense, Dropout, Flatten from keras.layers.convolutional import Conv2D, MaxPooling2D from keras.utils import np_utils # 加载数据集 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 将数据集转换为浮点数并进行归一化处理 X_train = X_train.astype('float32') / 255 X_test = X_test.astype('float32') / 255 # 将标签转换为one-hot编码 y_train = np_utils.to_categorical(y_train) y_test = np_utils.to_categorical(y_test) # 定义模型 model = Sequential() model.add(Conv2D(32, (5, 5), input_shape=(28, 28, 1), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.2)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(10, activation='softmax')) # 编译模型 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) # 训练模型 model.fit(X_train.reshape(-1, 28, 28, 1), y_train, validation_data=(X_test.reshape(-1, 28, 28, 1), y_test), epochs=10, batch_size=200, verbose=2) # 评估模型 scores = model.evaluate(X_test.reshape(-1, 28, 28, 1), y_test, verbose=0) print("Error: %.2f%%" % (100-scores[1]*100)) ``` 这个代码中使用了一个卷积神经网络模型,该模型有一个卷积层、一个池化层、一个Dropout层、一个Flatten层和两个全连接层。在训练过程中,使用了10个epochs和200个batch size。最后,使用测试数据集对模型进行评估,并输出误差率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猫猫虫(——)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值