機(jī)器學(xué)習(xí)技術(shù)任務(wù)驅(qū)動(dòng)式教程-課件 模塊10 基于深度學(xué)習(xí)的分類預(yù)測_第1頁
機(jī)器學(xué)習(xí)技術(shù)任務(wù)驅(qū)動(dòng)式教程-課件 模塊10 基于深度學(xué)習(xí)的分類預(yù)測_第2頁
機(jī)器學(xué)習(xí)技術(shù)任務(wù)驅(qū)動(dòng)式教程-課件 模塊10 基于深度學(xué)習(xí)的分類預(yù)測_第3頁
機(jī)器學(xué)習(xí)技術(shù)任務(wù)驅(qū)動(dòng)式教程-課件 模塊10 基于深度學(xué)習(xí)的分類預(yù)測_第4頁
機(jī)器學(xué)習(xí)技術(shù)任務(wù)驅(qū)動(dòng)式教程-課件 模塊10 基于深度學(xué)習(xí)的分類預(yù)測_第5頁
已閱讀5頁,還剩112頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

掌握構(gòu)造DataLoader掌握構(gòu)造多層感知機(jī)掌握構(gòu)造卷積神經(jīng)網(wǎng)絡(luò)掌握構(gòu)造循環(huán)神經(jīng)網(wǎng)絡(luò)掌握訓(xùn)練深度學(xué)習(xí)模型掌握使用深度模型預(yù)測樣本參考書目《機(jī)器學(xué)習(xí)技術(shù)任務(wù)驅(qū)動(dòng)式教程》基于深度學(xué)習(xí)的分類預(yù)測模塊10機(jī)器學(xué)習(xí)技術(shù)目錄多層感知機(jī)預(yù)測糖尿病CNN識別圖像時(shí)間戳循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量小結(jié)習(xí)題十基于深度學(xué)習(xí)的分類預(yù)測模塊10機(jī)器學(xué)習(xí)技術(shù)本任務(wù)使用PinaIndians糖尿病發(fā)病情況數(shù)據(jù)集,樣本來自國家糖尿病、消化和腎臟疾病研究所。特別是,這里的所有病人都是至少21歲的皮馬印第安人血統(tǒng)的女性。這個(gè)數(shù)據(jù)集描述了PimaIndians的患者醫(yī)療記錄數(shù)據(jù),以及他們是否在五年內(nèi)發(fā)生糖尿病。數(shù)據(jù)集包括幾個(gè)醫(yī)學(xué)預(yù)測變量和一個(gè)目標(biāo)變量,即結(jié)果。預(yù)測變量包括懷孕次數(shù)、體重指數(shù)、胰島素水平、年齡等。詳細(xì)的字段描述見下表。1.1任務(wù)描述1.多層感知機(jī)預(yù)測糖尿病1.1任務(wù)描述構(gòu)造訓(xùn)練多層感知機(jī),訓(xùn)練模型擬合數(shù)據(jù)集樣本,并可視化訓(xùn)練過程中模型性能的變化。任務(wù)目標(biāo)字段類型允許為空標(biāo)簽?例子懷孕次數(shù)int否否62小時(shí)口服葡萄糖耐量試驗(yàn)中血漿葡萄糖濃度int否否148舒張壓int否否72三頭肌皮褶皺厚度int否否352小時(shí)血清胰島素

int否否0身體質(zhì)量指數(shù)float否否33.6糖尿病譜系功能float否否0.627年齡int否否50是否患糖尿病int否否0:否,1:是1.多層感知機(jī)預(yù)測糖尿病1.2

任務(wù)分解import方式引入依賴的模塊文件讀入DataFrame,抽樣檢查樣本值和數(shù)據(jù)分布數(shù)據(jù)封裝成PyTorch庫的DataLoader對象依賴庫導(dǎo)入數(shù)據(jù)觀察數(shù)據(jù)轉(zhuǎn)換從探查數(shù)據(jù)內(nèi)容開始,經(jīng)過數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)集分離,定義多層感知機(jī),迭代訓(xùn)練網(wǎng)絡(luò)模型擬合數(shù)據(jù)集樣本,可視化訓(xùn)練過程中訓(xùn)練性能和測試性能變化。1.多層感知機(jī)預(yù)測糖尿病1.2

任務(wù)分解定義一個(gè)包含2個(gè)隱藏層和1個(gè)輸出層的多層感知機(jī)采用反向傳播方式,更新各層的梯度值,找到模型的最優(yōu)或次優(yōu)參數(shù)模型構(gòu)建模型訓(xùn)練接上可視化模型在2個(gè)數(shù)據(jù)集上的準(zhǔn)確率變化訓(xùn)練過程可視化1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施1.3.1依賴庫導(dǎo)入步驟1:定義2級標(biāo)題。##<fontcolor="black">依賴庫導(dǎo)入</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:使用PyTorch深度學(xué)習(xí)框架實(shí)施模型創(chuàng)建和訓(xùn)練,支持在強(qiáng)大GPU上運(yùn)行矩陣運(yùn)算,也支持反向傳播過程中的自動(dòng)求導(dǎo)功能。1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施步驟2:導(dǎo)入依賴庫。importnumpyasnpimportpandasaspdfrommatplotlibimportpyplotaspltimportmatplotlibasmplfromtorchimportnnfromsklearn.model_selectionimporttrain_test_splitfromtorch.utils.dataimportTensorDataset,DataLoaderimporttorch1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施1.3.2數(shù)據(jù)觀察文件讀入DataFrame對象后,需要觀察屬性值和數(shù)據(jù)分布。步驟1:定義2級標(biāo)題。##<fontcolor="black">數(shù)據(jù)觀察</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施步驟2:把數(shù)據(jù)從文件讀入DataFrame對象。df=pd.read_csv("../data/pima-indians-diabetes.csv",header=0)df.shape按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟3:查看頭5條記錄。df.head()1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟4:查看各字段的統(tǒng)計(jì)特征。df.describe()1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施1.3.3數(shù)據(jù)轉(zhuǎn)換步驟1:定義2級標(biāo)題。##<fontcolor="black">數(shù)據(jù)轉(zhuǎn)換</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施步驟2:DataFrame對象轉(zhuǎn)換到Numpy類型。X=df.iloc[:,:-1].valuesy=df.iloc[:,-1].values.reshape(-1,1)X.shape,y.shape按“SHIFT+Enter”,運(yùn)行結(jié)果如下:Series對象的values方法返回是1維Numpy對象。PyTorch訓(xùn)練時(shí)要求輸入和標(biāo)簽都至少2維,因此使用reshape方法轉(zhuǎn)換到2維的Numpy對象作為標(biāo)簽。1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施步驟3:數(shù)據(jù)集切分為2部分:訓(xùn)練集和測試集,測試集占20%。X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)X_train.shape,X_test.shape,y_train.shape,y_test.shape按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施步驟4:把訓(xùn)練集封裝為DataLoader。train_data=TensorDataset(torch.Tensor(X_train),torch.Tensor(y_train))train_dataloader=DataLoader(train_data,batch_size=10,shuffle=True)test_data=TensorDataset(torch.Tensor(X_test),torch.Tensor(y_test))test_dataloader=DataLoader(test_data,batch_size=10,shuffle=True)在處理大數(shù)據(jù)集時(shí),一次將整個(gè)數(shù)據(jù)加載到內(nèi)存中變得非常難,DataLoader將數(shù)據(jù)分批加載到內(nèi)存中,一次讀入少量數(shù)據(jù)。DataLoader初始化時(shí)一般要設(shè)置batch_size控制每個(gè)批次的樣本數(shù)量;shuffle設(shè)置是否隨機(jī)抽取樣本。1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施1.3.4模型構(gòu)建步驟1:定義2級標(biāo)題。##<fontcolor="black">模型構(gòu)建</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施步驟2:定義一個(gè)簡單的多層感知機(jī)類,激化函數(shù)使用ReLU,輸出層使用Sigmoid函數(shù)計(jì)算糖尿病的概率。classNeuralNetwork(nn.Module):

def__init__(self):

super().__init__() self.flatten=nn.Flatten() self.linear_relu_stack=nn.Sequential(

nn.Linear(8,16),#全連接層

nn.ReLU(),#激活層1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施 nn.Linear(16,8),#全連接層

nn.ReLU(),#激活層

nn.Linear(8,1),#輸出層

nn.Sigmoid())defforward(self,x):

x=self.flatten(x)

logits=self.linear_relu_stack(x)

returnlogits接上1.多層感知機(jī)預(yù)測糖尿病激活函數(shù)隱藏層和輸出層的神經(jīng)元通過激活函數(shù)(ActivationFunction),將輸入端的加權(quán)和轉(zhuǎn)換成神經(jīng)元輸出值。在沒有激活函數(shù)的作用下,無論怎么調(diào)整網(wǎng)絡(luò)參數(shù),輸出值仍為線性,因此一般激活函數(shù)都是非線性的。常用的激活函數(shù)有:

監(jiān)督學(xué)習(xí)性能指標(biāo)

監(jiān)督學(xué)習(xí)性能指標(biāo)

1.3

任務(wù)實(shí)施步驟3:創(chuàng)建多層感知機(jī)。model=NeuralNetwork()model按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病多層感知機(jī)多層感知機(jī)(MultilayerPerceptron,MLP)是一種基于前饋神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),由輸入層、隱藏層和輸出層組成,其中隱藏層可以有多層。每一層的神經(jīng)元與相鄰層的神經(jīng)元相連,通過不斷調(diào)整神經(jīng)元之間的權(quán)重,實(shí)現(xiàn)對復(fù)雜問題的學(xué)習(xí)和預(yù)測。它是一種前向反饋網(wǎng)絡(luò),具有強(qiáng)大的處理能力和表達(dá)能力,廣泛應(yīng)用于分類、回歸、識別等各種任務(wù)中。單隱藏層的多層感知機(jī)如下圖所示:1.3

任務(wù)實(shí)施1.3.5模型訓(xùn)練步驟1:定義2級標(biāo)題。##<fontcolor="black">模型訓(xùn)練</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病步驟2:定義函數(shù)封裝在訓(xùn)練數(shù)據(jù)集上訓(xùn)練1代的過程。deftrain(dataloader,model,loss_fn,optimizer): size=len(dataloader.dataset)1.3

任務(wù)實(shí)施 model.train()#設(shè)置模型在訓(xùn)練狀態(tài) forbatch,(X,y)inenumerate(dataloader): pred=model(X)#正向傳播

loss=loss_fn(pred,y)#計(jì)算損失

loss.backward()#反向傳播 optimizer.step()#根據(jù)當(dāng)前參數(shù)值和梯度更新參數(shù)值 optimizer.zero_grad()#參數(shù)偏導(dǎo)設(shè)置為0

ifbatch%10==0:

loss,current=loss.item(),(batch+1)*len(X) print(f"loss:{loss:>7f}[{current:>5d}/{size:>5d}]")1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施1.多層感知機(jī)預(yù)測糖尿病步驟3:定義函數(shù)封裝測試過程。deftest(dataloader,model,loss_fn):

size=len(dataloader.dataset)

num_batches=len(dataloader)

model.eval()

test_loss,correct=0,0

withtorch.no_grad():#測試過程不涉及梯度計(jì)算

forX,yindataloader:

pred=model(X)

1.3

任務(wù)實(shí)施 test_loss+=loss_fn(pred,y).item()#縮進(jìn)三層

correct+=((pred>=0.5)==y).type(torch.float).sum().item()acc=correct/sizereturnacc,test_loss/num_batches1.多層感知機(jī)預(yù)測糖尿病步驟4:使用BCELoss損失函數(shù)評價(jià)預(yù)測值和真實(shí)值之間的差距。loss_fn=nn.BCELoss()模型狀態(tài)轉(zhuǎn)換model.train()改變模型到訓(xùn)練狀態(tài),model.eval()改變模型到測試狀態(tài),2個(gè)狀態(tài)轉(zhuǎn)換函數(shù)主要是對BN層和Dropout層有影響。BN層執(zhí)行model.train()之后,BN層對之后輸入的每個(gè)batch獨(dú)立計(jì)算其均值和方差,BN層的參數(shù)不斷發(fā)生變化。訓(xùn)練過程中每個(gè)batch的μ和σ都保存下來,然后加權(quán)平均當(dāng)做整個(gè)訓(xùn)練數(shù)據(jù)集的μ和σ用于測試。執(zhí)行model.eval()之后,BN層使用統(tǒng)計(jì)的μ和σ做測試,不再發(fā)生變化。

Dropout層執(zhí)行model.train()后,忽略一些神經(jīng)元。執(zhí)行model.train()后,使用所有神經(jīng)元。激活函數(shù)損失函數(shù)就是用來度量模型的預(yù)測值與真實(shí)值的差距,損失函數(shù)越小,模型的魯棒性就越好。每個(gè)批次的訓(xùn)練數(shù)據(jù)送入模型后,通過前向傳播輸出預(yù)測值,然后損失函數(shù)會計(jì)算出預(yù)測值和真實(shí)值之間的差距,也就是損失值。得到損失值之后,模型通過反向傳播去更新各個(gè)參數(shù),來降低真實(shí)值與預(yù)測值之間的損失,使得模型生成的預(yù)測值往真實(shí)值方向靠攏,從而達(dá)到學(xué)習(xí)的目的。常用的損失函數(shù)有:

監(jiān)督學(xué)習(xí)性能指標(biāo)

優(yōu)化器優(yōu)化器是深度學(xué)習(xí)中用于優(yōu)化神經(jīng)網(wǎng)絡(luò)模型的一類算法,其主要作用是根據(jù)模型的損失函數(shù)來調(diào)整模型的參數(shù),使得模型能夠更好地?cái)M合訓(xùn)練數(shù)據(jù),提高模型的性能和泛化能力。優(yōu)化器在訓(xùn)練過程中通過不斷更新模型的參數(shù),使模型逐步接近最優(yōu)解。常用的優(yōu)化器有:隨機(jī)梯度下降(SGD)RMSpropAdamAdaGrad1.3

任務(wù)實(shí)施步驟5:使用Adam優(yōu)化器更新模型權(quán)重。optimizer=torch.optim.Adam(model.parameters(),lr=1e-3)1.多層感知機(jī)預(yù)測糖尿病步驟6:迭代更新網(wǎng)絡(luò)模型權(quán)重,達(dá)到模型擬合訓(xùn)練樣本的效果。epochs=20train_accs=[]test_accs=[]按“SHIFT+Enter”,檢查輸出無異常。1.3

任務(wù)實(shí)施1.多層感知機(jī)預(yù)測糖尿病fortinrange(epochs): print(f"Epoch{t+1}\n--------------------") train(train_dataloader,model,loss_fn,optimizer) acc,one_loss=test(train_dataloader,model,loss_fn) print(f"訓(xùn)練:\n準(zhǔn)確率:{(100*acc):>0.1f}%,損失:{one_loss:>8f}") train_accs.append(acc) acc,one_loss=test(test_dataloader,model,loss_fn) print(f"測試:\n準(zhǔn)確率:{(100*acc):>0.1f}%,損失:{one_loss:>8f}") test_accs.append(acc)1.3

任務(wù)實(shí)施按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病……1.3

任務(wù)實(shí)施1.3.6訓(xùn)練過程可視化步驟1:定義2級標(biāo)題。##<fontcolor="black">訓(xùn)練過程可視化</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病步驟2:設(shè)置Matplotlib正常顯示中文字體和減號。mpl.rcParams["font.sans-serif"]=["SimHei"]mpl.rcParams["axes.unicode_minus"]=False1.3

任務(wù)實(shí)施步驟3:可視化訓(xùn)練過程。plt.plot(range(1,epochs+1),train_accs,color="blue",label="訓(xùn)練準(zhǔn)確率")plt.plot(range(1,epochs+1),test_accs,color="green",label="測試準(zhǔn)確率")plt.xlabel("代")plt.xticks(range(1,epochs+1))plt.legend(loc=0)plt.title("訓(xùn)練過程")plt.show()1.多層感知機(jī)預(yù)測糖尿病1.3

任務(wù)實(shí)施按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.多層感知機(jī)預(yù)測糖尿病監(jiān)控照片的左上方有拍攝時(shí)間(時(shí)間戳),要求識別出時(shí)間戳中的年/月/日/時(shí)/分/秒。訓(xùn)練用的數(shù)據(jù)集包含0~9的手寫數(shù)字,每個(gè)字母3個(gè)樣本。2.1任務(wù)描述2.CNN識別圖像時(shí)間戳2.1任務(wù)描述基于上圖的圖片數(shù)據(jù)集樣本,建立和訓(xùn)練CNN模型,使用模型識別監(jiān)控照片中的年/月/日/時(shí)/分/秒。任務(wù)目標(biāo)2.CNN識別圖像時(shí)間戳2.2

任務(wù)分解import方式引入依賴的模塊圖片目錄封裝為DataLoader創(chuàng)建包含卷積層、池化層、全連接層和Softmax層的CNN模型依賴庫導(dǎo)入數(shù)據(jù)轉(zhuǎn)換模型構(gòu)建把目標(biāo)目錄下的圖片樣本封裝為DataLoader,構(gòu)建CNN模型后多次訓(xùn)練使得模型擬合圖片數(shù)據(jù)集,然后應(yīng)用該模型識別監(jiān)控圖片中的數(shù)字。2.CNN識別圖像時(shí)間戳2.2

任務(wù)分解采用反向傳播方式更新各層的梯度值,找到CNN模型的最優(yōu)或次優(yōu)參數(shù)模型訓(xùn)練接上CNN模型識別監(jiān)控圖片的時(shí)間戳?xí)r間戳識別2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施2.3.1依賴庫導(dǎo)入步驟1:定義2級標(biāo)題。##<fontcolor="black">依賴庫導(dǎo)入</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟2:導(dǎo)入依賴庫。fromtorch.utils.dataimportDataset,DataLoaderfromtorchvisionimporttransforms,datasetsfrommatplotlibimportpyplotaspltimporttorchfromtorchimportnnimportnumpyasnp2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施2.3.2數(shù)據(jù)轉(zhuǎn)換步驟1:定義2級標(biāo)題。##<fontcolor="black">數(shù)據(jù)轉(zhuǎn)換</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟2:構(gòu)建變換列表作為轉(zhuǎn)換通道。transforms_train=transforms.Compose([

transforms.Grayscale(),#轉(zhuǎn)到灰度圖 transforms.ToTensor()#轉(zhuǎn)到Tensor類型,值變換到[0,1] ])2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,檢查輸出無異常。2.3

任務(wù)實(shí)施步驟3:從目標(biāo)目錄建立圖片數(shù)據(jù)集。2.CNN識別圖像時(shí)間戳ds_train=datasets.ImageFolder("../data/image/digit/",transform=transforms_train,target_transform=lambdat:torch.tensor([t]))print(ds_train)print(ds_train.classes)按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.3

任務(wù)實(shí)施2.CNN識別圖像時(shí)間戳步驟4:通過DataLoader加載ImageFolder。這里的num_workers為了避免出錯(cuò),盡量設(shè)置為0。train_dataloader=DataLoader(ds_train,batch_size=2,shuffle=True,num_workers=0)按“SHIFT+Enter”,檢查輸出無異常。2.3

任務(wù)實(shí)施步驟5:抽樣檢查樣本。2.CNN識別圖像時(shí)間戳plt.figure(figsize=(5,5))foriinrange(9):

img,label=ds_train[i]

print(img.shape)#圖像是c*w*h->w*h*c

img=img.permute(1,2,0)

ax=plt.subplot(3,3,i+1)

ax.imshow(img.numpy())2.3

任務(wù)實(shí)施2.CNN識別圖像時(shí)間戳 ax.set_title("label=%d"%label.item(),fontsize=8) ax.set_xticks([]) ax.set_yticks([])plt.show()接上按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.3

任務(wù)實(shí)施2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施2.3.3模型構(gòu)建步驟1:定義2級標(biāo)題。##<fontcolor="black">模型構(gòu)建</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟2:定義CNN(卷積神經(jīng)網(wǎng)絡(luò)),輸出概率向量。classImageNet(nn.Module):

def__init__(self):

super(ImageNet,self).__init__() self.conv1=nn.Conv2d(in_channels=1,out_channels=32,kernel_size=3,padding=1) self.relu1=nn.ReLU()

self.pool1=nn.MaxPool2d(kernel_size=2,stride=2)

self.conv2=nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,padding=1) self.relu2=nn.ReLU() self.pool2=nn.MaxPool2d(kernel_size=2,stride=2)2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施

self.conv3=nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1)self.relu3=nn.ReLU()self.pool3=nn.MaxPool2d(kernel_size=2,stride=2)self.flatten=nn.Flatten()self.fc1=nn.Linear(4096,512)self.relu4=nn.ReLU()

self.fc2=nn.Linear(512,10)

self.softmax=nn.Softmax(dim=-1)#對最后1列執(zhí)行Softmax操作2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施defforward(self,x): x=self.conv1(x) x=self.relu1(x) x=self.pool1(x)

x=self.conv2(x)

x=self.relu2(x)

x=self.pool2(x) x=self.conv3(x) x=self.relu3(x)

2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施

x=self.pool3(x)

x=self.flatten(x)

x=self.fc1(x)

x=self.relu4(x)

x=self.fc2(x)

x=self.softmax(x)

returnx2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,檢查輸出無異常。卷積神經(jīng)網(wǎng)絡(luò)多卷積神經(jīng)網(wǎng)絡(luò)(ConvolutionalNeuralNetwork,CNN)是一種特殊的人工神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),它在圖像識別、語音識別、自然語言處理等領(lǐng)域有著廣泛的應(yīng)用。CNN的特點(diǎn)在于其能夠自動(dòng)提取輸入數(shù)據(jù)的特征,從而實(shí)現(xiàn)對輸入數(shù)據(jù)的高效分類和識別。CNN結(jié)構(gòu)如下圖所示:卷積神經(jīng)網(wǎng)絡(luò)CNN的關(guān)鍵組件有:卷積層(ConvolutionalLayer):卷積層是CNN的核心組件之一,它通過卷積運(yùn)算對輸入數(shù)據(jù)進(jìn)行特征提取。卷積運(yùn)算是一種數(shù)學(xué)運(yùn)算,通過在輸入數(shù)據(jù)上滑動(dòng)一個(gè)卷積核(也稱為濾波器),并計(jì)算卷積核與輸入數(shù)據(jù)的局部區(qū)域的點(diǎn)積,從而生成新的特征圖。池化層(PoolingLayer):池化層用于降低特征圖的維度,從而減少計(jì)算量。常見的池化操作有最大池化(MaxPooling)和平均池化(AveragePooling)。全連接層(FullyConnectedLayer,FC):全連接層是傳統(tǒng)神經(jīng)網(wǎng)絡(luò)中的標(biāo)準(zhǔn)層,它將卷積層和池化層提取的特征進(jìn)行整合,并通過激活函數(shù)進(jìn)行非線性變換。輸出層:將全連接層得到的一維向量經(jīng)過計(jì)算后得到識別值的一個(gè)概率。2.3

任務(wù)實(shí)施步驟3:創(chuàng)建ImageNet模型。net=ImageNet()net按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟3:創(chuàng)建ImageNet模型。net=ImageNet()net按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施2.3.4模型訓(xùn)練步驟1:定義2級標(biāo)題。##<fontcolor="black">模型訓(xùn)練</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟2:使用交叉熵?fù)p失函數(shù)評價(jià)預(yù)測值和真實(shí)值之間的差距。loss_fn=nn.CrossEntropyLoss()2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,檢查輸出無異常。步驟3:使用Adam優(yōu)化器更新參數(shù)。optimizer=torch.optim.Adam(net.parameters(),lr=1e-3)按“SHIFT+Enter”,檢查輸出無異常。2.3

任務(wù)實(shí)施步驟4:定義函數(shù)封裝訓(xùn)練1代過程。deftrain(dataloader,model,loss_fn,optimizer):'''使用一次數(shù)據(jù)集訓(xùn)練模型'''size=len(dataloader.dataset)train_loss=0train_acc=0model.train()forbatch,(X,y)inenumerate(dataloader):#做一次正向傳播和反向傳播2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施pred=model(X)#正向傳播y=y.squeeze()#去除維數(shù)為1的的維度

loss=loss_fn(pred,y)#計(jì)算損失

loss.backward()#反向傳播,計(jì)算梯度

optimizer.step()#根據(jù)當(dāng)前參數(shù)值和梯度更新參數(shù)值

optimizer.zero_grad()#梯度置零

#記錄誤差

train_loss=loss.item()2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施

#計(jì)算分類的準(zhǔn)確率out_t=pred.argmax(dim=1)#取輸出向量元素最大值的索引num_correct=(out_t==y).sum().item()

train_acc+=num_correct/len(X)

ifbatch%5==0:

current=(batch+1)*len(X)

print(f"損失:{train_loss/len(X):>7f}[{current:>5d}/{size:>5d}]")print(f"準(zhǔn)確率:{train_acc/len(dataloader):>7f}")returnmodel2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟5:迭代在數(shù)據(jù)集上訓(xùn)練,更新模型參數(shù)。epochs=20fortinrange(epochs):print(f"Epoch{t+1}\n-----------")model=train(train_dataloader,net,loss_fn,optimizer)2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,運(yùn)行結(jié)果如下:1.3

任務(wù)實(shí)施1.多層感知機(jī)預(yù)測糖尿病…步驟6:保存模型參數(shù)到硬盤,包括權(quán)重和偏置。torch.save(model.state_dict(),'net_params.pth')按“SHIFT+Enter”,當(dāng)前目錄看到文件”net_params.pth”。2.3

任務(wù)實(shí)施時(shí)間戳識別是在單獨(dú)程序運(yùn)行,需要重新導(dǎo)入依賴庫,加載模型到內(nèi)存。2.3.5時(shí)間戳識別步驟1:定義2級標(biāo)題。##<fontcolor="black">依賴庫導(dǎo)入</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟2:導(dǎo)入依賴庫。importtorchfromtorchimportnnimportnumpyasnpfromPILimportImagefrommatplotlibimportpyplotasplt2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,檢查輸出無異常。2.3

任務(wù)實(shí)施步驟3:定義2級標(biāo)題。##<fontcolor=“black”>模型加載</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟4:定義ImageNet模型。classImageNet(nn.Module):

def__init__(self):

super(ImageNet,self).__init__() self.conv1=nn.Conv2d(in_channels=1,out_channels=32,kernel_size=3,padding=1) self.relu1=nn.ReLU()

self.pool1=nn.MaxPool2d(kernel_size=2,stride=2)

self.conv2=nn.Conv2d(in_channels=32,out_channels=64,kernel_size=3,padding=1) self.relu2=nn.ReLU() self.pool2=nn.MaxPool2d(kernel_size=2,stride=2)2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施

self.conv3=nn.Conv2d(in_channels=64,out_channels=128,kernel_size=3,padding=1)self.relu3=nn.ReLU()self.pool3=nn.MaxPool2d(kernel_size=2,stride=2)self.flatten=nn.Flatten()self.fc1=nn.Linear(4096,512)self.relu4=nn.ReLU()

self.fc2=nn.Linear(512,10)

self.softmax=nn.Softmax(dim=-1)#對最后1列執(zhí)行Softmax操作2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施defforward(self,x): x=self.conv1(x) x=self.relu1(x) x=self.pool1(x)

x=self.conv2(x)

x=self.relu2(x)

x=self.pool2(x) x=self.conv3(x) x=self.relu3(x)

2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施

x=self.pool3(x)

x=self.flatten(x)

x=self.fc1(x)

x=self.relu4(x)

x=self.fc2(x)

x=self.softmax(x)

returnx2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,檢查輸出無異常。2.3

任務(wù)實(shí)施步驟5:創(chuàng)建網(wǎng)絡(luò)模型,此時(shí)參數(shù)是隨機(jī)的。model=ImageNet()2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,檢查輸出無異常。步驟6:把文件保存的模型狀態(tài)加載到模型,模型參數(shù)恢復(fù)到訓(xùn)練狀態(tài)。state_dict=torch.load('net_params.pth')model.load_state_dict(state_dict)按“SHIFT+Enter”,檢查輸出無異常。2.3

任務(wù)實(shí)施步驟7:定義2級標(biāo)題。##<fontcolor=“black”>時(shí)間戳識別</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳步驟8:查看原圖的灰色模式。ori_pix=Image.open("../data/image/sample/frame_det_00_000001.jpg").convert("L")plt.imshow(ori_pix)2.3

任務(wù)實(shí)施按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.CNN識別圖像時(shí)間戳2.3

任務(wù)實(shí)施步驟9:讀取視頻圖片的數(shù)字區(qū)域。ori_pix=np.array(ori_pix)test=[]parts=np.loadtxt("../data/timestamp.txt",delimiter=',',dtype=int)forpartinparts:

img_part=ori_pix[part[0]:part[1],part[2]:part[3]]img_part=img_part/255

test.append(img_part)2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,檢查輸出無異常。2.3

任務(wù)實(shí)施步驟10:轉(zhuǎn)換圖片到模型輸入格式。test=np.array(test).reshape(14,1,64,32)2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,檢查輸出無異常。步驟11:模型輸出one-shot格式的時(shí)間。pred=model(torch.tensor(test).float())pred.shape按“SHIFT+Enter”,運(yùn)行結(jié)果如下:2.3

任務(wù)實(shí)施步驟12:識別圖像包含的年/月/日/時(shí)/分/秒。test=np.array(test).reshape(14,1,64,32)2.CNN識別圖像時(shí)間戳按“SHIFT+Enter”,運(yùn)行結(jié)果如下:從識別結(jié)果看出,CNN模型完全可以識別時(shí)間戳中的數(shù)字。國際旅行旅客人數(shù)數(shù)據(jù)集記錄12年的每月國際航班旅客客流量。數(shù)據(jù)從1949年到1960年共12年,每年12個(gè)月的數(shù)據(jù),一共144個(gè)記錄。要求從過去的客流量預(yù)測未來的客流量。3.1任務(wù)描述3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量基于international-airline-passengers.csv,建立和訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型,并可視化模型在訓(xùn)練集和測試集上的性能。任務(wù)目標(biāo)3.2

任務(wù)分解import方式引入依賴的模塊文件讀入DataFrame,檢查機(jī)場的國際旅客客流量發(fā)展態(tài)勢數(shù)據(jù)轉(zhuǎn)換到[0,1],封裝成PyTorch庫的DataLoader對象依賴庫導(dǎo)入數(shù)據(jù)觀察數(shù)據(jù)轉(zhuǎn)換觀察客流量變化態(tài)勢,經(jīng)過數(shù)據(jù)轉(zhuǎn)換后分離數(shù)據(jù)集,訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集封裝為DataLoader,構(gòu)建LSTM循環(huán)神經(jīng)網(wǎng)絡(luò)模型,在訓(xùn)練數(shù)據(jù)集上多次訓(xùn)練,并可視化模型性能。3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.2

任務(wù)分解定義一個(gè)包含1個(gè)LSTM層和1個(gè)輸出層的循環(huán)神經(jīng)網(wǎng)絡(luò)采用反向傳播方式,更新各層的梯度值,找到模型的最優(yōu)或次優(yōu)參數(shù)模型構(gòu)建模型訓(xùn)練接上可視化觀察模型性能訓(xùn)練過程可視化3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.3

任務(wù)實(shí)施3.3.1依賴庫導(dǎo)入步驟1:定義2級標(biāo)題。##<fontcolor="black">依賴庫導(dǎo)入</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:步驟2:導(dǎo)入依賴庫。importmatplotlibasmplimportmatplotlib.pyplotasplt3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量1.3

任務(wù)實(shí)施importnumpyasnpimportpandasaspdimporttorchimporttorch.nnasnnimporttorch.optimasoptimimporttorch.utils.dataasdatafromsklearn.preprocessingimportMinMaxScaler接上按“SHIFT+Enter”,檢查輸出無異常。3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.3

任務(wù)實(shí)施3.3.2數(shù)據(jù)探查步驟1:定義2級標(biāo)題。##<fontcolor="black">數(shù)據(jù)探查</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.3

任務(wù)實(shí)施步驟2:從文件讀入數(shù)據(jù)到DataFrame對象。'''usecols=[1]:選擇第1列skipfooter=3:忽略文件最后三行engine="python":避免警告提示'''data_csv=pd.read_csv("../data/international-airline-passengers.csv",usecols=[1],skipfooter=3,engine="python")data_csv.shape按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.3

任務(wù)實(shí)施步驟3:查看最后5條記錄,確認(rèn)skipfooter=3是否生效。data_csv.tail()按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.3

任務(wù)實(shí)施3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量步驟4:設(shè)置Matplotlib正常顯示中文字體和減號。mpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=False按“SHIFT+Enter”,檢查輸出無異常。步驟5:可視化機(jī)場國際旅客客流量變化態(tài)勢。plt.plot(data_csv)plt.ylabel("旅客數(shù)量/月")3.3

任務(wù)實(shí)施按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量客流量每3~4個(gè)月一個(gè)周期,整體趨勢向上。3.3

任務(wù)實(shí)施3.3.3數(shù)據(jù)轉(zhuǎn)換步驟1:定義2級標(biāo)題。##<fontcolor="black">數(shù)據(jù)轉(zhuǎn)換</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.3

任務(wù)實(shí)施步驟2:整型數(shù)轉(zhuǎn)換到float類型。timeseries=data_csv.values.astype('float32')3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量按“SHIFT+Enter”,檢查輸出無異常。步驟3:特征值轉(zhuǎn)換到[0,1]區(qū)間。scaler=MinMaxScaler()timeseries=scaler.fit_transform(timeseries)min(timeseries),max(timeseries)3.3

任務(wù)實(shí)施步驟4:切分為訓(xùn)練集和測試集,測試集占1/3。train_size=int(len(timeseries)*0.67)test_size=len(timeseries)-train_sizetrain,test=timeseries[:train_size],timeseries[train_size:]3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量按“SHIFT+Enter”,檢查輸出無異常。3.3

任務(wù)實(shí)施3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量defcreate_dataset(dataset,lookback):"""轉(zhuǎn)換時(shí)間序列到數(shù)據(jù)集

Args:dataset:時(shí)間序列,第1維是時(shí)間步lookback:窗口大小"""

X,y=[],[]

foriinrange(len(dataset)-lookback):

feature=dataset[i:i+lookback]步驟5:定義函數(shù)封裝數(shù)據(jù)到PyTorch的Tensor對象。3.3

任務(wù)實(shí)施3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量target=dataset[i+1:i+lookback+1]

X.append(feature)

y.append(target)

returntorch.tensor(np.array(X)),torch.tensor(np.array(y))接上步驟6:構(gòu)造特征和標(biāo)簽。lookback=1X_train,y_train=create_dataset(train,lookback=lookback)X_test,y_test=create_dataset(test,lookback=lookback)3.3

任務(wù)實(shí)施步驟7:使用DataLoader封裝數(shù)據(jù)。loader=data.DataLoader(data.TensorDataset(X_train,y_train),shuffle=True,batch_size=8)3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量按“SHIFT+Enter”,檢查輸出無異常。按“SHIFT+Enter”,檢查輸出無異常。在PC上運(yùn)行程序時(shí),batch_size不宜太大,避免由于內(nèi)存不足造成系統(tǒng)崩潰。3.3

任務(wù)實(shí)施3.3.4模型構(gòu)建步驟1:定義2級標(biāo)題。##<fontcolor="black">模型構(gòu)建</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.3

任務(wù)實(shí)施步驟2:AirModel類定義使用LSTM層的循環(huán)神經(jīng)網(wǎng)絡(luò),輸出層輸出客流量。classAirModel(nn.Module):

def__init__(self):

super().__init__()

self.lstm=nn.LSTM(input_size=1,hidden_size=50,num_layers=1,batch_first=True)

self.linear=nn.Linear(50,1)

3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量3.3

任務(wù)實(shí)施3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量

defforward(self,x):x,_=self.lstm(x)x=self.linear(x)returnx接上長短期記憶神經(jīng)網(wǎng)絡(luò)長短期記憶神經(jīng)網(wǎng)絡(luò)(LongShort-TermMemory,LSTM)是一種特殊的循環(huán)神經(jīng)網(wǎng)絡(luò)(RecurrentNeuralNetwork,RNN)。LSTM通過輸入門、遺忘門、輸出門引入sigmoid函數(shù)并結(jié)合tanh函數(shù),添加求和操作,減少梯度消失和梯度爆炸的可能性。LSTM既能夠處理短期依賴問題,又能夠處理長期依賴問題。LSTM結(jié)構(gòu)如下圖:長短期記憶神經(jīng)網(wǎng)絡(luò)PyTorch庫的LSTM類提供了算法接口,定義如下:classtorch.nn.LSTM(input_size,hidden_size,num_layers=1,batch_first=False,**kargs)參數(shù)input_size:輸入特征維數(shù)。hidden_size:隱藏狀態(tài)的維數(shù)。num_layers:RNN的個(gè)數(shù)。batch_first:是否輸入輸出的第一維為batch_size。LSTM結(jié)構(gòu)比RNN更加靈活,能夠更好地處理長時(shí)間依賴性問題,但同時(shí)它也帶來了更復(fù)雜的結(jié)構(gòu)和更多的參數(shù)需要訓(xùn)練,這可能帶來較大的計(jì)算代價(jià),另外,LSTM也不能解決所有問題,在一些場景下RNN仍然是個(gè)不錯(cuò)的選擇。在選擇使用LSTM還是RNN時(shí),需要根據(jù)具體的應(yīng)用場景和問題來權(quán)衡選擇。3.3

任務(wù)實(shí)施步驟3:基于AirModel類創(chuàng)建模型。model=AirModel()model3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.3

任務(wù)實(shí)施3.3.5模型訓(xùn)練步驟1:定義2級標(biāo)題。##<fontcolor="black">模型訓(xùn)練</font>按“SHIFT+Enter”,運(yùn)行結(jié)果如下:3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量步驟2:使用Adam優(yōu)化器更新參數(shù)。optimizer=optim.Adam(model.parameters())按“SHIFT+Enter”,檢查輸出無異常。3.3

任務(wù)實(shí)施步驟3:使用MSE評價(jià)預(yù)測值和真實(shí)值之間的差距。loss_fn=nn.MSELoss()3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量按“SHIFT+Enter”,檢查輸出無異常。步驟4:訓(xùn)練模型并打印損失。n_epochs=2000forepochinrange(n_epochs):

model.train()#設(shè)置模型在訓(xùn)練狀態(tài),計(jì)算梯度3.3

任務(wù)實(shí)施3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量forX_batch,y_batchinloader:

y_pred=model(X_batch)#正向傳播

loss=loss_fn(y_pred,y_batch)#計(jì)算損失

loss.backward()#反向傳播,計(jì)算梯度

optimizer.step()#根據(jù)當(dāng)前參數(shù)值和梯度更新參數(shù)值

optimizer.zero_grad()#梯度置零

#驗(yàn)證模型ifepoch%100!=0:continue接上3.3

任務(wù)實(shí)施3.循環(huán)神經(jīng)網(wǎng)絡(luò)預(yù)測國際旅行客流量model.eval()

withtorch.no_grad():#設(shè)置模型在訓(xùn)練狀態(tài),不計(jì)算梯度

y_pred=model(X_train)

train_rmse=

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論