0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用PyTorch加速圖像分割

jf_pJlTbmA9 ? 來源:jf_pJlTbmA9 ? 作者:jf_pJlTbmA9 ? 2023-08-31 14:27 ? 次閱讀

英特爾

使用 Intel 擴(kuò)展 PyTorrch 來提升圖像處理性能

PyTorrch提供了巨大的CPU性能,并且隨著PyTorrch的Intel擴(kuò)展而可以進(jìn)一步加速。 我用PyTorrch 1.13.1(與ResNet34 Ulet 結(jié)構(gòu))培訓(xùn)了一個(gè)AI圖像分割模型,以便從衛(wèi)星圖象中確定道路和速度限制,所有這些都在第四Gen Intelé Xeon可縮放處理器上進(jìn)行。

我會(huì)帶你們走走這些步驟 與一個(gè)稱為SpaceNet5的衛(wèi)星圖像數(shù)據(jù)集合作 以及如何優(yōu)化代碼 使CPU的深層學(xué)習(xí)工作量

在我們開始之前,一些家務(wù)...

本條所附的代碼可在下列文件的示例文件夾中查閱:PyTorrch 倉庫的 Intel 擴(kuò)展. 我從從衛(wèi)星圖像(CRESI)儲(chǔ)存庫中抽取城市規(guī)模道路。 我對(duì)它進(jìn)行了改造, 以適應(yīng)第四 Gentel Xeon 處理器, 以及PyTorrch 優(yōu)化和PyTorch 的 Intel 擴(kuò)展名優(yōu)化。 特別是,我能夠利用這里的筆記本.

你可以找到我給你的隨同談話在YouTube上.

我強(qiáng)烈建議這些文章詳細(xì)解釋如何開始使用SpaceNet5數(shù)據(jù):

空間網(wǎng)5基線——第1部分:圖像和標(biāo)簽準(zhǔn)備

空間網(wǎng)5基線——第2部分:培訓(xùn)公路速度分割模式

空間網(wǎng)5基線——第3部分:從衛(wèi)星圖像中提取公路速度矢量

SpaceNet 5 SpaceNet 5 贏贏模型發(fā)布模式:道路的終點(diǎn)

我引用了Julien Simon的兩個(gè)Hugging Face博客,金屬-16xl:

使用 Intel Sapphire Rapids 的加速火爐變速器, 第1部分

使用 Intel Sapphire Rapids 的加速火炬變速器,第2部分

使用 CPU 實(shí)例而不是在主要云服務(wù)供應(yīng)商( CSP) 使用 GPU 實(shí)例可能節(jié)省大量成本。 最新的處理器仍在向 CSP 推出, 所以我正在使用 INTel Xeon 第四次 Gente Intel Xeon 處理器, 該處理器設(shè)在 Intel 開發(fā)者云上( 您可以在此報(bào)名 ) :. 云信息 com).

在 AWS 上,您可以從列 約*在你之后的EC2實(shí)例此處預(yù)覽的標(biāo)記(圖1)在編寫本報(bào)告時(shí),新的AI加速發(fā)動(dòng)機(jī)Intel 高級(jí)母體擴(kuò)展裝置(Intel AMX)僅供光金屬使用,但不久將在虛擬機(jī)器上啟用。

wKgaomTv_YiAcr7uAACsIYmzVKU493.png

圖1 圖1AWS EC2(作者圖像)上的第四次Gen Xeon實(shí)例清單

在 Google Cloud* 平臺(tái)上,您可以從第四 Gen Xeon 可縮放處理器 C3 VMs(圖2)中選擇。

wKgZomTv_Y-ACYqeAABYe4dCC64475.png

圖2 圖2. Google Cloud平臺(tái)上的第四 Gen Intel Xeon 可縮放處理器實(shí)例列表(作者圖像)

硬件介紹和優(yōu)化

2023年1月釋放了第四 Gen Intel Xeon 處理器,我使用的光金屬實(shí)例有兩個(gè)插座(每個(gè)插座有56個(gè)物理核心),504GB內(nèi)存和英特爾 AMX 加速。 我在后端安裝了幾個(gè)關(guān)鍵庫,以控制和監(jiān)測我在CPU上使用的插座、內(nèi)存和核心:

numactl(與sudo APT- Get 安裝 numactl)

伊利維埃米耶馬洛茨(與安裝 libjemalloc 的 sudo appet- get)

intel- openmp(與conda 安裝 intel- openmp)

gperftotototool 的 gperfftotototo 工具, gperfftototo 工具工具(與conda 安裝 gperftotototool 的 gperfftotototo 工具, gperfftototo 工具工具 - c conda- forge 的 gperftotototool 的 gperfftotototo 工具, gperfftototo 工具工具 - c conda- forge)

PyTorrch PyTorch 和 Intel 擴(kuò)展的 PyTerch 都有輔助腳本, 因而不需要明確使用intel- openmp和numactl,但是它們確實(shí)需要安裝在后端。如果您想要設(shè)置它們用于其他工作,這就是我用來用于 OpenMP * 的內(nèi)容。

導(dǎo)出 縮寫(_num) 縮寫(_N)=36 導(dǎo)出 KMP_AFFIY=granciality=fine, compact, 1,0 導(dǎo)出 kmp_ 阻塞時(shí)間=1

. 何處縮寫(_num) 縮寫(_N)是分配給該任務(wù)的線條數(shù),kmp- 親度影響線條親和設(shè)置(包括相互接近的包裝線、釘線狀態(tài)),以及kmp_ 阻塞時(shí)間以毫秒設(shè)定時(shí)間, 空線在睡覺前應(yīng)該等待時(shí)間 。

以下是我用來做的東西numactl …

numactl - C 0-35 - membind=0 train.

在那里... ... 在那里...-C指定要使用和-- memembind -- membind指示程序只使用一個(gè)套接字( 在這種情況下, 套接字為 0 ) 。

空間網(wǎng)數(shù)據(jù)

我用的是衛(wèi)星圖像數(shù)據(jù)空間網(wǎng)5挑戰(zhàn)不同城市可免費(fèi)下載AWS S3桶:

aws s3是 s3://spacenet-dataset/spacenet/SN5_roads/tarballs/ -- -- 人類可讀

2019-09-03 20:59 3.8 GIB SN5_Roads_test_public_AOI_7_Moscow.tar.gz 2019-09-24 08:43:02 3.2 GIB SN5_test_public_AOI_7_Moscow.gz 2019-09-24 08:43:02 GIB SN5_test_ public_AOI_8_San_Juan.tar.gz 2019-09-14 13:13:19-09-14 13:13:3:34.5 GIB SN5_test_rations_train_AOI_8_Mumbai.tar.gz

您可以使用以下命令下載和拆解文件 :

aws s3 cp s3://spacenet-dataset/spacenet/SN5_roads/tarballs/SN5_roads_train_AOI_7_Moscow.tar.gz. tar-xvzf ~/spacenet5data/moscow/SN5_roads_train_AOI_7_Moscow.tar.gz z

數(shù)據(jù)集準(zhǔn)備

我使用了莫斯科衛(wèi)星衛(wèi)星圖像數(shù)據(jù)集,該數(shù)據(jù)集由1,352張1,300比1,300像素的1,352張圖像組成,在不同的文本文件中有相應(yīng)的街道標(biāo)簽,其中包括8波段多頻譜圖像和3波段RGB圖像。圖3顯示了四種RGB衛(wèi)星圖像樣本及其相應(yīng)的面具。yped_ masks. py 速度和量從 CRESI 倉庫生成分隔面罩的腳本 。

wKgaomTv_cyAOb5JAAKxR7yiTZM410.png

圖3 圖33. 莫斯科(頂行)的衛(wèi)星圖像3頻道RGB芯片和具有不同速度限制(底排)的對(duì)應(yīng)像素分離面罩(作者圖像)

還有一個(gè)JSON配置文件,必須更新其余所有組成部分:培訓(xùn)和驗(yàn)證分解、培訓(xùn)和推論。在此可以找到一個(gè)示例配置。我進(jìn)行了80:20的培訓(xùn)/驗(yàn)證分解,確保指向正確的衛(wèi)星圖像文件夾和相應(yīng)的培訓(xùn)面具。以GitHub為例的筆記本,.

培訓(xùn)ResNet34聯(lián)合國模式

我做了一些修改cresi 縮寫為了在CPU上運(yùn)行并優(yōu)化培訓(xùn),以下的代碼描述如下,以便運(yùn)行在CPU上并優(yōu)化培訓(xùn)。自定義模型 = nn.DataParallel( 模型). cuda ()與自定義模型 = nn.DataParallel( 模型)和在列列. py腳本中01_tran.py 01_tran.py 01_tran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py刪除腳本irch.randn( 10) cuda ().

為優(yōu)化培訓(xùn),增加intel_ extension_ for_ pytorch 導(dǎo)入為 ipex 的 intel_ extension_ for_ pytorch中輸入對(duì)帳單的輸入對(duì)帳單列列. py在將模型和優(yōu)化器定義如下之后:

自我模型 = nn.DataParallel( 模型) 自我. 優(yōu)化 = 優(yōu)化( 自我. 模型. 參數(shù) (), lr= config. lr)

添加Ex. 優(yōu)化使用 BF16 精度的行, 而不是 FP32:

自我模范,自我優(yōu)化 = ipex. 優(yōu)化(自. model, 優(yōu)化 = self. 優(yōu)化, dtype= torch.bfloat16)

添加一條行, 用于混合精度訓(xùn)練, 只需在前方過路和計(jì)算損失函數(shù)前完成 :

使用 torch. cpu. amp. autocast () : 如果動(dòng)詞 : 打印 (“ 輸入. shape, 目標(biāo). shape : ” , 輸入. shape, 目標(biāo). shape ) 輸出 = 自我 。 模型( 輸入) 計(jì)量 = self. calculate_ loss_ single_ channel( 輸出、 目標(biāo)、 計(jì)量、 訓(xùn)練、 超大小 )

現(xiàn)在我們已經(jīng)優(yōu)化了訓(xùn)練守則, 我們可以開始訓(xùn)練我們的模型。

喜歡SpaceNet 5 競賽獲勝者,我訓(xùn)練了一個(gè) ResNet34 編碼器 Unet 解碼器模型。該模型經(jīng)過了圖像網(wǎng)絡(luò)重量的預(yù)先訓(xùn)練,而骨干在訓(xùn)練期間完全解凍。01_tran.py 01_tran.py 01_tran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py但為了控制硬件的使用, 我使用了一個(gè)助手腳本。 實(shí)際上有兩個(gè)助手腳本: 一個(gè)是股票 PyTorch 的腳本, 一個(gè)是 PyToch 的 Intel 擴(kuò)展版 。 它們都完成了同樣的事情, 但第一個(gè)來自股票的腳本是后端. xeon. run_ cpu,第二個(gè)來自 英特爾擴(kuò)展的PyTorrch是Ipexrun 擴(kuò)展.

這是我在指揮線上運(yùn)行的:

python - m short. trachends.xeon. run_ cpu - stinstances 1 -- ncores_per_instance 32  -- log_path/ home/devcloud/spacenet5data/ moscow/v10_xeon4_ devcloud22. 04/logs/run_cpu_logs/home/devcloud/cresi 縮寫/cresi 縮寫/01_train. py / home/devcloud/cresi 縮寫/cresi 縮寫/cresi 縮寫/configs/ ben/v10_xeon4_ baseline_ben.json -- fold=0

Ipexrun 擴(kuò)展 - stinstance 1 -- ncore_per_instance 32/ home/devcloud/cresi 縮寫/cresi 縮寫/01_tran.py 01_tran.py 01_tran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py/ home/devcloud/cresi 縮寫/cresi 縮寫/cresi 縮寫/configs/ben/v10_xeon4_ baseline_ben.json -- fold=0

在這兩種情況下,我都要求PyTorrch在一個(gè)有32個(gè)核心的插座上進(jìn)行訓(xùn)練。 運(yùn)行后,我得到一份打印出哪些環(huán)境變量在后端設(shè)置,以了解PyTorrch是如何使用硬件的:

INFO - 使用 CDMalloc 內(nèi)存分布器INFO - 縮寫(_num) 縮寫(_N)=32 INFO - 使用 Intel OpenMP InFO - KMP_AFITY=granality=fine, compact, 1,0INFO - KMP_BLOCICTIME=1 INFO - LD_PRELOAD=/ home/devcloud/.conda/env/py39/lib/lib/lib/libclomp5.so:/home/dloud/.conda/env/py39/b/bin/python-u 01_tran.py 01_tran.py 01_tran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.py 01_triran.pycongs/ben/v10_xon4_baseline_ben.jfold=0

在培訓(xùn)期間,我確保我的完全損失功能正在減少(即模式正在趨于一致,尋找解決辦法)。

推斷

在培訓(xùn)模型后, 我們可以開始僅從衛(wèi)星圖像中進(jìn)行預(yù)測。 在 evval. py 推斷腳本中, 將導(dǎo)入的 intel_ extension_ for_ pytorch 添加為導(dǎo)入語句的 Ipex 。 在裝入 PyTorch 模型后, 使用 PyTorrch 的 Intel 擴(kuò)展來優(yōu)化 BF16 推斷的模型 :

模型 = irch.load( os. path. join( path_ model_ 量重, “ fold_ best. pth”.format( fold)), 地圖_ 位置 = lambda 存儲(chǔ), loc: 存儲(chǔ)) 模型. eval () 模型 = ipex. optimize( 模型, dtype = rch. bfloat16)

在進(jìn)行預(yù)測之前,增加兩行,以達(dá)到混雜精度:

使用 torch.no_ grad (): 使用 rch. cpu. amp. autocast (): 用于 pbar 中的數(shù)據(jù) : 樣本 = rch. autograd. 可變( 數(shù)據(jù) [ “ 圖像 , 揮發(fā)性 = True ) 預(yù)測 = 預(yù)測 (模型、 樣本、 翻頁 = self. flips )

運(yùn)行推論,我們可以使用02_eval.py現(xiàn)在我們有了經(jīng)過訓(xùn)練的模型, 我們可以在衛(wèi)星圖像上作出預(yù)測(圖4), 我們可以看到它似乎在繪制與圖像相近的道路圖!

wKgZomTv_iOAKEgwAANcd7bv7L4608.png

圖4 圖41. 莫斯科衛(wèi)星圖像和隨附的道路預(yù)測(作者圖像)

我意識(shí)到我所訓(xùn)練的模型過于適合莫斯科圖像數(shù)據(jù),贏得此項(xiàng)挑戰(zhàn)的解決方案從六個(gè)城市(拉斯維加斯、巴黎、上海、喀土穆、莫斯科、孟買)獲得的數(shù)據(jù)和新城市的表現(xiàn)良好。 在未來,值得測試的一件事就是在所有六個(gè)城市進(jìn)行培訓(xùn),并在另一個(gè)城市進(jìn)行推論,以復(fù)制其結(jié)果。

關(guān)于處理后的說明

還可以采取進(jìn)一步的后處理步驟,在地圖中添加掩碼作為圖表特征。 您可以在此閱讀關(guān)于后處理步驟的更多信息:

空間網(wǎng)5基線——第3部分:從衛(wèi)星圖像中提取公路速度矢量

后處理腳本

結(jié)語

總之,我們:

創(chuàng)建了1 352個(gè)圖像培訓(xùn)面罩(速度限制),與我們的培訓(xùn)衛(wèi)星圖像數(shù)據(jù)(來自.geojson文本文件標(biāo)簽)相對(duì)應(yīng)。

定義了用于培訓(xùn)和推斷的配置文件

將我們的數(shù)據(jù)分成培訓(xùn)和鑒定組

優(yōu)化了我們的CPU培訓(xùn)守則,包括使用PyTorch和BF16的Intel擴(kuò)展

在第四 Gentel Xeon CPU 上培訓(xùn)了表演者ResNet34 UNet 模型

Ran 初始推論,以看到預(yù)測速度限制面罩的速度

您可以找到在此列出第四 Gentel Xeon CPU 的詳細(xì)基準(zhǔn).

下一步步驟

使用 PyTorrch 的 Intel 擴(kuò)展擴(kuò)展號(hào), 擴(kuò)展 Intel CPU 的優(yōu)化 :

pip 安裝 intel- extension 用于 Pytorch 的 Intel- extension 設(shè)備

git 克隆 https://github.com/intel/intel/intel-extension-for-pytorch

聯(lián)系我 聯(lián)系連連In如果你還有問題要問!

PyTorrch 的 Intel 擴(kuò)展的更多信息可在此處找到.

獲取軟件

我鼓勵(lì)你查查英特爾的另外一個(gè)AIAI 工具工具框架框架框架框架優(yōu)化和了解開放、基于標(biāo)準(zhǔn)的單api構(gòu)成英特爾的AI軟件組合基礎(chǔ)的多神多神多神多神多神多造編程模式。

有關(guān)第四任英特爾Xeon 縮放可縮放處理器的更多詳情,訪問AI 平臺(tái)英特爾是如何授權(quán)開發(fā)商運(yùn)行高性能、高效端對(duì)端的AI管道的。

PyTollch 資源

啟動(dòng) PyTork 啟動(dòng)

D. 討論討論

文檔文件文件


審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • intel
    +關(guān)注

    關(guān)注

    19

    文章

    3478

    瀏覽量

    185654
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    29806

    瀏覽量

    268103
  • 圖像分割
    +關(guān)注

    關(guān)注

    4

    文章

    182

    瀏覽量

    17960
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    802

    瀏覽量

    13115
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    PCB缺陷檢測中圖像分割算法

    圖像分割圖像處理中占有重要的地位,分割結(jié)果的好壞直接影響圖像的后續(xù)處理。本文介紹了4種常用的圖像
    發(fā)表于 06-16 15:31 ?0次下載
    PCB缺陷檢測中<b class='flag-5'>圖像</b><b class='flag-5'>分割</b>算法

    圖像分割—基于圖的圖像分割

    圖像分割—基于圖的圖像分割圖像分割—基于圖的圖像
    發(fā)表于 11-19 16:17 ?0次下載

    基于Matlab圖像分割的研究

    圖像分割圖像處理過渡到圖像分析這個(gè)過程中起著非常重要的作用,它是圖像工程的核心,圖像
    發(fā)表于 01-04 15:10 ?0次下載

    基于加速k均值的譜聚類圖像分割算法改進(jìn)_李昌興

    基于加速k均值的譜聚類圖像分割算法改進(jìn)_李昌興
    發(fā)表于 03-19 19:25 ?0次下載

    圖像分割圖像邊緣檢測

     圖像分割的研究多年來一直受到人們的高度重視,至今提出了各種類型的分割算法。Pal把圖像分割算法分成了6類:閾值
    發(fā)表于 12-19 09:29 ?1.1w次閱讀
    <b class='flag-5'>圖像</b><b class='flag-5'>分割</b>和<b class='flag-5'>圖像</b>邊緣檢測

    圖像分割技術(shù)的原理及應(yīng)用

    圖像分割至今尚無通用的自身理論。隨著各學(xué)科許多新理論和新方法的提出,出現(xiàn)了許多與一些特定理論、方法相結(jié)合的圖像分割方法。特征空間聚類法進(jìn)行圖像
    發(fā)表于 12-19 15:00 ?4.1w次閱讀
    <b class='flag-5'>圖像</b><b class='flag-5'>分割</b>技術(shù)的原理及應(yīng)用

    圖像分割的基本方法解析

    本文詳細(xì)介紹了圖像分割的基本方法有:基于邊緣的圖像分割方法、閾值分割方法、區(qū)域分割方法、基于圖論
    發(fā)表于 12-20 11:06 ?10.9w次閱讀
    <b class='flag-5'>圖像</b><b class='flag-5'>分割</b>的基本方法解析

    基于內(nèi)容的圖像分割方法綜述

    圖像分割是指將圖像分成若干具有相似性質(zhì)的區(qū)域的過程,是許多圖像處理任務(wù)的預(yù)處理步驟.近年來,國內(nèi)外學(xué)者主要研究基于圖像內(nèi)容的
    發(fā)表于 01-02 16:52 ?2次下載
    基于內(nèi)容的<b class='flag-5'>圖像</b><b class='flag-5'>分割</b>方法綜述

    PyTorch教程7.2之圖像卷積

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程7.2之圖像卷積.pdf》資料免費(fèi)下載
    發(fā)表于 06-05 10:13 ?0次下載
    <b class='flag-5'>PyTorch</b>教程7.2之<b class='flag-5'>圖像</b>卷積

    PyTorch教程14.1之圖像增強(qiáng)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程14.1之圖像增強(qiáng).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 14:24 ?0次下載
    <b class='flag-5'>PyTorch</b>教程14.1之<b class='flag-5'>圖像</b>增強(qiáng)

    PyTorch教程14.9之語義分割和數(shù)據(jù)集

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程14.9之語義分割和數(shù)據(jù)集.pdf》資料免費(fèi)下載
    發(fā)表于 06-05 11:10 ?0次下載
    <b class='flag-5'>PyTorch</b>教程14.9之語義<b class='flag-5'>分割</b>和數(shù)據(jù)集

    人體分割識(shí)別圖像技術(shù)的原理及應(yīng)用

    人體分割識(shí)別圖像技術(shù)是一種將人體從圖像分割出來,并對(duì)人體進(jìn)行識(shí)別和特征提取的技術(shù)。該技術(shù)主要利用計(jì)算機(jī)視覺和圖像處理算法對(duì)人體
    的頭像 發(fā)表于 06-15 17:44 ?1039次閱讀

    什么是圖像分割?圖像分割的體系結(jié)構(gòu)和方法

    圖像分割(Image Segmentation)是計(jì)算機(jī)視覺領(lǐng)域中的一項(xiàng)重要基礎(chǔ)技術(shù),是圖像理解中的重要一環(huán)。前端時(shí)間,數(shù)據(jù)科學(xué)家Derrick Mwiti在一篇文章中,就什么是圖像
    的頭像 發(fā)表于 08-18 10:34 ?5816次閱讀
    什么是<b class='flag-5'>圖像</b><b class='flag-5'>分割</b>?<b class='flag-5'>圖像</b><b class='flag-5'>分割</b>的體系結(jié)構(gòu)和方法

    圖像分割和語義分割的區(qū)別與聯(lián)系

    圖像分割和語義分割是計(jì)算機(jī)視覺領(lǐng)域中兩個(gè)重要的概念,它們?cè)?b class='flag-5'>圖像處理和分析中發(fā)揮著關(guān)鍵作用。 1. 圖像
    的頭像 發(fā)表于 07-17 09:55 ?623次閱讀

    圖像語義分割的實(shí)用性是什么

    圖像語義分割是一種重要的計(jì)算機(jī)視覺任務(wù),它旨在將圖像中的每個(gè)像素分配到相應(yīng)的語義類別中。這項(xiàng)技術(shù)在許多領(lǐng)域都有廣泛的應(yīng)用,如自動(dòng)駕駛、醫(yī)學(xué)圖像分析、機(jī)器人導(dǎo)航等。 一、
    的頭像 發(fā)表于 07-17 09:56 ?336次閱讀