卷積神經網絡(CNN)處理流程(簡化版)

前言

是看了這個大佬的視頻后想進行一下自己的整理(流程只到了扁平化),如果有問題希望各位大佬能夠給予指正。卷積神經網絡(CNN)到底卷了啥?8分鐘帶你快速了解!_嗶哩嗶哩_bilibilihttps://www.bilibili.com/video/BV1MsrmY4Edi/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=7c3bfbf39d037fe80c97234396acc524

輸入層

由于自己也不知道設置什么矩陣,就干脆讓deepseek生成0~9的矩陣,每次隨機使用一個數字來進行測試。

  • 從預定義的digit_templates中隨機選擇一個數字(0-9)

  • 將數字的6x6二進制矩陣轉換為NumPy數組
    關鍵變量

  • digit: 原始數字矩陣(6x6),值為0(黑)或1(白)

# 數字模板(6x6矩陣)
digit_templates = {0: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0]],1: [[0, 0, 1, 1, 0, 0],[0, 1, 1, 1, 0, 0],[0, 0, 1, 1, 0, 0],[0, 0, 1, 1, 0, 0],[0, 0, 1, 1, 0, 0],[0, 1, 1, 1, 1, 0]],2: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[0, 0, 0, 1, 1, 0],[0, 1, 1, 0, 0, 0],[1, 0, 0, 0, 0, 0],[1, 1, 1, 1, 1, 1]],3: [[1, 1, 1, 1, 1, 0],[0, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0],[0, 0, 0, 0, 0, 1],[0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 0]],4: [[1, 0, 0, 0, 1, 0],[1, 0, 0, 0, 1, 0],[1, 0, 0, 0, 1, 0],[1, 1, 1, 1, 1, 1],[0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 1, 0]],5: [[1, 1, 1, 1, 1, 1],[1, 0, 0, 0, 0, 0],[1, 1, 1, 1, 1, 0],[0, 0, 0, 0, 0, 1],[0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 0]],6: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 0],[1, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0]],7: [[1, 1, 1, 1, 1, 1],[0, 0, 0, 0, 1, 0],[0, 0, 0, 1, 0, 0],[0, 0, 1, 0, 0, 0],[0, 1, 0, 0, 0, 0],[1, 0, 0, 0, 0, 0]],8: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0]],9: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 1],[0, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0]]
}# 隨機選擇數字
random_digit = randint(0, 9)
digit = np.array(digit_templates[random_digit])

Padding

將6*6的矩陣邊界填充0擴展為8x8矩陣,防止丟失邊緣信息。

numpy.pad()函數詳解_numpy pad-CSDN博客https://blog.csdn.net/weixin_41862755/article/details/128336141

  • 在原始矩陣周圍添加一圈0(pad_width=1
  • 將6x6矩陣擴展為8x8,防止卷積時邊緣信息丟失
    輸出

  • padded: 填充后的矩陣(8x8)

padded = np.pad(digit, pad_width=1, mode='constant')  # 邊界填充

卷積

局部加權求和(對應相乘再相加),提取輸入數據的局部特征,形成特征映射。

  • conv2d函數實現滑動窗口卷積運算

  • 使用垂直核(kernel_v)檢測垂直邊緣特征

  • 使用水平核(kernel_h)檢測水平邊緣特征
    關鍵參數

  • kernel_v:?[[0,1,0], [0,1,0], [0,1,0]](強化垂直線條)

  • kernel_h:?[[0,0,0], [1,1,1], [0,0,0]](強化水平線條)
    輸出

  • conv_v: 垂直卷積結果(6x6矩陣)

  • conv_h: 水平卷積結果(6x6矩陣)

# 定義卷積核
kernel_v = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]])  # 垂直特征
kernel_h = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]])  # 水平特征def conv2d(image, kernel):# 手動實現卷積運算h, w = image.shapek_h, k_w = kernel.shapeoutput = np.zeros((h - k_h + 1, w - k_w + 1))for y in range(h - k_h + 1):for x in range(w - k_w + 1):output[y, x] = np.sum(image[y:y + k_h, x:x + k_w] * kernel)return output.astype(int)conv_v = conv2d(padded, kernel_v)  # 垂直卷積
conv_h = conv2d(padded, kernel_h)  # 水平卷積

激活

這個視頻中沒有,然后代碼中也沒起作用,因為沒有出現值為負數出現。激活函數可以進行非線性變換,使網絡能夠學習復雜模式,可以進行特征過濾,保留有用特征,抑制噪聲,可以優化訓練,控制梯度流動,提高模型收斂速度。

  • 對卷積結果應用ReLU(Rectified Linear Unit)激活函數

  • 保留正值,負值置為0(非線性變換)
    輸出

  • relu_v: 垂直特征激活結果(6x6)

  • relu_h: 水平特征激活結果(6x6)

relu_v = np.maximum(0, conv_v)  # ReLU激活
relu_h = np.maximum(0, conv_h)

池化

池化能夠進行信息壓縮,用更少的參數表達關鍵特征,可以不變性增強,使模型對輸入的小變化更魯棒,可以計算效率,加速訓練和推理過程。

  • maxpool2d函數實現2x2最大池化(步長=2)

  • 降低特征圖維度,保留顯著特征(保留2*2中的最大值)
    輸出

  • pool_v: 垂直特征池化結果(3x3)

  • pool_h: 水平特征池化結果(3x3)

扁平化

扁平化可以結構轉換,讓多維特征轉換成一維向量,可以信息整合,合并不同特征提取路徑的結果,起到橋梁作用,連接特征提取層與分類決策層。

  • 將池化后的3x3矩陣展平為一維向量(flatten()

  • 合并垂直和水平特征向量(最終18維向量)
    輸出

  • flattened: 合并后的特征向量(形狀:(18,))

flattened = np.concatenate([pool_v.flatten(), pool_h.flatten()])

可視化

  • 使用Matplotlib繪制處理流程各階段的結果

  • 關鍵可視化內容:

    • 原始數字矩陣(標注0/1值)

    • 卷積/激活/池化結果(熱力圖+數值標注)

    • 扁平化向量(條形圖,紅色標記激活特征)

完整代碼

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patheffects as path_effects
from random import randint# 數字模板(6x6矩陣)
digit_templates = {0: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0]],1: [[0, 0, 1, 1, 0, 0],[0, 1, 1, 1, 0, 0],[0, 0, 1, 1, 0, 0],[0, 0, 1, 1, 0, 0],[0, 0, 1, 1, 0, 0],[0, 1, 1, 1, 1, 0]],2: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[0, 0, 0, 1, 1, 0],[0, 1, 1, 0, 0, 0],[1, 0, 0, 0, 0, 0],[1, 1, 1, 1, 1, 1]],3: [[1, 1, 1, 1, 1, 0],[0, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0],[0, 0, 0, 0, 0, 1],[0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 0]],4: [[1, 0, 0, 0, 1, 0],[1, 0, 0, 0, 1, 0],[1, 0, 0, 0, 1, 0],[1, 1, 1, 1, 1, 1],[0, 0, 0, 0, 1, 0],[0, 0, 0, 0, 1, 0]],5: [[1, 1, 1, 1, 1, 1],[1, 0, 0, 0, 0, 0],[1, 1, 1, 1, 1, 0],[0, 0, 0, 0, 0, 1],[0, 0, 0, 0, 0, 1],[1, 1, 1, 1, 1, 0]],6: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 0],[1, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0]],7: [[1, 1, 1, 1, 1, 1],[0, 0, 0, 0, 1, 0],[0, 0, 0, 1, 0, 0],[0, 0, 1, 0, 0, 0],[0, 1, 0, 0, 0, 0],[1, 0, 0, 0, 0, 0]],8: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0]],9: [[0, 1, 1, 1, 1, 0],[1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 1],[0, 0, 0, 0, 0, 1],[0, 1, 1, 1, 1, 0]]
}# 隨機選擇數字
random_digit = randint(0, 9)
digit = np.array(digit_templates[random_digit])# 定義卷積核
kernel_v = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]])  # 垂直特征
kernel_h = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]])  # 水平特征def process_digit(digit):# Paddingpadded = np.pad(digit, pad_width=1, mode='constant')# 卷積計算def conv2d(image, kernel):h, w = image.shapek_h, k_w = kernel.shapeoutput = np.zeros((h - k_h + 1, w - k_w + 1))for y in range(h - k_h + 1):for x in range(w - k_w + 1):output[y, x] = np.sum(image[y:y + k_h, x:x + k_w] * kernel)return output.astype(int)  # 轉換為整型conv_v = conv2d(padded, kernel_v)conv_h = conv2d(padded, kernel_h)# ReLU激活relu_v = np.maximum(0, conv_v).astype(int)  # 轉換為整型relu_h = np.maximum(0, conv_h).astype(int)  # 轉換為整型# 最大池化def maxpool2d(image, size=2):h, w = image.shapereturn np.array([[np.max(image[i:i + size, j:j + size])for j in range(0, w, size)]for i in range(0, h, size)]).astype(int)  # 轉換為整型pool_v = maxpool2d(relu_v)pool_h = maxpool2d(relu_h)# 扁平化flattened = np.concatenate([pool_v.flatten(), pool_h.flatten()]).astype(int)  # 轉換為整型return {'original': digit,'padded': padded,'conv_v': conv_v,'conv_h': conv_h,'relu_v': relu_v,'relu_h': relu_h,'pool_v': pool_v,'pool_h': pool_h,'flattened': flattened}def visualize_flow(results):fig = plt.figure(figsize=(20, 12))plt.suptitle(f'CNN Processing Flow for Digit {random_digit}', fontsize=18, y=0.97)grid = plt.GridSpec(4, 6, hspace=0.4, wspace=0.3)# 創建文本描邊效果text_effect = [path_effects.withStroke(linewidth=2, foreground='black')]# 原始圖像 - 顯示阿拉伯數字ax1 = fig.add_subplot(grid[0:2, 0:2])img1 = ax1.imshow(results['original'], cmap='binary')plt.colorbar(img1, ax=ax1, fraction=0.046, pad=0.04)ax1.set_title("Original Digit (6x6)", pad=12)ax1.text(3, 3, str(random_digit),ha='center', va='center',color='red', fontsize=48, alpha=0.5)for y in range(results['original'].shape[0]):for x in range(results['original'].shape[1]):display_val = '1' if results['original'][y, x] > 0.5 else '0'ax1.text(x, y, display_val,ha='center', va='center',color='white' if results['original'][y, x] > 0.5 else 'black',fontsize=14, weight='bold')# Padding后的圖像 - 顯示阿拉伯數字ax2 = fig.add_subplot(grid[0:2, 2:4])img2 = ax2.imshow(results['padded'], cmap='binary')plt.colorbar(img2, ax=ax2, fraction=0.046, pad=0.04)ax2.set_title("After Padding (8x8)", pad=12)ax2.text(4, 4, str(random_digit),ha='center', va='center',color='red', fontsize=48, alpha=0.5)for y in range(results['padded'].shape[0]):for x in range(results['padded'].shape[1]):display_val = '1' if results['padded'][y, x] > 0.5 else '0'ax2.text(x, y, display_val,ha='center', va='center',color='white' if results['padded'][y, x] > 0.5 else 'black',fontsize=12, weight='bold')# 右側圖像的統一設置right_plots = {'conv_v': ('Vertical Conv', grid[0, 4]),'conv_h': ('Horizontal Conv', grid[0, 5]),'relu_v': ('ReLU(V)', grid[1, 4]),'relu_h': ('ReLU(H)', grid[1, 5]),'pool_v': ('Pool(V)', grid[2, 4]),'pool_h': ('Pool(H)', grid[2, 5])}for key, (title, pos) in right_plots.items():ax = fig.add_subplot(pos)img = ax.imshow(results[key], cmap='viridis')plt.colorbar(img, ax=ax, fraction=0.046, pad=0.04)ax.set_title(title, pad=7)for y in range(results[key].shape[0]):for x in range(results[key].shape[1]):ax.text(x, y, f"{results[key][y, x]:d}",  # 使用整型格式ha='center', va='center',color='white',fontsize=10, weight='bold',path_effects=text_effect)# 扁平化ax9 = fig.add_subplot(grid[3, :])bars = ax9.bar(range(len(results['flattened'])), results['flattened'])for j, val in enumerate(results['flattened']):if val > 0:bars[j].set_color('red')ax9.text(j, val / 2, f"{val:d}",  # 使用整型格式ha='center', va='center',color='white',weight='bold',path_effects=text_effect)ax9.set_xticks(range(len(results['flattened'])))ax9.set_title("Flattened Vector (Red = Activated Features)", pad=12)plt.tight_layout()plt.show()# 執行流程
results = process_digit(digit)
print(f"Processing digit: {random_digit}")
print("Flattened vector:", results['flattened'])
visualize_flow(results)

Processing digit: 1
Flattened vector: [1 3 0 1 3 0 1 3 1 2 3 1 1 2 1 2 3 2]?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90989.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90989.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90989.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

DBSyncer:開源免費的全能數據同步工具,多數據源無縫支持!

DBSyncer(英[dbs??k??],美[dbs??k?? 簡稱dbs)是一款開源的數據同步中間件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步場景。支持上傳插件自定義同步轉換業務,提供…

kafka開啟Kerberos使用方式

kafka SASL_PLAINTEXT serviceName 配置: /etc/security/keytabs/kafka.service.keytab 對應的用戶名 $ cat /home/sunxy/kafka/jaas25.conf KafkaClient { com.sun.security.auth.module.Krb5LoginModule required useKeyTabtrue renewTickettrue serviceName“ocd…

Unity教程(二十四)技能系統 投劍技能(中)技能變種實現

Unity開發2D類銀河惡魔城游戲學習筆記 Unity開發2D類銀河惡魔城游戲學習筆記目錄 技能系統 Unity教程(二十一)技能系統 基礎部分 Unity教程(二十二)技能系統 分身技能 Unity教程(二十三)技能系統 擲劍技能…

局域網TCP通過組播放地址rtp推流和拉流實現實時喊話

應用場景,安卓端局域網不用ip通過組播放地址實現實時對講功能發送端: ffmpeg -f alsa -i hw:1 -acodec aac -ab 64k -ac 2 -ar 16000 -frtp -sdp file stream.sdp rtp://224.0.0.1:14556接收端: ffmpeg -protocol whitelist file,udp,rtp -i stream.sdp -acodec pcm…

基于深度學習的醫學圖像分析:使用YOLOv5實現細胞檢測

最近研學過程中發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊鏈接跳轉到網站人工智能及編程語言學習教程。讀者們可以通過里面的文章詳細了解一下人工智能及其編程等教程和學習方法。下面開始對正文內容的…

32.768KHZ 3215晶振CM315D與NX3215SA應用全場景

在現代電子設備中,一粒米大小的晶振,卻是掌控時間精度的“心臟”。CITIZEN的CM315D系列與NDK的NX3215SA系列晶振便是其中的佼佼者,它們以 3.2 1.5 mm 的小尺寸”(厚度不足1mm),成為智能設備中隱形的節奏大師。精準計時的奧秘這兩…

嵌軟面試——ARM Cortex-M寄存器組

Cortex-M內存架構包含16個通用寄存器,其中R0-R12是13個32位的通用寄存器,另外三個寄存器是特殊用途,分別是R13(棧指針),R14(鏈接寄存器),R15(程序計數器)。對于處理器來說…

7.DRF 過濾、排序、分頁

過濾Filtering 對于列表數據可能需要根據字段進行過濾,我們可以通過添加django-fitlter擴展來增強支持。 pip install django-filter在配置文件中增加過濾器類的全局設置: """drf配置信息必須全部寫在REST_FRAMEWORK配置項中""…

二、CUDA、Pytorch與依賴的工具包

CUDA Compute Unified Device Architecture(統一計算架構)。專門用于 GPU 通用計算 的平臺 編程接口。CUDA可以使你的程序(比如矩陣、神經網絡)由 GPU 執行,這比CPU能快幾十甚至上百倍。 PyTorch 是一個深度學習框架…

SpringCloude快速入門

近期簡單了解一下SpringCloude微服務,本文主要就是我學習中所記錄的筆記,然后具體原理可能等以后再來深究,本文可能有些地方用詞不專業還望包容一下,感興趣可以參考官方文檔來深入學習一下微服務,然后我的下一步學習就是docker和linux了。 nacos: Nacos 快速開始 | Nacos 官網…

GPT Agent與Comet AI Aent瀏覽器對比橫評

1. 架構設計差異GPT Agent的雙瀏覽器架構:文本瀏覽器:專門用于高效處理大量文本內容,適合深度信息檢索和文獻追蹤,相當于Deep Research的延續可視化瀏覽器:具備界面識別與交互能力,可以點擊網頁按鈕、識別圖…

應用信息更新至1.18.0

增加DO權限 增加權限管理(需DO支持) 增加應用凍結隱藏(需DO支持) 增加權限委托(需DO支持) 增加特殊組件 ...

常用git命令集錦

git init 初始化 將當前目錄初始化為 git 本地倉庫,此時會在本地創建一個 .git 的文件夾 git init -q 靜默執行,就是在后臺執行 git init --bare –bare 參數,一般用來初始化一個空的目錄,作為遠程存儲倉庫 git init --template dir –templa…

skywalking安裝

一、簡介 SkyWalking是一款用于分布式系統跟蹤和性能監控的開源工具。它可以幫助開發人員了解分布式系統中不同組件之間的調用關系和性能指標,從而進行故障排查和性能優化。 它支持多種語言和框架,包括Java、.NET、Node.js等。它通過在應用程序中插入代…

利用DataStream和TrafficPeak實現大數據可觀察性

可觀察性工作流對于深入了解應用程序的健康狀況、客戶流量和整體性能至關重要。然而,要實現真正的可觀察性還面臨一些挑戰,包括海量的流量數據、數據保留、實施時間以及各項成本等。TrafficPeak是一款為Akamai云平臺打造,簡單易用、可快速部署…

jQuery 最新語法大全詳解(2025版)

引言 jQuery 作為輕量級 JavaScript 庫,核心價值在于 簡化 DOM 操作、跨瀏覽器兼容性和高效開發。盡管現代框架崛起,jQuery 仍在遺留系統維護、快速原型開發中廣泛應用。本文涵蓋 jQuery 3.6 核心語法,重點解析高效用法與最佳實踐。 一、jQu…

Android 15 修改截圖默認音量大小

概述 在 Android 15 中,截圖音效的默認音量可能過大,影響用戶體驗。本文將介紹如何通過修改系統源碼來調整截圖音效的默認音量大小。 修改位置 需要修改的文件路徑: frameworks/base/packages/SystemUI/src/com/android/systemui/screenshot/ScreenshotSoundProvider.kt…

Python爬蟲實戰:快速采集教育政策數據(附官網工具庫API)

解鎖教育政策研究的數據金礦,用技術提升學術效率 在教育政策研究領域,獲取最新、最全面的政策文本是學術工作的基礎。傳統手動收集方式效率低下且容易遺漏關鍵政策,而Python爬蟲技術為教育研究者提供了高效的數據采集解決方案。本文將系統介…

驗證回文串-leetcode

如果在將所有大寫字符轉換為小寫字符、并移除所有非字母數字字符之后,短語正著讀和反著讀都一樣。則可以認為該短語是一個 回文串 。 字母和數字都屬于字母數字字符。 給你一個字符串 s,如果它是 回文串 ,返回 true ;否則&#xf…

嵌入式學習日志(十)

10 學習指針1 指針核心定義與本質1.1 指針與指針變量1、指針即地址,指針變量是存放地址的變量,其大小與操作系統位數相關:64 位系統中占 8 字節,32 位系統中占 4 字節。2、指針的核心功能是通過地址間接訪問目標變量&#xff0…