<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
1. 本文介紹的是基於TensorFlow tf.estimator
介面的深度學習網路,而非TensorFlow 2.0
中常用的Keras
介面;關於Keras
介面實現深度學習迴歸,我們將在下一篇部落格中介紹。
2. 本文程式碼以DNNRegressor
迴歸為例;而由於基於 tf.estimator
介面的深度學習迴歸與分類整體較為類似,因此二者具有觸類旁通的效果。
3. 本文第二部分為程式碼的分解介紹,第三部分為完整程式碼。
4. 相關版本資訊:
3.8.5
;2.4.1
;4.1.5
。首先需要引入相關的庫與包。
import os import openpyxl import numpy as np import pandas as pd import tensorflow as tf import scipy.stats as stats import matplotlib.pyplot as plt from sklearn import metrics from sklearn.model_selection import train_test_split
其次,基於TensorFlow的程式碼往往會輸出較多的紀錄檔資訊,從而使得我們對程式碼執行情況的瞭解受到一定影響。程式碼輸出的紀錄檔資訊有四種,依據嚴重程度由低到高排序:INFO
(通知)<WARNING
(警告)<ERROR
(錯誤)<FATAL
(致命的);我們可以通過如下程式碼來對TensorFlow的輸出紀錄檔資訊加以約束。
os.environ['TF_CPP_MIN_LOG_LEVEL']='3'
其中,3代表只輸出FATAL
資訊。但要注意,這句程式碼需要放在import tensorflow
的前面:
import os os.environ['TF_CPP_MIN_LOG_LEVEL']='3' import openpyxl import numpy as np import pandas as pd import tensorflow as tf import scipy.stats as stats import matplotlib.pyplot as plt from sklearn import metrics from sklearn.model_selection import train_test_split
深度學習程式碼一大特點即為具有較多的引數需要我們手動定義。為避免調參時上下翻找,我們可以將主要的引數集中在一起,方便我們後期調整。
其中,具體引數的含義在本文後續部分詳細介紹。
# 將各類變數放在一個位置集中定義,十分有利於機器學習等變數較多的程式碼 MyModelPath="G:/CropYield/03_DL/02_DNNModle" # 確定每一次訓練所得模型儲存的位置 MyDataPath="G:/CropYield/03_DL/00_Data/AllDataAll.csv" # 確定輸入資料的位置 MyResultSavePath="G:/CropYield/03_DL/03_OtherResult/EvalResult54.xlsx" # 確定模型精度結果(RMSE等)與模型引數儲存的位置 TestSize=0.2 # 確定資料中測試集所佔比例 RandomSeed=np.random.randint(low=24,high=25) # 確定劃分訓練集與測試集的亂數種子 OptMethod='Adam' # 確定模型所用的優化方法 LearningRate=0.01 # 確定學習率 DecayStep=200 # 確定學習率下降的步數 DecayRate=0.96 # 確定學習率下降比率 HiddenLayer=[64,128] # 確定隱藏層數量與每一層對應的神經元數量 ActFun='tf.nn.relu' # 確定啟用函數 Dropout=0.3 # 確定Dropout的值 LossReduction='tf.compat.v1.ReductionV2.SUM_OVER_BATCH_SIZE' # 指定每個批次訓練誤差的減小方法 BatchNorm='False' # 確定是否使用Batch Normalizing TrainBatchSize=110 # 確定訓練資料一個Batch的大小 TrainStep=3000 # 確定訓練資料的Step數量 EvalBatchSize=1 # 確定驗證資料一個Batch的大小 PredictBatchSize=1 # 確定預測資料(即測試集)一個Batch的大小
DNNRegressor
每執行一次,便會在指定路徑中儲存當前執行的模型。為保證下一次模型儲存時不受上一次模型執行結果乾擾,我們可以將模型資料夾內的全部檔案刪除。
# DeleteOldModel函數,刪除上一次執行所儲存的模型 def DeleteOldModel(ModelPath): AllFileName=os.listdir(ModelPath) # 獲取ModelPath路徑下全部檔案與資料夾 for i in AllFileName: NewPath=os.path.join(ModelPath,i) # 分別將所獲取的檔案或資料夾名稱與ModelPath路徑組合 if os.path.isdir(NewPath): # 若組合後的新路徑是一個資料夾 DeleteOldModel(NewPath) # 遞迴呼叫DeleteOldModel函數 else: os.remove(NewPath) # 若不是一個新的資料夾,而是一個檔案,那麼就刪除 # 呼叫DeleteOldModel函數,刪除上一次執行所儲存的模型 DeleteOldModel(MyModelPath)
需要注意,以上程式碼僅刪除指定路徑下的檔案,資料夾不刪除。大家如果需要將資料夾也同時刪除,修改以上程式碼函數中的後面幾句即可。
我的資料已經儲存在了.csv
檔案中,因此可以用pd.read_csv
直接讀取。
其中,資料的每一列是一個特徵,每一行是全部特徵與因變數(就是下面的Yield
)組合成的樣本。
# LoadData函數,載入全部資料 def LoadData(DataPath): MyData=pd.read_csv(DataPath,names=['EVI0610','EVI0626','EVI0712','EVI0728','EVI0813','EVI0829', 'EVI0914','EVI0930','EVI1016','Lrad06','Lrad07','Lrad08', 'Lrad09','Lrad10','Prec06','Prec07','Prec08','Prec09', 'Prec10','Pres06','Pres07','Pres08','Pres09','Pres10', 'SIF161','SIF177','SIF193','SIF209','SIF225','SIF241', 'SIF257','SIF273','SIF289','Shum06','Shum07','Shum08', 'Shum09','Shum10','SoilType','Srad06','Srad07','Srad08', 'Srad09','Srad10','Temp06','Temp07','Temp08','Temp09', 'Temp10','Wind06','Wind07','Wind08','Wind09','Wind10', 'Yield'],header=0) # 載入DataPath路徑所指定的資料,names中的內容為各列的名稱 return MyData # 初始資料處理 AllXY=LoadData(MyDataPath) # 呼叫LoadData函數,獲取資料 Label={"Yield":AllXY.pop("Yield")} # 將因變數從全部資料中提取出 AllX,AllY=AllXY,(pd.DataFrame(Label)) # 將自變數與因變數分離 # 劃分資料訓練集與測試集 TrainX,TestX,TrainY,TestY=train_test_split(AllX, AllY, test_size=TestSize, # 指定資料中測試集所佔比例 random_state=RandomSeed # 指定劃分訓練集與測試集的亂數種子 )
Feature Columns
就是一個橋樑,聯絡你的初始資料與模型;其好比一個名單,模型拿著這個名單到你的資料(即本文2.4部分你匯入的資料)中按列的名稱一一搜尋,若初始資料中的某列名稱在Feature Columns
裡,那麼模型就會把初始資料中這一列的資料全部拿到自己這裡,進行訓練。
因為我們是希望匯入資料的全部特徵,那麼可以直接在全部資料的自變數中迴圈,將全部特徵的名稱匯入Feature Columns
。
在這裡需要注意的是,只有連續數值變數才可以用tf.feature_column.numeric_column
處理;若是類別變數可以對其加以獨熱編碼等操作。
# estimator介面中的模型需要用「Feature columns」物件作為輸入資料,只有這樣模型才知道讀取哪些資料 FeatureColumn=[] # 定義一個新的「Feature columns」物件 for key in AllX.keys(): FeatureColumn.append(tf.feature_column.numeric_column(key=key)) # 將全部因變數資料(需要均為連續變數)匯入
模型優化方法即模型中的optimizer
,其可以在模型結構構建時輸入;但有時優化方法較為複雜(例如引入了學習率下降),那麼在構建模型時設定優化方法的話就會有些不方便。因此我們首先構建模型優化方法。
# 定義模型優化方法 # Optimizer=OptMethod # 優化方法選用OptMethod所指定的方法 Optimizer=lambda:tf.keras.optimizers.Adam( learning_rate=tf.compat.v1.train.exponential_decay(learning_rate=LearningRate, # 初始學習率 global_step=tf.compat.v1.train.get_global_step(), # 全域性步數,用以計算已經衰減後的學習率 # get_global_step()函數自動獲取當前的已經執行的步數 decay_steps=DecayStep, # 學習率下降完成的指定步數 decay_rate=DecayRate # 衰減率 ) # 選用基於學習率指數下降的Adam方法,此舉有助於降低過擬合風險 # 這一函數返回每次對應的學習率 )
以上程式碼中有兩個Optimizer=
,第一個是直接輸入優化方法的名稱即可,名稱包括:'Adagrad'
, 'Adam'
, 'Ftrl'
, 'RMSProp'
, SGD'
;預設為Adagrad
。
第二個是在選擇了優化方法的基礎上,設定其他資訊。例如第二個,其代表著學習率指數下降的Adam優化方法。其中,tf.compat.v1.train.exponential_decay
可視作一個計算每次訓練學習率的函數,他返回的是每一次對應的學習率。可能這麼說不太好理解,看這個公式:其返回值為learning_rate *decay_rate ^ (global_step / decay_steps)
,是不是就明白啦。
我們選擇第二個優化方法,因此把第一個註釋掉。
隨後,我們定義模型的結構。
# 基於DNNRegressor構建深度學習模型 DNNModel=tf.estimator.DNNRegressor(feature_columns=FeatureColumn, # 指定模型所用的「Feature columns」物件 hidden_units=HiddenLayer, # 指定隱藏層數量與每一層對應的神經元數量 optimizer=Optimizer, # 指定模型所用的優化方法 activation_fn=eval(ActFun), # 指定啟用函數 dropout=Dropout, # 指定Dropout的值 label_dimension=1, # 輸出資料的維度,即因變數的個數 model_dir=MyModelPath, # 指定每一次訓練所得模型儲存的位置 # loss_reduction=eval(LossReduction), # 指定每個批次訓練誤差的減小方法 batch_norm=eval(BatchNorm) # 指定是否使用Batch Normalizing )
模型的構建,對照著程式碼上的註釋,就比較好理解了;其中,我把loss_reduction
註釋掉,是因為可能由於TensorFlow版本的問題,其總是報錯,所以就用預設的值就好;而最後一個batch_norm
,決定了是否進行Batch Normalizing。Batch Normalizing可以保持深度神經網路在每一層保持相同分佈,從而加快網路收斂與增強網路穩固性。
其它引數可以參考官方網站,這裡暫時不再贅述。
訓練模型這一部分,我認為反而比模型的構建可能還難理解一些。我們先看程式碼:
# 基於訓練資料訓練模型 DNNModel.train(input_fn=lambda:InputFun(TrainX, TrainY, True, TrainBatchSize ), # 呼叫InputFun函數;InputFun函數返回「tf.data.Dataset」物件,這個物件才可以被 # train函數識別並帶入模型;由於InputFun函數每次返回BatchSize大小的資料個數, # 因此需要多次執行,前面需要加lambda steps=TrainStep # 指定模型訓練的步數 )
我們可以這麼理解:在train
函數中,只有一個引數input_fn
;而這個引數的輸入,又是一個新的函數——這個新的函數就是大名鼎鼎的input function
了。
他長這個樣子:
# InputFun函數,訓練資料與驗證資料所用的Input函數 def InputFun(Features,Labels,Training,BatchSize): Datasets=tf.data.Dataset.from_tensor_slices((dict(Features),Labels)) # 對資料加以載入 if Training: Datasets=Datasets.shuffle(1000).repeat() # 對於訓練資料,需要打亂(shuffle)、重複(repeat) return Datasets.batch(BatchSize) # 將經過上述處理後的資料以每次BatchSize個輸出
那我們首先就看input function
——也就是程式碼中的InputFun
函數。其實這個函數的用處很簡單,用官網的話說,其就是用來輸入模型支援的資料型別的——只有經過input function
處理後,資料才可以被DNNRegressor
識別。聽上去這麼厲害,它到底是如何操作的呢?
很簡單,它只需要將初始的資料轉換為特定的格式即可,這個格式是一個元組(tuple
),這個元組有兩個元素:
一就是features
,是一個字典。這個字典的每一個鍵是每一個特徵的名稱,就比如用植物特性對花的種類加以區分,那麼花的“葉長”“葉片厚度”等等就是一個個特徵的名稱,也就是這裡的一個個“鍵”;而這個字典的值,就是這個特徵對應的全部樣本的數值組成的陣列。
二就是label
,是全部樣本對應的label
,也就是因變數。
不知道大家有沒有理解,我們就舉一個簡單的例子。假如我們用兩個地方的溫度與降水預測這兩個地方的作物產量:其溫度分別為10 ℃、20 ℃,降水分別為15 mm,25 mm,作物產量分別為100千克每公頃,150千克每公頃——那麼tuple
由兩個部分組成:
tuple=(features,label) features={'溫度':np.array([10,20]),'降水':np.array([15,25])} label=np.array([100,150])
怎麼樣,是不是明白啦。
理解了之後,我們繼續看InputFun
函數。首先,tf.data.Dataset.from_tensor_slices
用來將輸入的資料載入並轉換為Datase
的形式;隨後,如果是訓練狀態下,那麼資料會進行打亂.shuffle(1000)
——相當於對資料加以洗牌,防止初始資料具有一定的趨勢。例如如果我們做分類,其中初始資料的前80%都是第一類,後20%都是第二類,那麼如果我們不打亂資料,會使得用前80%資料訓練出來的結果都是第一類(即模型只認識第一類),在後20%進行測試時,所得結果也全都為第一類;所以要打亂。其中的1000
是buffer_size
引數,這個資料必須要比你的資料樣本個數大。至於.shuffle(1000)
這個函數的原理我一直沒有搞明白,大家感興趣的話可以加以進一步瞭解。
.repeat()
則是對資料集加以重複,之所以要重複,是因為我們需要對全部資料訓練好幾輪(即好幾個Epoch
),因此要對初始資料加以重複。
隨後,用.batch()
函數輸出BatchSize
個資料,也就是一批資料;其中BatchSize
就是每一批資料的個數。
這個就是InputFun
函數。再看train
函數函數:大家也看出來了,這個InputFun
函數是每次輸出一批(BatchSize
個)資料;而我們訓練的時候,肯定是要一批一批不停輸入資料的,因此這就解釋了為什麼InputFun
函數前有一個lambda
——因為InputFun
函數要把處理後的資料分多次傳給train
。
理解了以上內容,接下來就好理解多了。我們需要進行驗證與測試的操作——其實驗證也就是利用了測試集資料,之所以我還進行了測試,是因為希望可以獲取測試集預測結果,從而更直觀地瞭解模型精度水平。
# InputFunPredict函數,測試資料所用的Input函數 def InputFunPredict(Features,BatchSize): return tf.data.Dataset.from_tensor_slices(dict(Features)).batch(BatchSize) # 對資料加以載入,以每次BatchSize個輸出 # 驗證模型並儲存驗證結果 EvalResult=DNNModel.evaluate(input_fn=lambda:InputFun(TestX, TestY, False, EvalBatchSize ) ) # 列印驗證結果 print('ev:{}'.format(EvalResult)) # 基於測試資料測試模型精度結果 PredictValues=DNNModel.predict(input_fn=lambda:InputFunPredict(TestX, PredictBatchSize ) )
其中,驗證時.evaluate
所用的InputFun
函數其實和訓練集所用的是一樣的函數,只不過驗證時不需要進行打亂.shuffle(1000)
和重複.repeat()
操作;而測試時.predict
的InputFun
函數則是新的,其只需要輸入自變數、無需輸入因變數。
精度評定與擬合影象就不用過多說啦~最終,我們最好將模型引數與精度衡量指標結果儲存在Excel表格中,這樣子方便之後的調參過程。這裡就不再一一介紹啦,大家對照程式碼中的註釋即可。
# AccuracyVerification函數,進行精度驗證指標的計算與繪圖 def AccuracyVerification(PredictLabels,TestLabels): value=0 PredictValuesList=[] for k in PredictLabels: value=k.get('predictions')[0] PredictValuesList.append(value) TestLabels=TestLabels.values.tolist() TestYList=sum(TestLabels,[]) # 以上為獲取測試資料的因變數與模型預測所得的因變數 Pearsonr=stats.pearsonr(TestYList,PredictValuesList) # 計算皮爾遜相關係數 R2=metrics.r2_score(TestYList,PredictValuesList) # 計算R方 RMSE=metrics.mean_squared_error(TestYList,PredictValuesList)**0.5 # 計算RMSE plt.cla() plt.plot(TestYList,PredictValuesList,'r*') plt.xlabel('Actual Values') plt.ylabel('Predicted Values') # 以上為繪製擬合影象 print('Pearson correlation coefficient is {0}, and RMSE is {1}.'.format(Pearsonr[0],RMSE)) return (Pearsonr[0],R2,RMSE,PredictValuesList) # WriteAccuracy函數,將模型所涉及的引數與最終精度結果儲存 def WriteAccuracy(*WriteVar): ExcelData=openpyxl.load_workbook(WriteVar[0]) SheetName=ExcelData.get_sheet_names() # 獲取全部Sheet WriteSheet=ExcelData.get_sheet_by_name(SheetName[0]) # 獲取指定Sheet WriteSheet=ExcelData.active # 啟用指定Sheet MaxRowNum=WriteSheet.max_row # 獲取指定Sheet對應第一個空行 for i in range(len(WriteVar)-1): exec("WriteSheet.cell(MaxRowNum+1,i+1).value=WriteVar[i+1]") # 用exec執行語句,寫入資訊 ExcelData.save(WriteVar[0]) # 儲存檔案 # 呼叫AccuracyVerification函數,進行精度驗證指標的計算與繪圖 AccuracyResult=AccuracyVerification(PredictValues,TestY) PearsonR,R2,RMSE,PredictY=AccuracyResult[0],AccuracyResult[1],AccuracyResult[2],AccuracyResult[3] # 呼叫WriteAccuracy函數,將模型所涉及的引數與最終精度結果儲存 WriteAccuracy(MyResultSavePath,PearsonR,R2,RMSE,TestSize,RandomSeed,OptMethod,LearningRate,DecayStep, DecayRate,','.join('%s' %i for i in HiddenLayer),ActFun,Dropout,LossReduction, BatchNorm,TrainBatchSize,TrainStep,EvalBatchSize,PredictBatchSize)
至此,全部的程式碼分解介紹都結束啦~
# -*- coding: utf-8 -*- """ Created on Tue Feb 23 16:13:21 2021 @author: Chutj """ # 載入必要的庫、包等 import os os.environ['TF_CPP_MIN_LOG_LEVEL']='3' import openpyxl import numpy as np import pandas as pd import tensorflow as tf import scipy.stats as stats import matplotlib.pyplot as plt from sklearn import metrics from sklearn.model_selection import train_test_split # ===============*** 函數宣告區域 ***=============== # DeleteOldModel函數,刪除上一次執行所儲存的模型 def DeleteOldModel(ModelPath): AllFileName=os.listdir(ModelPath) # 獲取ModelPath路徑下全部檔案與資料夾 for i in AllFileName: NewPath=os.path.join(ModelPath,i) # 分別將所獲取的檔案或資料夾名稱與ModelPath路徑組合 if os.path.isdir(NewPath): # 若組合後的新路徑是一個資料夾 DeleteOldModel(NewPath) # 遞迴呼叫DeleteOldModel函數 else: os.remove(NewPath) # 若不是一個新的資料夾,而是一個檔案,那麼就刪除 # LoadData函數,載入全部資料 def LoadData(DataPath): MyData=pd.read_csv(DataPath,names=['EVI0610','EVI0626','EVI0712','EVI0728','EVI0813','EVI0829', 'EVI0914','EVI0930','EVI1016','Lrad06','Lrad07','Lrad08', 'Lrad09','Lrad10','Prec06','Prec07','Prec08','Prec09', 'Prec10','Pres06','Pres07','Pres08','Pres09','Pres10', 'SIF161','SIF177','SIF193','SIF209','SIF225','SIF241', 'SIF257','SIF273','SIF289','Shum06','Shum07','Shum08', 'Shum09','Shum10','SoilType','Srad06','Srad07','Srad08', 'Srad09','Srad10','Temp06','Temp07','Temp08','Temp09', 'Temp10','Wind06','Wind07','Wind08','Wind09','Wind10', 'Yield'],header=0) # 載入DataPath路徑所指定的資料,names中的內容為各列的名稱 return MyData # InputFun函數,訓練資料與驗證資料所用的Input函數 def InputFun(Features,Labels,Training,BatchSize): Datasets=tf.data.Dataset.from_tensor_slices((dict(Features),Labels)) # 對資料加以載入 if Training: Datasets=Datasets.shuffle(1000).repeat() # 對於訓練資料,需要打亂(shuffle)、重複(repeat) return Datasets.batch(BatchSize) # 將經過上述處理後的資料以每次BatchSize個輸出 # InputFunPredict函數,測試資料所用的Input函數 def InputFunPredict(Features,BatchSize): return tf.data.Dataset.from_tensor_slices(dict(Features)).batch(BatchSize) # 對資料加以載入,以每次BatchSize個輸出 # AccuracyVerification函數,進行精度驗證指標的計算與繪圖 def AccuracyVerification(PredictLabels,TestLabels): value=0 PredictValuesList=[] for k in PredictLabels: value=k.get('predictions')[0] PredictValuesList.append(value) TestLabels=TestLabels.values.tolist() TestYList=sum(TestLabels,[]) # 以上為獲取測試資料的因變數與模型預測所得的因變數 Pearsonr=stats.pearsonr(TestYList,PredictValuesList) # 計算皮爾遜相關係數 R2=metrics.r2_score(TestYList,PredictValuesList) # 計算R方 RMSE=metrics.mean_squared_error(TestYList,PredictValuesList)**0.5 # 計算RMSE plt.cla() plt.plot(TestYList,PredictValuesList,'r*') plt.xlabel('Actual Values') plt.ylabel('Predicted Values') # 以上為繪製擬合影象 print('Pearson correlation coefficient is {0}, and RMSE is {1}.'.format(Pearsonr[0],RMSE)) return (Pearsonr[0],R2,RMSE,PredictValuesList) # WriteAccuracy函數,將模型所涉及的引數與最終精度結果儲存 def WriteAccuracy(*WriteVar): ExcelData=openpyxl.load_workbook(WriteVar[0]) SheetName=ExcelData.get_sheet_names() # 獲取全部Sheet WriteSheet=ExcelData.get_sheet_by_name(SheetName[0]) # 獲取指定Sheet WriteSheet=ExcelData.active # 啟用指定Sheet MaxRowNum=WriteSheet.max_row # 獲取指定Sheet對應第一個空行 for i in range(len(WriteVar)-1): exec("WriteSheet.cell(MaxRowNum+1,i+1).value=WriteVar[i+1]") # 用exec執行語句,寫入資訊 ExcelData.save(WriteVar[0]) # 儲存檔案 # ===============*** 程式碼由此開始執行 ***=============== # ++++++++++--- 建議由這裡開始看 ---++++++++++ # 將各類變數放在一個位置集中定義,十分有利於機器學習等變數較多的程式碼 MyModelPath="G:/CropYield/03_DL/02_DNNModle" # 確定每一次訓練所得模型儲存的位置 MyDataPath="G:/CropYield/03_DL/00_Data/AllDataAll.csv" # 確定輸入資料的位置 MyResultSavePath="G:/CropYield/03_DL/03_OtherResult/EvalResult54.xlsx" # 確定模型精度結果(RMSE等)與模型引數儲存的位置 TestSize=0.2 # 確定資料中測試集所佔比例 RandomSeed=np.random.randint(low=24,high=25) # 確定劃分訓練集與測試集的亂數種子 OptMethod='Adam' # 確定模型所用的優化方法 LearningRate=0.01 # 確定學習率 DecayStep=200 # 確定學習率下降的步數 DecayRate=0.96 # 確定學習率下降比率 HiddenLayer=[64,128] # 確定隱藏層數量與每一層對應的神經元數量 ActFun='tf.nn.relu' # 確定啟用函數 Dropout=0.3 # 確定Dropout的值 LossReduction='tf.compat.v1.ReductionV2.SUM_OVER_BATCH_SIZE' # 指定每個批次訓練誤差的減小方法 BatchNorm='False' # 確定是否使用Batch Normalizing TrainBatchSize=110 # 確定訓練資料一個Batch的大小 TrainStep=3000 # 確定訓練資料的Step數量 EvalBatchSize=1 # 確定驗證資料一個Batch的大小 PredictBatchSize=1 # 確定預測資料(即測試集)一個Batch的大小 # 呼叫DeleteOldModel函數,刪除上一次執行所儲存的模型 DeleteOldModel(MyModelPath) # 初始資料處理 AllXY=LoadData(MyDataPath) # 呼叫LoadData函數,獲取資料 Label={"Yield":AllXY.pop("Yield")} # 將因變數從全部資料中提取出 AllX,AllY=AllXY,(pd.DataFrame(Label)) # 將自變數與因變數分離 # 劃分資料訓練集與測試集 TrainX,TestX,TrainY,TestY=train_test_split(AllX, AllY, test_size=TestSize, # 指定資料中測試集所佔比例 random_state=RandomSeed # 指定劃分訓練集與測試集的亂數種子 ) # estimator介面中的模型需要用「Feature columns」物件作為輸入資料,只有這樣模型才知道讀取哪些資料 FeatureColumn=[] # 定義一個新的「Feature columns」物件 for key in AllX.keys(): FeatureColumn.append(tf.feature_column.numeric_column(key=key)) # 將全部因變數資料(需要均為連續變數)匯入 # 定義模型優化方法 # Optimizer=OptMethod # 優化方法選用OptMethod所指定的方法 Optimizer=lambda:tf.keras.optimizers.Adam( learning_rate=tf.compat.v1.train.exponential_decay(learning_rate=LearningRate, # 初始學習率 global_step=tf.compat.v1.train.get_global_step(), # 全域性步數,用以計算已經衰減後的學習率 # get_global_step()函數自動獲取當前的已經執行的步數 decay_steps=DecayStep, # 學習率下降完成的指定步數 decay_rate=DecayRate # 衰減率 ) # 選用基於學習率指數下降的Adam方法,此舉有助於降低過擬合風險 # 這一函數返回每次對應的學習率 ) # 基於DNNRegressor構建深度學習模型 DNNModel=tf.estimator.DNNRegressor(feature_columns=FeatureColumn, # 指定模型所用的「Feature columns」物件 hidden_units=HiddenLayer, # 指定隱藏層數量與每一層對應的神經元數量 optimizer=Optimizer, # 指定模型所用的優化方法 activation_fn=eval(ActFun), # 指定啟用函數 dropout=Dropout, # 指定Dropout的值 label_dimension=1, # 輸出資料的維度,即因變數的個數 model_dir=MyModelPath, # 指定每一次訓練所得模型儲存的位置 # loss_reduction=eval(LossReduction), # 指定每個批次訓練誤差的減小方法 batch_norm=eval(BatchNorm) # 指定是否使用Batch Normalizing ) # tf.compat.v1.logging.set_verbosity(tf.compat.v1.logging.INFO) # 將INFO級別的紀錄檔資訊顯示到螢幕 # 基於訓練資料訓練模型 DNNModel.train(input_fn=lambda:InputFun(TrainX, TrainY, True, TrainBatchSize ), # 呼叫InputFun函數;InputFun函數返回「tf.data.Dataset」物件,這個物件才可以被 # train函數識別並帶入模型;由於InputFun函數每次返回BatchSize大小的資料個數, # 因此需要多次執行,前面需要加lambda steps=TrainStep # 指定模型訓練的步數 ) # 驗證模型並儲存驗證結果 EvalResult=DNNModel.evaluate(input_fn=lambda:InputFun(TestX, TestY, False, EvalBatchSize ) ) # 列印驗證結果 print('ev:{}'.format(EvalResult)) # 基於測試資料測試模型精度結果 PredictValues=DNNModel.predict(input_fn=lambda:InputFunPredict(TestX, PredictBatchSize ) ) # 呼叫AccuracyVerification函數,進行精度驗證指標的計算與繪圖 AccuracyResult=AccuracyVerification(PredictValues,TestY) PearsonR,R2,RMSE,PredictY=AccuracyResult[0],AccuracyResult[1],AccuracyResult[2],AccuracyResult[3] # 呼叫WriteAccuracy函數,將模型所涉及的引數與最終精度結果儲存 WriteAccuracy(MyResultSavePath,PearsonR,R2,RMSE,TestSize,RandomSeed,OptMethod,LearningRate,DecayStep, DecayRate,','.join('%s' %i for i in HiddenLayer),ActFun,Dropout,LossReduction, BatchNorm,TrainBatchSize,TrainStep,EvalBatchSize,PredictBatchSize)
以上就是Python基於TensorFlow介面實現深度學習神經網路迴歸的詳細內容,更多關於Python TensorFlow深度學習神經網路迴歸的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45