域名注冊和網(wǎng)站建設(shè)深圳關(guān)鍵詞優(yōu)化報價
前言
本文指的數(shù)據(jù)集為通用數(shù)據(jù)集,并不單是給機器學(xué)習(xí)領(lǐng)域使用。包含科研和工業(yè)領(lǐng)域需要自己制作數(shù)據(jù)集的。
首先,在制作大型數(shù)據(jù)集時,代碼錯誤和數(shù)據(jù)問題可能會非常復(fù)雜。
前期邏輯總是簡單的,庫庫一頓寫,等排查的時候兩眼無淚。
后期慢慢摸排和檢查的時候不斷完善代碼,前期代碼主要是完成功能,后期是增加維護性和檢測性。
這部分工作其實前期可以考慮進去。
以下提供一些血淚經(jīng)驗
方法
1. 模塊化設(shè)計
將代碼分成多個小模塊或函數(shù),每個模塊負(fù)責(zé)一個特定的任務(wù)。這樣更容易定位和修復(fù)問題。
模塊化在最開始拿到需求和實現(xiàn)思路的時候估計還做不到,但代碼寫到一定程度該考慮拆成模塊的就得拆成模塊。不然后期調(diào)試會特別復(fù)雜。
2.單元測試
TDD我是支持的,但同時寫測試和代碼我是做不到的。所以對我來說都是代碼寫到一定程度再考慮添加單元測試。分為功能測試,計算測試,還有數(shù)據(jù)樣例測試。
3.日志記錄
需要記錄過程數(shù)據(jù),推薦建立單獨文件夾,存儲計算中的過程數(shù)據(jù)。
注意!!! 這個除了開發(fā)階段非常有用! 后期在程序上線生產(chǎn)環(huán)境后對于幫助排查bug也是非常有幫助的,上線后注意的是控制過程數(shù)據(jù)文件數(shù)量。
如圖,一般建立check_data文件夾或者logs文件夾。
還可以用logging模塊,代碼如圖:
import logginglogging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)def process_data(data):logger.debug("Starting data processing")logger.debug("Data processing completed")
但我個人傾向自定義log文件。logging模塊的排版雖然整齊,無用字符也太多了。自己單獨費點時間寫個表保存。
曬一下,嘿嘿:
4. debug
打斷點逐步調(diào)試?yán)?#xff01;!沒有捷徑可走,加油吧少年!!
5.數(shù)據(jù)驗證
在每個計算步驟核對計算結(jié)果確保計算正確。
6.版本控制
保存每個能跑的版本。不管是不是shit。
可以用管理工具git也可以手動保存。
7.數(shù)據(jù)抽樣
對數(shù)據(jù)集進行抽樣組成小樣本數(shù)據(jù)集代入程序進行驗證和核對結(jié)果,可以大大減少工作量!
8.自動化測試
編寫自動化測試腳本,定期運行這些腳本以檢測新引入的錯誤??梢允褂肅I/CD工具(如Jenkins、GitHub Actions)來實現(xiàn)這一點。
9.并行處理
將數(shù)據(jù)集切分多個進程進行計算,加快速度同時也會幫助更快發(fā)現(xiàn)問題!
提供一個按進程數(shù)均分?jǐn)?shù)據(jù)集進行計算的代碼:
from multiprocessing import Process
import timedef func_demo(age,name_list)for name in name_list:print(name,":",age)def func(param1,process_number):# 總輸入xxx_list = [str(i) for i in range(100)]# 統(tǒng)計任務(wù)數(shù)量number = len(xxx_list) # 計算平均每個進程需承擔(dān)多少任務(wù)delta = int(number / process_number)p_list = []# 啟動多進程for i in range(0, process_number):# 按delta遍歷取需要計算的任務(wù)。if i == process_number - 1:s = delta * ie = numberelse:s = delta * ie = delta * (i + 1)p = Process(target=calculate_name, args=(param1, xxx_list[s:e]))p.start()p_list.append(p)for p in p_list:p.join()# 測試劃分的對不對
def test_p_delta():number = len(xxx_list)delta = int(number / 4)for i in range(0, 4):if i == 3:s = delta * ie = numberelse:s = delta * ie = delta * (i + 1)print("s:", s, " e:", e)if __name__ == '__main__':age=10process_number = 4func(age,process_number)
10.文檔和注釋
確保代碼有充分的文檔和注釋,后期翻看的時候,也能快速理解代碼邏輯和數(shù)據(jù)處理過程。
希望對看官有所幫助!!!