【神經網絡】python實現神經網絡(一)——數據集獲取

一.概述

????????在文章【機器學習】一個例子帶你了解神經網絡是什么中,我們大致了解神經網絡的正向信息傳導、反向傳導以及學習過程的大致流程,現在我們正式開始進行代碼的實現,首先我們來實現第一步的運算過程模擬講解:正向傳導。本次代碼實現將以“手寫數字識別”為例子。

二.測試訓練數據集的獲取

? ? ? ? 首先我們需要通過官網獲取到手寫數字識別數據集,數據集一共分為四個部分,分別是訓練集的圖片(六萬張)、訓練集的標簽、測試集的圖片(一萬張)以及測試集的標簽。所以我們在代碼中可以使用鍵值表示對應的key-value:

url_base = 'http://yann.lecun.com/exdb/mnist/'
key_file = {'train_img':'train-images-idx3-ubyte.gz','train_label':'train-labels-idx1-ubyte.gz','test_img':'t10k-images-idx3-ubyte.gz','test_label':'t10k-labels-idx1-ubyte.gz'
}

? ? ? ? 同時,我們需要將下載的文件保存到與代碼同一級目錄下:

dataset_dir = os.path.dirname(os.path.abspath(__file__))

? ? ? ? 下載部分十分簡單么,就不在此贅述,需要注意的是代碼使用了python的urlretrieve函數,該函數需要使用頭文件urllib.request,需要自行下載:

def download_mnist():for filename in key_file.values():file_path = dataset_dir + "/" + filenameif os.path.exists(file_path):returnprint("Downloading " + filename + " ... ")urllib.request.urlretrieve(url_base + filename, file_path)print("Done")

三.測試訓練數據集的加載

? ? ? ? 下載完數據集后,我們需要將其加載到我們的程序中以供后續的使用,首先是判斷一下我們是否已經下載過數據集,如果沒有下載,則先進行下載操作,再執行其他步驟:

    if not os.path.exists(save_file) :download_mnist()dataset = _convert_numpy()print("Creating pickle file ...")with open(save_file, 'wb') as f:pickle.dump(dataset, f, -1)print("Done!")

? ? ? ? 以上代碼有個需要注意的地方,因為下載完數據集之后無法直接給到python使用,所以還需要對數據進行格式處理,處理成python可以識別的格式,這一步交由函數_convert_numpy實現:

def _convert_numpy():    dataset = {}dataset['train_img'] = _load_img(key_file['train_img'])dataset['train_label'] = _load_label(key_file['train_label'])dataset['test_img'] = _load_img(key_file['test_img'])dataset['test_label'] = _load_label(key_file['test_label'])return dataset

? ? ? ?其中,_load_img函數負責處理圖片數據:

def _load_img(file_name):file_path = dataset_dir + "\\MNIST\\" + file_nameprint("Converting " + file_name + " to NumPy Array ...")with gzip.open(file_path, 'rb') as f:data = np.frombuffer(f.read(), np.uint8, offset=16)data = data.reshape(-1, img_size)print("Done")return data

????????其中,_load_label函數負責處理標簽數據:

def _load_label(file_name):file_path = dataset_dir + "\\MNIST\\" + file_nameprint("Converting " + file_name + " to NumPy Array ...")with gzip.open(file_path, 'rb') as f:labels = np.frombuffer(f.read(), np.uint8, offset=8)print("Done")return labels

? ? ? ? 函數中使用到的都是一些python常用的函數,所以具體作用不在贅述,可自行查詢。介紹完_convert_numpy函數,我們繼續回到數據集加載函數本身,為了方便后續數據集的批量調用等操作,我們需要在加載數據后對其進行進一步的數據清洗整理等預處理,分別為數據歸一化(normalize)、圖像展開(flatten)以及圖像標簽對應(one_hot_label),先將三個功能代碼貼上,然后我們再詳細講解各個功能的具體作用:

    with open(save_file,'rb') as f:dataset = pickle.load(f)if normalize:for key in ['train_img','test_img']:dataset[key] = dataset[key].astype(np.float32)if not flatten:for key in ('train_img', 'test_img'):dataset[key] = dataset[key].reshape(-1, 1, 28, 28)if one_hot_label:dataset['train_label'] = _change_one_hot_label(dataset['train_label'])dataset['test_label'] = _change_one_hot_label(dataset['test_label'])

3.1.數據歸一化(normalize)

? ? ? ? 數據歸一化normalize如果設置為True,可以將輸入圖像歸一化為0.0~1.0 的值。如果將該參數設置為False,則輸入圖像的像素會保持原來的0~255。函數實現是使用了python函數中的astype功能將數據,用于將數據集指定字段的數據轉換為?float32?類型,常見于深度學習模型輸入前的數據預處理。

dataset[key] = dataset[key].astype(np.float32)

3.2.圖像展開(flatten)

? ? ? ? 圖像展開flatten用于設置是否展開輸入圖像使其變成一維數組。如果將該參數設置為False,則輸入圖像為1 × 28 × 28 的三維數組;若設置為True,則輸入圖像會保存為由784 個元素構成的一維數組。函數實現也只是使用到深度學習中常用的reshape函數:

 dataset[key] = dataset[key].reshape(-1, 1, 28, 28)

3.3.圖像標簽對應(one_hot_label)

????????圖像標簽對應one_hot_label用于設置是否將標簽保存為onehot表示(one-hot representation)。one-hot 表示是僅正確解標簽為1,其余皆為0 的數組,就像[0,0,1,0,0,0,0,0,0,0]這樣。當one_hot_label為False時,就是像7、2這樣簡單保存正確解標簽,函數_change_one_hot_label的實現如下:

def _change_one_hot_label(X):T = np.zeros((X.size, 10))for idx, row in enumerate(T):row[X[idx]] = 1return T

? ? ? ? 以上即為測試訓練數據集加載函數的全部內容,我們將在下面正式調用一下看看是否能夠正常工作,在此貼上函數全文:

ef load_mnist(normalize=True, flatten=True, one_hot_label=False):if not os.path.exists(save_file) :download_mnist()dataset = _convert_numpy()print("Creating pickle file ...")with open(save_file, 'wb') as f:pickle.dump(dataset, f, -1)print("Done!")with open(save_file,'rb') as f:dataset = pickle.load(f)if normalize:for key in ['train_img','test_img']:dataset[key] = dataset[key].astype(np.float32)if not flatten:for key in ('train_img', 'test_img'):dataset[key] = dataset[key].reshape(-1, 1, 28, 28)if one_hot_label:dataset['train_label'] = _change_one_hot_label(dataset['train_label'])dataset['test_label'] = _change_one_hot_label(dataset['test_label'])return (dataset['train_img'],dataset['train_label']),(dataset['test_img'],dataset['test_label'])

四.測試訓練數據集的使用測試

? ? ? ? 我們可以加載數據集并且查看到各個數據集的形狀:

(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True,normalize=False)
# 輸出各個數據的形狀
print(x_train.shape) # (60000, 784)
print(t_train.shape) # (60000,)
print(x_test.shape) # (10000, 784)
print(t_test.shape) # (10000,)

? ? ? ? 根據輸出我們可以看到,訓練集圖片有六萬張,每張圖片有784各像素(28*28),訓練集標簽和照片數量一樣(那是肯定的),測試集圖片和標簽數量比訓練集的少,主要用來驗證模型學習后的正確性。

? ? ? ? 我們甚至還能隨機從數據集中抽取一張照片查看一下實際樣子,具體實現如下:

def img_show(img):
pil_img = Image.fromarray(np.uint8(img))
pil_img.show()
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True,normalize=False)
img = x_train[0]
label = t_train[0]
print(label) # 5
print(img.shape) # (784,)
img = img.reshape(28, 28) # 把圖像的形狀變成原來的尺寸
print(img.shape) # (28, 28)
img_show(img)

? ? ? ? 輸出的圖片如圖下所示:

? ? ? ? 在后面的文章中,我們將開始正式步入主題,講解神經網絡如何學習,各層次之間如何傳遞數值,如何反向傳導,計算損失,又在重新學習,最終實現傳入一張手寫數字就能自動識別出具體的數字的。

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

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

相關文章

Sentinel 筆記

Sentinel 筆記 1 介紹 Sentinel 是阿里開源的分布式系統流量防衛組件,專注于 流量控制、熔斷降級、系統保護。 官網:https://sentinelguard.io/zh-cn/index.html wiki:https://github.com/alibaba/Sentinel/wiki 對比同類產品&#xff1…

manus本地部署方法研究測試

Manus本地部署方法,Manus邀請碼實在太難搞了,昨晚看到有一個團隊,5個人3個小時,一個完全免費、無需排隊等待的OpenManus就做好了。 由于也是新手,找了好幾輪,實在是沒有找到合適的部署方法,自己…

FreeRTOS第15篇:FreeRTOS鏈表實現細節03_List_t與ListItem_t的奧秘

文/指尖動聽知識庫-星愿 文章為付費內容,商業行為,禁止私自轉載及抄襲,違者必究!!! 文章專欄:深入FreeRTOS內核:從原理到實戰的嵌入式開發指南 1 FreeRTOS列表的核心數據結構 FreeRTOS的列表實現由兩個關鍵結構體組成:List_t(列表)和ListItem_t(列表項)。它們共同…

gzip壓縮

什么是Gzip 前端優化:開啟Gzip壓縮_前端開啟gzip壓縮-CSDN博客 Gzip是一種文件壓縮算法,減少文件大小,節省帶寬從而提減少網絡傳輸時間,網站會更快地加載。 如何判斷是否開啟: 請求頭:服務端會通過客戶…

機器學習在地圖制圖學中的應用

原文鏈接:https://www.tandfonline.com/doi/full/10.1080/15230406.2023.2295948#abstract CSDN/2025/Machine learning in cartography.pdf at main keykeywu2048/CSDN GitHub 核心內容 本文是《制圖學與地理信息科學》特刊的擴展評論,系統探討了機…

智慧消防新篇章:4G液位/壓力傳感器,筑牢安全防線!

火災無情,防患未“燃”!在智慧消防時代,如何實現消防水系統的實時監測、預警,保障人民生命財產安全?山東一二三物聯網深耕物聯網領域,自主研發4G液位、4G壓力智能傳感器,為智慧消防水位、水壓無…

set、LinkedHashSet和TreeSet的區別、Map接口常見方法、Collections 工具類使用

DAY7.2 Java核心基礎 想學習Collection、list、ArrayList、Set、HashSet部分的小伙伴可以轉到 7.1集合框架、Collection、list、ArrayList、Set、HashSet和LinkedHashSet、判斷兩個對象是否相等文章查看 set集合 在set集合中,處理LinkedHashSet是有序的&#xf…

windows:curl: (60) schannel: SEC_E_UNTRUSTED_ROOT (0x80090325)

目錄 1. git update-git-for-windows 報錯2. 解決方案2.1. 更新 CA 證書庫2.2. 使用 SSH 連接(推薦)2.3 禁用 SSL 驗證(不推薦) 1. git update-git-for-windows 報錯 LenovoLAPTOP-EQKBL89E MINGW64 /d/YHProjects/omni-channel-…

《深度剖析架構蒸餾與邏輯蒸餾:探尋知識遷移的差異化路徑》

在人工智能模型優化的前沿領域,架構蒸餾與邏輯蒸餾作為知識蒸餾的關鍵分支,正引領著模型小型化與高效化的變革浪潮。隨著深度學習模型規模與復雜度的不斷攀升,如何在資源受限的情況下,實現模型性能的最大化,成為了學術…

先序二叉樹的線索化,并找指定結點的先序后繼

#include<stdio.h> #include<stdlib.h> #define elemType char //線索二叉樹結點 typedef struct ThreadNode{ elemType data; struct ThreadNode *lchild,*rchild; int ltag,rtag;//用來判斷一個結點是否有線索 }ThreadNode,*ThreadTree; //全局變量…

螞蟻集團轉正實習大模型算法崗內推

1.負責以大模型為代表的A轉術能力的建設和優化&#xff0c;打造業界領先的A(技術系統&#xff0c;主要職責包括A系統結構設計、RAG 系統開發、大模型凱練數據構建、大模型能力評測、大模型準理效果和效率優化等 2.緊密跟蹤、探索大模型方向前沿技術&#xff0c;依托豐富目體系化…

未授權漏洞大賞

ActiveMQ未授權訪問漏洞 漏洞描述 Apache ActiveMQ是美國阿帕奇&#xff08;Apache&#xff09;軟件基金會所研發的一套開源的消息中間件&#xff0c;它支持Java消息服務、集群、Spring Framework等。 Apache ActiveMQ管理控制臺的默認管理用戶名和密碼分別為admin和admin&am…

Python包結構與 `__init__.py` 詳解

1. 什么是 __init__.py&#xff1f; __init__.py 是Python包的標識文件&#xff0c;它告訴Python解釋器這個目錄應該被視為一個包&#xff08;Package&#xff09;。這個文件可以為空&#xff0c;也可以包含初始化代碼。 1.1 基本作用 包的標識 將普通目錄轉換為Python包允許…

Web前端開發——HTML基礎下

HTML語法 一表格1.基本格式2.美化表格合并居中屬性 二表單1.input2.select3.textarea4.button5.date6.color7.checkbox8.radio9.range10.number 一表格 1.基本格式 HTML表格由<table>標簽定義 其中行由<tr>標簽定義&#xff0c;單元格由<td>定義。我們先來…

小程序事件系統 —— 33 事件傳參 - data-*自定義數據

事件傳參&#xff1a;在觸發事件時&#xff0c;將一些數據作為參數傳遞給事件處理函數的過程&#xff0c;就是事件傳參&#xff1b; 在微信小程序中&#xff0c;我們經常會在組件上添加一些自定義數據&#xff0c;然后在事件處理函數中獲取這些自定義數據&#xff0c;從而完成…

安卓設備root檢測與隱藏手段

安卓設備root檢測與隱藏手段 引言 安卓設備的root權限為用戶提供了深度的系統控制能力&#xff0c;但也可能帶來安全風險。因此&#xff0c;許多應用&#xff08;如銀行軟件、游戲和流媒體平臺&#xff09;會主動檢測設備是否被root&#xff0c;并限制其功能。這種對抗催生了ro…

如何在Ubuntu上直接編譯Apache Doris

以下是在 Ubuntu 22.04 上直接編譯 Apache Doris 的完整流程&#xff0c;綜合多個版本和環境的最佳實踐&#xff1a; 注意&#xff1a;Ubuntu的數據盤VMware默認是20G&#xff0c;編譯不夠用&#xff0c;給到50G以上吧 一、環境準備 1. 安裝系統依賴 # 基礎構建工具鏈 apt i…

vuejs相關鏈接和格式化插件推薦

vue官網&#xff1a; https://cn.vuejs.org/ 配合路由設置&#xff1a; https://router.vuejs.org/zh/guide/ element plus (vue3) | element UI (vue2)&#xff1a; https://element-plus.org/zh-CN/#/zh-CN 構建工具vite&#xff1a; https://cn.vitejs.dev/ 右鍵選擇…

IDEA中Git版本回退終極指南:Reset與Revert雙方案詳解

目錄 前言一、版本回退前置知識二、Reset方案&#xff1a;整體改寫歷史1、IDEA圖形化操作&#xff08;推薦&#xff09;1.1、查看提交歷史1.2、選擇目標版本1.3、選擇回退模式1.3.1、Soft&#xff08;推薦&#xff09;1.3.2、Mixed1.3.3、Hard&#xff08;慎用&#xff09;1.3.…

PHP并發請求優化:使用`curl_multi_select()`實現高效的多請求處理

PHP并發請求優化&#xff1a;使用curl_multi_select()實現高效的多請求處理 背景 最近在項目中遇到一個需求&#xff0c;需要從多個 1 級網站&#xff08;超過 200 個&#xff09;獲取數據&#xff0c;并且是通過 POST 請求瞬間發送到這些網站上。開始時我直接使用了 curl_ex…