本篇內(nèi)容主要講解“Pytorch的使用技巧有哪些”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Pytorch的使用技巧有哪些”吧!
創(chuàng)新互聯(lián)專注于洮北網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供洮北營(yíng)銷型網(wǎng)站建設(shè),洮北網(wǎng)站制作、洮北網(wǎng)頁(yè)設(shè)計(jì)、洮北網(wǎng)站官網(wǎng)定制、微信平臺(tái)小程序開發(fā)服務(wù),打造洮北網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供洮北網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。
訓(xùn)練模型,最常看的指標(biāo)就是 Loss。我們可以根據(jù) Loss 的收斂情況,初步判斷模型訓(xùn)練的好壞。
如果,Loss 值突然上升了,那說(shuō)明訓(xùn)練有問題,需要檢查數(shù)據(jù)和代碼。
如果,Loss 值趨于穩(wěn)定,那說(shuō)明訓(xùn)練完畢了。
觀察 Loss 情況,最直觀的方法,就是繪制 Loss 曲線圖。
通過繪圖,我們可以很清晰的看到,左圖還有收斂空間,而右圖已經(jīng)完全收斂。
通過 Loss 曲線,我們可以分析模型訓(xùn)練的好壞,模型是否訓(xùn)練完成,起到一個(gè)很好的“監(jiān)控”作用。
繪制 Loss 曲線圖,第一步就是需要保存訓(xùn)練過程中的 Loss 值。
一個(gè)最簡(jiǎn)單的方法是使用,sys.stdout 標(biāo)準(zhǔn)輸出重定向,簡(jiǎn)單好用,實(shí)乃“煉丹”必備“良寶”。
import os import sys class Logger(): def __init__(self, filename="log.txt"): self.terminal = sys.stdout self.log = open(filename, "w") def write(self, message): self.terminal.write(message) self.log.write(message) def flush(self): pass sys.stdout = Logger() print("Jack Cui") print("https://cuijiahua.com") print("https://mp.weixin.qq.com/s/OCWwRVDFNslIuKyiCVUoTA")
代碼很簡(jiǎn)單,創(chuàng)建一個(gè) log.py 文件,自己寫一個(gè) Logger 類,并采用 sys.stdout 重定向輸出。
在 Terminal 中,不僅可以使用 print 打印結(jié)果,同時(shí)也會(huì)將結(jié)果保存到 log.txt 文件中。
運(yùn)行 log.py,打印 print 內(nèi)容的同時(shí),也將內(nèi)容寫入了 log.txt 文件中。
使用這個(gè)代碼,就可以在打印 Loss 的同時(shí),將結(jié)果保存到指定的 txt 中,比如保存上篇文章訓(xùn)練 UNet 的 Loss。
Matplotlib 是一個(gè) Python 的繪圖庫(kù),簡(jiǎn)單好用。
簡(jiǎn)單幾行命令,就可以繪制曲線圖、散點(diǎn)圖、條形圖、直方圖、餅圖等等。
在深度學(xué)習(xí)中,一般就是繪制曲線圖,比如 Loss 曲線、Acc 曲線。
舉一個(gè),簡(jiǎn)單的例子。
使用 sys.stdout 保存的 train_loss.txt,繪制 Loss 曲線。
train_loss.txt 下載地址:點(diǎn)擊查看
思路非常簡(jiǎn)單,讀取 txt 內(nèi)容,解析 txt 內(nèi)容,使用 Matplotlib 繪制曲線。
import matplotlib.pyplot as plt # Jupyter notebook 中開啟 # %matplotlib inline with open('train_loss.txt', 'r') as f: train_loss = f.readlines() train_loss = list(map(lambda x:float(x.strip()), train_loss)) x = range(len(train_loss)) y = train_loss plt.plot(x, y, label='train loss', linewidth=2, color='r', marker='o', markerfacecolor='r', markersize=5) plt.xlabel('Epoch') plt.ylabel('Loss Value') plt.legend() plt.show()
指定 x 和 y 對(duì)應(yīng)的值,就可以繪制。
是不是很簡(jiǎn)單?
說(shuō)到保存日志,那不得不提 Python 的內(nèi)置標(biāo)準(zhǔn)模塊 Logging,它主要用于輸出運(yùn)行日志,可以設(shè)置輸出日志的等級(jí)、日志保存路徑、日志文件回滾等,同時(shí),我們也可以設(shè)置日志的輸出格式。
import logging def get_logger(LEVEL, log_file = None): head = '[%(asctime)-15s] [%(levelname)s] %(message)s' if LEVEL == 'info': logging.basicConfig(level=logging.INFO, format=head) elif LEVEL == 'debug': logging.basicConfig(level=logging.DEBUG, format=head) logger = logging.getLogger() if log_file != None: fh = logging.FileHandler(log_file) logger.addHandler(fh) return logger logger = get_logger('info') logger.info('Jack Cui') logger.info('https://cuijiahua.com') logger.info('https://mp.weixin.qq.com/s/OCWwRVDFNslIuKyiCVUoTA')
只需要幾行代碼,進(jìn)行一個(gè)簡(jiǎn)單的封裝使用。使用函數(shù) get_logger 創(chuàng)建一個(gè)級(jí)別為 info 的 logger,如果指定 log_file,則會(huì)對(duì)日志進(jìn)行保存。
logging 默認(rèn)支持的日志一共有 5 個(gè)等級(jí):
日志級(jí)別等級(jí) CRITICAL > ERROR > WARNING > INFO > DEBUG。
默認(rèn)的日志級(jí)別設(shè)置為 WARNING,也就是說(shuō)如果不指定日志級(jí)別,只會(huì)顯示大于等于 WARNING 級(jí)別的日志。
例如:
import logging logging.debug("debug_msg") logging.info("info_msg") logging.warning("warning_msg") logging.error("error_msg") logging.critical("critical_msg")
運(yùn)行結(jié)果:
WARNING:root:warning_msg ERROR:root:error_msg CRITICAL:root:critical_msg
可以看到 info 和 debug 級(jí)別的日志不會(huì)輸出,默認(rèn)的日志格式也比較簡(jiǎn)單。
默認(rèn)的日志格式為日志級(jí)別:Logger名稱:用戶輸出消息
當(dāng)然,我們可以通過,logging.basicConfig 的 format 參數(shù),設(shè)置日志格式。
字段有很多,可謂應(yīng)有盡有,足以滿足我們定制化的需求。
上文介紹的“法寶”,并非針對(duì)深度學(xué)習(xí)“煉丹”使用的工具。
而 TensorboardX 則不同,它是專門用于深度學(xué)習(xí)“煉丹”的高級(jí)“法寶”。
早些時(shí)候,很多人更喜歡用 Tensorflow 的原因之一,就是 Tensorflow 框架有個(gè)一個(gè)很好的可視化工具 Tensorboard。
Pytorch 要想使用 Tensorboard 配置起來(lái)費(fèi)勁兒不說(shuō),還有很多 Bug。
Pytorch 1.1.0 版本發(fā)布后,打破了這個(gè)局面,TensorBoard 成為了 Pytorch 的正式可用組件。
在 Pytorch 中,這個(gè)可視化工具叫做 TensorBoardX,其實(shí)就是針對(duì) Tensorboard 的一個(gè)封裝,使得 PyTorch 用戶也能夠調(diào)用 Tensorboard。
TensorboardX 安裝也非常簡(jiǎn)單,使用 pip 即可安裝。
pip install tensorboardX
tensorboardX 使用也很簡(jiǎn)單,編寫如下代碼。
from tensorboardX import SummaryWriter # 創(chuàng)建 writer1 對(duì)象 # log 會(huì)保存到 runs/exp 文件夾中 writer1 = SummaryWriter('runs/exp') # 使用默認(rèn)參數(shù)創(chuàng)建 writer2 對(duì)象 # log 會(huì)保存到 runs/日期_用戶名 格式的文件夾中 writer2 = SummaryWriter() # 使用 commet 參數(shù),創(chuàng)建 writer3 對(duì)象 # log 會(huì)保存到 runs/日期_用戶名_resnet 格式的文件中 writer3 = SummaryWriter(comment='_resnet')
使用的時(shí)候,創(chuàng)建一個(gè) SummaryWriter 對(duì)象即可,以上展示了三種初始化 SummaryWriter 的方法:
提供一個(gè)路徑,將使用該路徑來(lái)保存日志
無(wú)參數(shù),默認(rèn)將使用 runs/日期_用戶名 路徑來(lái)保存日志
提供一個(gè) comment 參數(shù),將使用 runs/日期_用戶名+comment 路徑來(lái)保存日志
運(yùn)行結(jié)果:
有了 writer 我們就可以往日志里寫入數(shù)字、圖片、甚至聲音等數(shù)據(jù)。
這個(gè)是最簡(jiǎn)單的,使用 add_scalar 方法來(lái)記錄數(shù)字常量。
add_scalar(tag, scalar_value, global_step=None, walltime=None)
總共 4 個(gè)參數(shù)。
tag (string): 數(shù)據(jù)名稱,不同名稱的數(shù)據(jù)使用不同曲線展示
scalar_value (float): 數(shù)字常量值
global_step (int, optional): 訓(xùn)練的 step
walltime (float, optional): 記錄發(fā)生的時(shí)間,默認(rèn)為 time.time()
需要注意,這里的 scalar_value 一定是 float 類型,如果是 PyTorch scalar tensor,則需要調(diào)用 .item() 方法獲取其數(shù)值。我們一般會(huì)使用 add_scalar 方法來(lái)記錄訓(xùn)練過程的 loss、accuracy、learning rate 等數(shù)值的變化,直觀地監(jiān)控訓(xùn)練過程。
運(yùn)行如下代碼:
from tensorboardX import SummaryWriter writer = SummaryWriter('runs/scalar_example') for i in range(10): writer.add_scalar('quadratic', i**2, global_step=i) writer.add_scalar('exponential', 2**i, global_step=i) writer.close()
通過 add_scalar 往日志里寫入數(shù)字,日志保存到 runs/scalar_example中,writer 用完要記得 close,否則無(wú)法保存數(shù)據(jù)。
在 cmd 中使用如下命令:
tensorboard --logdir=runs/scalar_example --port=8088
指定日志地址,使用端口號(hào),在瀏覽器中,就可以使用如下地址,打開 Tensorboad。
http://localhost:8088/
省去了我們自己寫代碼可視化的麻煩。
使用 add_image 方法來(lái)記錄單個(gè)圖像數(shù)據(jù)。注意,該方法需要 pillow 庫(kù)的支持。
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
參數(shù):
tag (string):數(shù)據(jù)名稱
img_tensor (torch.Tensor / numpy.array):圖像數(shù)據(jù)
global_step (int, optional):訓(xùn)練的 step
walltime (float, optional):記錄發(fā)生的時(shí)間,默認(rèn)為 time.time()
dataformats (string, optional):圖像數(shù)據(jù)的格式,默認(rèn)為 'CHW',即 Channel x Height x Width,還可以是 'CHW'、'HWC' 或 'HW' 等
我們一般會(huì)使用 add_image 來(lái)實(shí)時(shí)觀察生成式模型的生成效果,或者可視化分割、目標(biāo)檢測(cè)的結(jié)果,幫助調(diào)試模型。
from tensorboardX import SummaryWriter from urllib.request import urlretrieve import cv2 urlretrieve(url = 'https://raw.githubusercontent.com/Jack-Cherish/Deep-Learning/master/Pytorch-Seg/lesson-2/data/train/label/0.png',filename = '1.jpg') urlretrieve(url = 'https://raw.githubusercontent.com/Jack-Cherish/Deep-Learning/master/Pytorch-Seg/lesson-2/data/train/label/1.png',filename = '2.jpg') urlretrieve(url = 'https://raw.githubusercontent.com/Jack-Cherish/Deep-Learning/master/Pytorch-Seg/lesson-2/data/train/label/2.png',filename = '3.jpg') writer = SummaryWriter('runs/image_example') for i in range(1, 4): writer.add_image('UNet_Seg', cv2.cvtColor(cv2.imread('{}.jpg'.format(i)), cv2.COLOR_BGR2RGB), global_step=i, dataformats='HWC') writer.close()
代碼就是下載上篇文章數(shù)據(jù)集里的三張圖片,然后使用 Tensorboard 可視化處理來(lái),使用 8088 端口開打 Tensorboard:
tensorboard --logdir=runs/image_example --port=8088
運(yùn)行結(jié)果:
試想一下,一邊訓(xùn)練,一邊輸出圖片結(jié)果,是不是很酸爽呢?
Tensorboard 中常用的 Scalar 和 Image,直方圖、運(yùn)行圖、嵌入向量等,可以查看官方手冊(cè)進(jìn)行學(xué)習(xí),方法都是類似的,簡(jiǎn)單好用。
到此,相信大家對(duì)“Pytorch的使用技巧有哪些”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
分享標(biāo)題:Pytorch的使用技巧有哪些
標(biāo)題URL:http://vcdvsql.cn/article14/gjjcde.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站營(yíng)銷、響應(yīng)式網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、靜態(tài)網(wǎng)站、App開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)