版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第10章深度學(xué)習(xí)目錄contents人工神經(jīng)網(wǎng)絡(luò)實(shí)例:詩歌生成器實(shí)例:識(shí)別驗(yàn)證碼的OCR模型深度學(xué)習(xí)2012年,基于卷積神經(jīng)網(wǎng)絡(luò)的AlexNet在ImageNet大規(guī)模視覺識(shí)別挑戰(zhàn)賽中以錯(cuò)誤率低于第二名10.8%的壓倒性成績奪得了當(dāng)年挑戰(zhàn)賽的第一名,該模型的作者在論文中提出了“模型的深度對于提高性能至關(guān)重要”的論述。自此,深度學(xué)習(xí)逐漸成為人工智能研究與應(yīng)用中一個(gè)關(guān)鍵的領(lǐng)域,并已成為當(dāng)下計(jì)算機(jī)視覺、自然語言處理、機(jī)器翻譯等應(yīng)用實(shí)際上的解決方案。深度學(xué)習(xí)是機(jī)器學(xué)習(xí)的一個(gè)子集,其指代基于深層次的人工神經(jīng)網(wǎng)絡(luò)的算法。人工神經(jīng)網(wǎng)絡(luò)通常由輸入層、輸出層和多個(gè)隱藏層構(gòu)成,隨著隱藏層數(shù)的增加,模型參數(shù)對特征的學(xué)習(xí)能力具有深度性。近年來深度學(xué)習(xí)的發(fā)展不僅基于硬件技術(shù)的更新迭代,更依賴于相關(guān)的框架與軟件的完善。目前主流的Python深度學(xué)習(xí)開發(fā)框架有百度提出的PaddlePaddle,谷歌提出的TensorFlow,臉書提出的Pytorch,亞馬遜提出的MXNet等,這些框架顯著提升了深度學(xué)習(xí)的開發(fā)效率。人工神經(jīng)網(wǎng)絡(luò)01深度學(xué)習(xí)簡述在傳統(tǒng)機(jī)器學(xué)習(xí)算法中,通常需要根據(jù)應(yīng)用場景和輸入數(shù)據(jù)的特點(diǎn),人為地設(shè)計(jì)特征本身,這類特征往往都具有具體的現(xiàn)實(shí)意義。但是,這種方法不僅需要精心的設(shè)計(jì),特征點(diǎn)對數(shù)據(jù)往往也有較大的依賴性。與之相比,深度學(xué)習(xí)是一種端到端的算法,即在輸入端到輸出端之間僅有人工神經(jīng)網(wǎng)絡(luò)模型,通過神經(jīng)網(wǎng)絡(luò)強(qiáng)大的學(xué)習(xí)能力在大數(shù)據(jù)中直接學(xué)習(xí)數(shù)據(jù)的樣本和模式。感知機(jī)人工神經(jīng)網(wǎng)絡(luò)的基礎(chǔ)組成部分是感知機(jī)。感知機(jī)由科學(xué)家FrankRosenblatt在1956年提出,是一種二分類的線性機(jī)器學(xué)習(xí)模型。感知機(jī)的基本結(jié)構(gòu)如圖所示,感知機(jī)將輸入數(shù)據(jù)與權(quán)重相乘,劃分為正負(fù)兩類的分離超平面,使用梯度下降法對誤差損失函數(shù)進(jìn)行極小化,從而實(shí)現(xiàn)數(shù)據(jù)模式的學(xué)習(xí)與識(shí)別。由于感知機(jī)模型假設(shè)了數(shù)據(jù)是線性可分,在面對線性不可分的數(shù)據(jù)時(shí),感知機(jī)永遠(yuǎn)都無法對樣本進(jìn)行完全正確分類。線性不可分?jǐn)?shù)據(jù)>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>fromsklearn.linear_modelimportPerceptron>>>fromsklearn.datasetsimportmake_moons>>>plt.rcParams['font.sans-serif']=['SimHei']>>>plt.rcParams['axes.unicode_minus']=False>>>np.random.seed(0)>>>X,y=make_moons(200,noise=0.20)>>>plt.scatter(X[:,0],X[:,1],s=40,c=y,cmap=plt.cm.bwr)>>>plt.show()感知機(jī)對非線性數(shù)據(jù)分割>>>clf=Perceptron(tol=1e-3,random_state=0)#感知機(jī)模型建立>>>clf.fit(X,y)#感知機(jī)模型訓(xùn)練>>>x_min,x_max=X[:,0].min()-.5,X[:,0].max()+.5>>>y_min,y_max=X[:,1].min()-.5,X[:,1].max()+.5>>>h=0.01>>>xx,yy=np.meshgrid(np.arange(x_min,x_max,h),np.arange(y_min,y_max,h))>>>Z=clf.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape)>>>plt.contourf(xx,yy,Z,cmap=plt.cm.bwr,alpha=0.3)>>>plt.scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.bwr)>>>plt.title("感知機(jī)分類")>>>plt.show()全連接神經(jīng)網(wǎng)絡(luò)感知機(jī)分類模型在面對線性不可分?jǐn)?shù)據(jù)時(shí),僅能盡最大可能將樣本劃分至線性超平面分割的空間。如使用單層的感知機(jī)無法解決經(jīng)典的異或問題(XOR)。為充分發(fā)揮感知機(jī)類模型的潛力,可將感知機(jī)的激活函數(shù)由符號(hào)函數(shù)sign()更改為非線性的激活函數(shù),并以此構(gòu)成基礎(chǔ)單位“神經(jīng)元”。通過這些神經(jīng)元的組合與堆疊,便能構(gòu)建起全連接神經(jīng)網(wǎng)絡(luò)。下圖展示了全連接神經(jīng)網(wǎng)絡(luò)的示例,該示例的網(wǎng)絡(luò)中輸入向量維度為3,包含3層隱藏層,每層隱藏層分別由4個(gè)、4個(gè)與2個(gè)神經(jīng)元組成,輸出向量維度為1。輸入數(shù)據(jù)首先通過網(wǎng)絡(luò)前饋傳播,經(jīng)過每個(gè)神經(jīng)元的權(quán)重和激活函數(shù),映射至輸出空間嗎,神經(jīng)元的連接權(quán)重便是神經(jīng)網(wǎng)絡(luò)需要從數(shù)據(jù)中學(xué)習(xí)的參數(shù)。這些參數(shù)通過對比預(yù)測值與真實(shí)值計(jì)算損失函數(shù)數(shù)值,由反向傳播算法計(jì)算梯度,對模型參數(shù)進(jìn)行更新?;赟cikit-learn的全連接神經(jīng)網(wǎng)絡(luò)>>>fromsklearn.neural_networkimportMLPClassifier>>>nn1=MLPClassifier(activation='tanh',solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(3,),random_state=1)>>>nn1.fit(X,y)>>>nn2=MLPClassifier(activation='tanh',solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(3,3,3,),random_state=1)>>>nn2.fit(X,y)>>>nn3=MLPClassifier(activation='tanh',solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(10,10,10,),random_state=1)>>>nn3.fit(X,y)>>>nn4=MLPClassifier(activation='tanh',solver='lbfgs',alpha=1e-5,hidden_layer_sizes=(10,10,10,10,10,10,),random_state=1)>>>nn4.fit(X,y)>>>fig,ax=plt.subplots(2,2,figsize=(12,6))>>>ax[0,0].scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.bwr)>>>ax[0,0].contourf(xx,yy,nn1.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape),cmap=plt.cm.bwr,alpha=0.3)>>>ax[0,0].set_title('全連接神經(jīng)網(wǎng)絡(luò)(1層隱藏層,3個(gè)神經(jīng)元)')>>>ax[0,1].scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.bwr)>>>ax[0,1].contourf(xx,yy,nn2.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape),cmap=plt.cm.bwr,alpha=0.3)>>>ax[0,1].set_title("全連接神經(jīng)網(wǎng)絡(luò)(3層隱藏層,每層3個(gè)神經(jīng)元)")>>>ax[1,0].scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.bwr)>>>ax[1,0].contourf(xx,yy,nn3.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape),cmap=plt.cm.bwr,alpha=0.3)>>>ax[1,0].set_title("全連接神經(jīng)網(wǎng)絡(luò)(3層隱藏層,每層10個(gè)神經(jīng)元)")>>>ax[1,1].scatter(X[:,0],X[:,1],c=y,cmap=plt.cm.bwr)>>>ax[1,1].contourf(xx,yy,nn4.predict(np.c_[xx.ravel(),yy.ravel()]).reshape(xx.shape),cmap=plt.cm.bwr,alpha=0.3)>>>ax[1,1].set_title("全連接神經(jīng)網(wǎng)絡(luò)(6層隱藏層,每層10個(gè)神經(jīng)元)")>>>plt.show()常用的非線性激活函數(shù)>>>sigmoid=lambdax:1/(1+np.exp(-x))>>>tanh=lambdax:(np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))>>>relu=lambdax:np.maximum(0,x)>>>gelu=lambdax:x/(1+np.exp(-1.702*x))>>>swish=lambdax:x/(1+np.exp(-x))>>>softmax=lambdax:np.exp(x)/np.sum(np.exp(x))#可視化激活函數(shù)>>>x=np.arange(-5,5,0.1)>>>fig,ax=plt.subplots(2,3,figsize=(12,8))#Sigmoid激活函數(shù)>>>ax[0,0].plot(x,sigmoid(x))>>>ax[0,0].grid()>>>ax[0,0].set_title('Sigmoid')#Tanh激活函數(shù)>>>ax[0,1].plot(x,tanh(x))>>>ax[0,1].grid()>>>ax[0,1].set_title('Tanh')#ReLU激活函數(shù)>>>ax[0,2].plot(x,relu(x))>>>ax[0,2].grid()>>>ax[0,2].set_title('ReLU')#GeLU激活函數(shù)>>>ax[1,0].plot(x,gelu(x))>>>ax[1,0].grid()>>>ax[1,0].set_title('GeLU')#Swish激活函數(shù)>>>ax[1,1].plot(x,swish(x))>>>ax[1,1].grid()>>>ax[1,1].set_title('Swish')#Softmax激活函數(shù)>>>ax[1,2].plot(x,softmax(x))>>>ax[1,2].grid()>>>ax[1,2].set_title('Softmax')>>>plt.show()Python深度學(xué)習(xí)框架上一節(jié)中的基礎(chǔ)全連接神經(jīng)網(wǎng)絡(luò)是使用Scikit-learn搭建的,該框架作為一種通用的機(jī)器學(xué)習(xí)框架,實(shí)際上并不適合運(yùn)用在復(fù)雜的深度學(xué)習(xí)項(xiàng)目中。其中一個(gè)重要的原因是該框架沒有針對圖形處理器(GraphicsProcessingUnit,GPU)運(yùn)算的支持。在計(jì)算機(jī)中,中央處理器(CentralProcessingUnit,CPU)是核心處理單位,擁有強(qiáng)大的通用性來處理各種不同的數(shù)據(jù)類型,其擅長于處理復(fù)雜的分支運(yùn)算。與之相比,GPU則是由許多更小、更專業(yè)的內(nèi)核組成。強(qiáng)大的并行運(yùn)算能力,獨(dú)立的大吞吐量計(jì)算通道,較少的控制單元使GPU不會(huì)受到計(jì)算以外的更多任務(wù)的干擾。深度學(xué)習(xí)由于其復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),往往需要對成百上億的參數(shù)執(zhí)行諸如矩陣乘法等運(yùn)算,GPU強(qiáng)大的并行計(jì)算能力與獨(dú)立的存儲(chǔ)空間能顯著提升深度學(xué)習(xí)算法的訓(xùn)練與推理效率。諸如TensorFlow,Pytorch,PaddlePaddle,MXNet等Python中主流的深度學(xué)習(xí)框架目前均已支持使用GPU執(zhí)行運(yùn)算。本章將詳細(xì)介紹基于Tensorflow的深度學(xué)習(xí)模型搭建方法,該框架由于其易用性,強(qiáng)大的計(jì)算集群以及在終端部署的便利性已成為目前最流行的深度學(xué)習(xí)框架。事實(shí)上,各類深度學(xué)習(xí)框架都有其獨(dú)特的特點(diǎn)與適合的使用情景,在掌握其中一種框架后,用戶可以通過官方文檔快速上手其他框架。Tensorflow實(shí)例本節(jié)通過對貓狗圖像數(shù)據(jù)集的分類案例講解深度學(xué)習(xí)模型建立的流程和TensorFlow框架的使用。需要注意的是,TensorFlow2相比較TensorFlow1已進(jìn)行了較大的升級(jí)與改進(jìn),其可通過pip或者conda直接安裝,在安裝時(shí)亦無需如之前的版本指定CPU或GPU版本。TensorFlow2在使用時(shí)將根據(jù)系統(tǒng)情況自動(dòng)調(diào)用GPU功能。在構(gòu)建模型前,首先使用下列代碼導(dǎo)入相關(guān)模塊,這里使用了tensorflow.keras的API。該API對Tensoflow的底層運(yùn)算單元進(jìn)行了封裝,使用戶可以通過數(shù)行代碼就完整地構(gòu)建出工作模型。其中的layers包含了諸如全連接、卷積、循環(huán)等神經(jīng)網(wǎng)絡(luò)層的實(shí)現(xiàn);callbacks提供了訓(xùn)練中的各類回調(diào)函數(shù);models中的模塊用來建立深度學(xué)習(xí)模型;optimizer為模型訓(xùn)練使用的優(yōu)化器;preprocessing提供了快速讀取數(shù)據(jù)的方法;regularizers提供了防止模型過擬合的正則化方法。>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>fromtensorflow.kerasimportlayers>>>fromtensorflow.keras.callbacksimportModelCheckpoint,CSVLogger>>>fromtensorflow.keras.modelsimportModel>>>fromtensorflow.keras.optimizersimportAdam>>>fromtensorflow.keras.preprocessingimportimage_dataset_from_directory>>>fromtensorflow.keras.regularizersimportl2數(shù)據(jù)讀取該案例使用的數(shù)據(jù)集存儲(chǔ)在“PetImages”文件夾中,其中有以“Cat”和“Dog”命名的兩個(gè)子文件夾,文件夾中分別包含1000張狗的圖像和1000張貓的圖像。下列代碼定義了導(dǎo)入圖像的函數(shù),其接受數(shù)據(jù)文件夾路徑,批量大?。疵恳淮斡?xùn)練使用的樣本數(shù)目)和圖像尺寸作為輸入?yún)?shù),輸出為以8:2比例隨機(jī)劃分的訓(xùn)練集與驗(yàn)證集數(shù)據(jù)。>>>defcreate_dataset(data_path,batch_size,image_size):...train_dataset=image_dataset_from_directory(data_path,...validation_split=0.2,...subset="training",...seed=42,...image_size=image_size,...batch_size=batch_size)...val_dataset=image_dataset_from_directory(data_path,...validation_split=0.2,...subset="validation",...seed=42,...image_size=image_size,...batch_size=batch_size)...returntrain_dataset,val_dataset數(shù)據(jù)集內(nèi)容>>>train_dataset,val_dataset=create_dataset(‘PetImages’,32,(256,256))>>>plt.figure(figsize=(12,6))>>>forimages,labelsintrain_dataset.take(1):...foriinrange(8):...ax=plt.subplot(2,4,i+1)...plt.imshow(images[i].numpy().astype("uint8"))...plt.title('Dog'ifint(labels[i])==1else'Cat')...plt.axis("off")>>>plt.show()tensorflow.keras.layers中常用的神經(jīng)網(wǎng)絡(luò)層神經(jīng)網(wǎng)絡(luò)層類描述Input輸入層Dense全連接層Activation激活函數(shù)層Embedding嵌入層Masking掩碼層Lambda自定義層(將任意表達(dá)式包裝為Layer對象)Conv2D二維卷積層Conv2DTranspose轉(zhuǎn)置二維卷積層MaxPooling2D二維極大值池化層AveragePooling2D二維平均值池化層LSTM長短期記憶層GRU門控循環(huán)層BatchNormalization批量標(biāo)準(zhǔn)化層LayerNormalization層標(biāo)準(zhǔn)化層Attention點(diǎn)積注意力層Dropout隨機(jī)失活層Reshape形狀重塑層Flatten展平層Concatenate連接層Add想夾層函數(shù)式API構(gòu)建神經(jīng)網(wǎng)絡(luò)下列代碼根據(jù)函數(shù)式API構(gòu)建的方法,構(gòu)建由不同神經(jīng)網(wǎng)絡(luò)層組成的卷積塊的函數(shù)。該函數(shù)以輸入數(shù)據(jù)與卷積層卷積核數(shù)量為輸入?yún)?shù),輸入數(shù)據(jù)首先經(jīng)過尺寸為“3×3”,步長為1的卷積核構(gòu)成的卷積層,再經(jīng)批量標(biāo)準(zhǔn)池化層,以“ReLU”為激活函數(shù)的激活函數(shù)層,以及極大值池化層,以極大值池化層的輸出為函數(shù)的輸出數(shù)據(jù)。由于池化層的存在,當(dāng)輸入數(shù)據(jù)經(jīng)過此卷積塊后,其空間尺寸將會(huì)縮小為原尺寸的四分之一。>>>defConv_Block(x,num_filters):...x=layers.Conv2D(filters=num_filters,...kernel_size=3,...strides=1,...padding='same')(x)...x=layers.BatchNormalization()(x)...x=layers.Activation('relu')(x)...x=layers.MaxPooling2D((2,2))(x)...returnx函數(shù)式API構(gòu)建神經(jīng)網(wǎng)絡(luò)借助所創(chuàng)建的卷積塊函數(shù),便可以建立基礎(chǔ)的卷積神經(jīng)網(wǎng)絡(luò)。在輸入層,其接受輸入尺寸的數(shù)據(jù)。由于圖像數(shù)據(jù)每個(gè)像素點(diǎn)上為0至255之間的整數(shù),首先要對其進(jìn)行歸一化處理,映射至0至1的范圍內(nèi)。隨后數(shù)據(jù)經(jīng)過4個(gè)卷積塊,隨著空間尺寸的逐步縮小,卷積核的個(gè)數(shù)逐步增加,以保證學(xué)習(xí)能力。之后將特征圖數(shù)據(jù)經(jīng)過展平層,隨后經(jīng)由全連接層,以Sigmoid函數(shù)為激活函數(shù)對結(jié)果進(jìn)行輸出。在模型定義時(shí),由于已明確了從輸入到輸出一層層的層級(jí)關(guān)系,便可使用Model()方法確定輸入和輸出,框架便會(huì)自動(dòng)根據(jù)輸入輸出之間的層級(jí)搭建神經(jīng)網(wǎng)絡(luò)。>>>defcreate_CNN(inputs_hape):...inputs=layers.Input(inputs_hape)...x=layers.experimental.preprocessing.Rescaling(1.0/255)(inputs)...x=Conv_Block(x,16)...x=Conv_Block(x,32)...x=Conv_Block(x,64)...x=Conv_Block(x,128)...x=layers.Flatten()(x)...output=layers.Dense(1,activation='sigmoid')(x)...returnModel(inputs,output)函數(shù)式API構(gòu)建神經(jīng)網(wǎng)絡(luò)借助所創(chuàng)建的卷積塊函數(shù),便可以建立基礎(chǔ)的卷積神經(jīng)網(wǎng)絡(luò)。在輸入層,其接受輸入尺寸的數(shù)據(jù)。由于圖像數(shù)據(jù)每個(gè)像素點(diǎn)上為0至255之間的整數(shù),首先要對其進(jìn)行歸一化處理,映射至0至1的范圍內(nèi)。隨后數(shù)據(jù)經(jīng)過4個(gè)卷積塊,隨著空間尺寸的逐步縮小,卷積核的個(gè)數(shù)逐步增加,以保證學(xué)習(xí)能力。之后將特征圖數(shù)據(jù)經(jīng)過展平層,隨后經(jīng)由全連接層,以Sigmoid函數(shù)為激活函數(shù)對結(jié)果進(jìn)行輸出。在模型定義時(shí),由于已明確了從輸入到輸出一層層的層級(jí)關(guān)系,便可使用Model()方法確定輸入和輸出,框架便會(huì)自動(dòng)根據(jù)輸入輸出之間的層級(jí)搭建神經(jīng)網(wǎng)絡(luò)。>>>defcreate_CNN(inputs_hape):...inputs=layers.Input(inputs_hape)...x=layers.experimental.preprocessing.Rescaling(1.0/255)(inputs)...x=Conv_Block(x,16)...x=Conv_Block(x,32)...x=Conv_Block(x,64)...x=Conv_Block(x,128)...x=layers.Flatten()(x)...output=layers.Dense(1,activation='sigmoid')(x)...returnModel(inputs,output)函數(shù)式API構(gòu)建神經(jīng)網(wǎng)絡(luò)接下來根據(jù)輸入圖像的尺寸,建立卷積神經(jīng)網(wǎng)絡(luò),并對構(gòu)建的模型使用.summary()方法觀察神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu)。>>>model=create_CNN((256,256,3))>>>model.summary()Model:"model"_________________________________________________________________Layer(type)OutputShapeParam#=================================================================input_1(InputLayer)[(None,256,256,3)]0rescaling(Rescaling)(None,256,256,3)0conv2d(Conv2D)(None,256,256,16)448batch_normalization(BatchN(None,256,256,16)64ormalization)activation(Activation)(None,256,256,16)0max_pooling2d(MaxPooling2D(None,128,128,16)0)conv2d_1(Conv2D)(None,128,128,32)4640batch_normalization_1(Batc(None,128,128,32)128hNormalization)activation_1(Activation)(None,128,128,32)0max_pooling2d_1(MaxPooling(None,64,64,32)02D)conv2d_2(Conv2D)(None,64,64,64)18496batch_normalization_2(Batc(None,64,64,64)256hNormalization)activation_2(Activation)(None,64,64,64)0max_pooling2d_2(MaxPooling(None,32,32,64)02D)conv2d_3(Conv2D)(None,32,32,128)73856batch_normalization_3(Batc(None,32,32,128)512hNormalization)activation_3(Activation)(None,32,32,128)0max_pooling2d_3(MaxPooling(None,16,16,128)02D)flatten(Flatten)(None,32768)0dense(Dense)(None,1)32769=================================================================Totalparams:131,169Trainableparams:130,689Non-trainableparams:480_________________________________________________________________tf.keras.utils.plot_model()繪制用于貓狗圖像識(shí)別卷積神經(jīng)網(wǎng)絡(luò)中的前7層>>>tf.keras.utils.plot_model(model,to_file='Dog_Cat_CNN.png',show_shapes=True,layer_range=['input_1','conv2d_1'],dpi=300)tensorflow.keras.losses中常用的損失函數(shù)損失函數(shù)名稱描述binary_crossentropy二分類問題的交叉熵?fù)p失categorical_crossentropy多分類問題的交叉熵?fù)p失kl_divergence預(yù)測值與真實(shí)值之間的Kullback-Leibler散度mean_squared_error預(yù)測值與真實(shí)值的誤差平方的平均值mean_absolute_error預(yù)測值與真實(shí)值的誤差絕對值的平均值cosine_similarity預(yù)測值與真實(shí)值的余弦相似度log_cosh預(yù)測誤差的雙曲余弦的對數(shù)hinge預(yù)測值與真實(shí)值之間的Hinge損失squared_hinge預(yù)測值與真實(shí)值之間的平方Hinge損失
categorical_hinge預(yù)測值與真實(shí)值之間的分類Hinge損失
模型訓(xùn)練在本案例中,模型的任務(wù)是根據(jù)輸入圖片判斷其中的動(dòng)物屬于貓還是狗,是典型的二分類問題,故采取二值交叉熵binary_crossentropy作為模型的損失函數(shù)。在優(yōu)化器方面,使用自適應(yīng)矩估計(jì)Adam優(yōu)化器,其相比隨機(jī)梯度下降算法可以根據(jù)一階動(dòng)量和二階動(dòng)量的信息自適應(yīng)調(diào)整學(xué)習(xí)率。在回調(diào)函數(shù)中保存訓(xùn)練時(shí)模型的權(quán)重并記錄損失函數(shù)和模型精度的變化,對模型進(jìn)行60個(gè)回合(epoch)的訓(xùn)練。每個(gè)回合神經(jīng)網(wǎng)絡(luò)將完整地對所有訓(xùn)練數(shù)據(jù)進(jìn)行一次前饋傳播預(yù)測和反向傳播學(xué)習(xí)。#模型編譯>>>pile(loss='binary_crossentropy',...optimizer=Adam(1e-4),...metrics='accuracy')#保存訓(xùn)練過程中的權(quán)重>>>checkpoint=ModelCheckpoint('./logs/save_at_{epoch}_{val_loss}.h5',...monitor='val_loss',...save_weights_only=True,...save_best_only=True)#保存訓(xùn)練過程中指標(biāo)的變化>>>csvlogger=CSVLogger('./logs/log.csv')#訓(xùn)練模型>>>model.fit(train_dataset,...epochs=60,...callbacks=[checkpoint,csvlogger],...validation_data=val_dataset)每回合訓(xùn)練集與驗(yàn)證集的準(zhǔn)確率>>>plt.rcParams['font.sans-serif']=['SimHei']>>>plt.rcParams['axes.unicode_minus']=False#讀取記錄文件>>>x=np.loadtxt('./logs/log.csv',delimiter=",",skiprows=1)#可視化準(zhǔn)確率>>>plt.figure(figsize=(8,4))>>>plt.plot(x[:,0],x[:,1],'b-',label='訓(xùn)練集準(zhǔn)確率')>>>plt.plot(x[:,0],x[:,3],'r-.',label='驗(yàn)證集準(zhǔn)確率')>>>plt.grid()>>>plt.title('每回合訓(xùn)練集與驗(yàn)證集準(zhǔn)確率')>>>plt.legend()>>>plt.show()卷積神經(jīng)網(wǎng)絡(luò)結(jié)果驗(yàn)證>>>plt.figure(figsize=(12,6))>>>forimages,_inval_dataset.take(1):...foriinrange(4):...ax=plt.subplot(1,4,i+1)...plt.imshow(images[i].numpy().astype("uint8"))...score=model.predict(tf.expand_dims(images[i],0))[0]...plt.title('為狗的概率:%.2f%%\n為貓的概率:%.2f%%'%(100*score,100*(1-score)))...plt.axis("off")>>>plt.show()實(shí)例:詩歌生成器02自然語言處理自然語言處理是深度學(xué)習(xí)中一項(xiàng)重要的人工智能應(yīng)用,其核心任務(wù)包括了自然語言理解與自然語言生成。自然語言處理技術(shù)被廣泛應(yīng)用于對話問答系統(tǒng),語音識(shí)別,機(jī)器翻譯,情感分析等領(lǐng)域中。如聊天機(jī)器人chatGPT便是一種典型的深度學(xué)習(xí)技術(shù)驅(qū)動(dòng)的自然語言處理工具。在本節(jié)中,將通過構(gòu)建一種能夠自動(dòng)生成詩歌的深度學(xué)習(xí)模型介紹深度學(xué)習(xí)在自然語言生成中的應(yīng)用。導(dǎo)入和設(shè)置在本節(jié)中將運(yùn)用到以下的第三方庫和模塊,首先進(jìn)行導(dǎo)入工作同時(shí),本節(jié)的可視化分析涉及到中文的使用,需要進(jìn)行如下設(shè)置>>>importnumpyasnp>>>importmatplotlib.pyplotasplt>>>importtensorflowastf>>>fromtensorflow.keras.callbacksimportModelCheckpoint,TensorBoard,CSVLogger>>>fromtensorflow.keras.layersimportInput,LSTM,Dense,Dropout>>>fromtensorflow.keras.modelsimportModel>>>fromtensorflow.keras.optimizersimportAdam>>>plt.rcParams['font.family']='SimHei'>>>plt.rcParams['axes.unicode_minus']=False詩歌數(shù)據(jù)準(zhǔn)備與預(yù)處理本案例中使用到的數(shù)據(jù)保存在“poem.txt”文件中,文件的編碼格式為UTF-8,在文件中每首詩為一行,使用以下代碼對文件數(shù)據(jù)集進(jìn)行查看:>>>poems=[poemforpoeminopen('poem.txt',encoding='utf-8')]>>>print("數(shù)據(jù)集包含{}首詩,前五首詩為:\n1.{}2.{}3.{}4.{}5.{}".format(len(poems),poems[0],poems[1],poems[2],poems[3],poems[4]))數(shù)據(jù)集包含43030首詩,前五首詩為:
1.首春:寒隨窮律變,春逐鳥聲開。初風(fēng)飄帶柳,晚雪間花梅。碧林青舊竹,綠沼翠新苔。芝田初雁去,綺樹巧鶯來。
2.初晴落景:晚霞聊自怡,初晴彌可喜。日晃百花色,風(fēng)動(dòng)千林翠。池魚躍不同,園鳥聲還異。寄言博通者,知予物外志。
3.初夏:一朝春夏改,隔夜鳥花遷。陰陽深淺葉,曉夕重輕煙。哢鶯猶響殿,橫絲正網(wǎng)天。珮高蘭影接,綬細(xì)草紋連。碧鱗驚棹側(cè),玄燕舞檐前。何必汾陽處,始復(fù)有山泉。
4.度秋:夏律昨留灰,秋箭今移晷。峨嵋岫初出,洞庭波漸起。桂白發(fā)幽巖,菊黃開灞涘。運(yùn)流方可嘆,含毫屬微理。
5.儀鸞殿早秋:寒驚薊門葉,秋發(fā)小山枝。松陰背日轉(zhuǎn),竹影避風(fēng)移。提壺菊花岸,高興芙蓉池。欲知涼氣早,巢空燕不窺。one-hot編碼可以發(fā)現(xiàn),文件中包含了共43020首古詩,每首詩以“:”分割標(biāo)題和內(nèi)容,內(nèi)容以五言詩為主。深度學(xué)習(xí)模型通常要求以數(shù)字?jǐn)?shù)據(jù)作為輸入,如可以將圖像轉(zhuǎn)化為數(shù)字構(gòu)成的矩陣。對于文字?jǐn)?shù)據(jù),一種簡單且常用的方法為對文字進(jìn)行獨(dú)熱編碼(One-HotEncoding)處理。該方法首先計(jì)算數(shù)據(jù)集字庫中的字符種類N,將每個(gè)字符轉(zhuǎn)化為N維向量,該向量只容許該字符代表的位為數(shù)字1,其他位為數(shù)字0。如字典庫中若僅包含“你”、“我”、“他”三種字符,則其各自的獨(dú)熱編碼可以為:你=[100];我=[010];他=[001]。對文字進(jìn)行獨(dú)熱編碼有多種方式,本案例中首先統(tǒng)計(jì)數(shù)據(jù)集中的字符種類,對每種字符進(jìn)行排序,排序結(jié)果為其獨(dú)熱編碼中1的位置。下列代碼首先定義數(shù)據(jù)讀取和預(yù)處理函數(shù),由于整體數(shù)據(jù)集以五言詩為主,首先過濾不屬于五言詩的數(shù)據(jù),以及整首詩長度小于等于5個(gè)字符的異常數(shù)據(jù),對于剩余數(shù)據(jù),在每首詩的結(jié)尾增加結(jié)束符,代表一首詩歌的結(jié)束。隨后統(tǒng)計(jì)數(shù)據(jù)集中每種字符出現(xiàn)的次數(shù),以次數(shù)的排序設(shè)置為每個(gè)字符的編號(hào),作為獨(dú)熱編碼時(shí)的有效位信息。函數(shù)輸出將中文轉(zhuǎn)化為編號(hào)的數(shù)據(jù)集,以及每個(gè)字符與編號(hào)對應(yīng)的字典。文本數(shù)據(jù)讀取和預(yù)處理>>>defload_and_preprocess(poem_path,end_char):...poems=[line.strip().replace('','').split(':')[1]forlineinopen(poem_path,encoding='utf-8')]...poem_list=[]...#過濾異?;虿粚儆谖逖栽姷臄?shù)據(jù),在剩余數(shù)據(jù)結(jié)尾加上結(jié)束符號(hào)...forpoeminpoems:...iflen(poem)<=5:...continue...ifpoem[5]==",":...poem_list.append(poem+end_char)...#提取詩歌中所有的字符...character_list=[]...forpoeminpoem_list:...character_list+=[characterforcharacterinpoem]...#統(tǒng)計(jì)每種字符出現(xiàn)的頻率...charact_dst={}...forcharincharacter_list:...charact_dst[char]=charact_dst.get(char,0)+1...#依字符出現(xiàn)的頻率排序,為每個(gè)字符賦予ID...char_pairs=sorted(charact_dst.items(),key=lambdax:x[1],reverse=True)...chars,counts=zip(*char_pairs)...char2num_dict={char:numfornum,charinenumerate(chars)}...num2char_dict={num:charfornum,charinenumerate(chars)}...char2num_func=lambdachar:char2num_dict.get(char)...poem_item=np.array([list(map(char2num_func,poem))forpoeminpoem_list],dtype=object)...returnpoem_item,char2num_dict,num2char_dict文本數(shù)據(jù)讀取和預(yù)處理下列代碼首先確定數(shù)據(jù)集存放位置與結(jié)束符字符,使用定義好的load_and_preprocess函數(shù)對數(shù)據(jù)集進(jìn)行讀取和預(yù)處理。根據(jù)打印結(jié)果,可以發(fā)現(xiàn)在預(yù)處理之后,數(shù)據(jù)集中的詩歌共變?yōu)?4026首,字符種類為7056種。>>>poem_path='.\poetry.txt'>>>end_char='\n'>>>poem_item,char2num_dict,num2char_dict=load_and_preprocess(poem_path,end_char)>>>print('經(jīng)載入和轉(zhuǎn)換后,數(shù)據(jù)集中共有{}種類的字符,共{}首詩歌,其中:\n詩歌中出現(xiàn)頻率最高5個(gè)字符與數(shù)字的對應(yīng)關(guān)系為{}'.format(len(char2num_dict),len(poem_item),[iforiinchar2num_dict.items()][:5]))經(jīng)載入和轉(zhuǎn)換后,數(shù)據(jù)集中共有7056種類的字符,共24026首詩歌,其中:詩歌中出現(xiàn)頻率最高5個(gè)字符與數(shù)字的對應(yīng)關(guān)系為[(',',0),('。',1),('\n',2),('不',3),('人',4)]數(shù)據(jù)集劃分為可靠地評估模型性能與泛化能力,需要從數(shù)據(jù)集中提取出不被模型學(xué)習(xí)的驗(yàn)證集。下列代碼首先對數(shù)據(jù)集進(jìn)行順序打亂與切分,再以9:1的比例劃分訓(xùn)練集與驗(yàn)證集。>>>val_split=0.1>>>np.random.shuffle(poem_item) >>>num_val=int(len(poem_item)*val_split)>>>num_train=len(poem_item)-num_val制作時(shí)序數(shù)據(jù)為將數(shù)據(jù)輸入到神經(jīng)網(wǎng)絡(luò)中訓(xùn)練,需要構(gòu)造時(shí)序樣本數(shù)據(jù),即整個(gè)數(shù)據(jù)分成固定長度的序列作為輸入,對應(yīng)的輸出便是該序列的接下來的字符,直至在輸入數(shù)據(jù)中包含結(jié)束字符或輸出數(shù)據(jù)為結(jié)束字符。下列代碼定義了對輸入和輸出數(shù)據(jù)進(jìn)行對應(yīng)的函數(shù)。>>>definput_and_output(input_data,char2num_dict,end_char,unit_sentence):...inputs=[]...outputs=[]...forwordinrange(len(input_data)):...inputs_item=input_data[word:word+unit_sentence]...outputs_item=input_data[word+unit_sentence]...#如果是末尾就結(jié)束...if(char2num_dict[end_char]ininputs_item)oroutputs_item==char2num_dict[end_char]:...returnnp.array(inputs),np.array(outputs)...else:...inputs.append(inputs_item)...outputs.append(outputs_item)...returnnp.array(inputs),np.array(outputs)數(shù)據(jù)生成器隨后便可以設(shè)計(jì)為模型輸入數(shù)據(jù)的生成器,該生成器首先根據(jù)批量大小從數(shù)據(jù)集中提取數(shù)據(jù),隨后對數(shù)據(jù)進(jìn)行獨(dú)熱編碼處理。具體為首先根據(jù)批量大小、詩句長度和字符種類生成全為零的矩陣。隨后對每個(gè)批量中的每個(gè)輸入中的字符按位置編號(hào)為1。>>>defbatch_generator(input_data,char2num_dict,batch_size,end_char,unit_sentence):...char_size=len(char2num_dict)...len_input=len(input_data)...batch_index=0...whileTrue:...inputs_onehot=[]...outputs_onehot=[]...foriinrange(batch_size):...batch_index=(batch_index+1)%len_input...inputs,outputs=input_and_output(input_data[batch_index],char2num_dict,end_char,unit_sentence)...forjinrange(len(inputs)):...inputs_onehot.append(inputs[j])...outputs_onehot.append(outputs[j])...batch_size_oh=len(inputs_onehot)...inputs_data=np.zeros((batch_size_oh,unit_sentence,char_size),dtype=8)...outputs_data=np.zeros((batch_size_oh,char_size),dtype=8)...fori,(input_text,output_text)inenumerate(zip(inputs_onehot,outputs_onehot)):...#將輸入數(shù)據(jù)每個(gè)字符對應(yīng)的編號(hào)位置設(shè)置為1...fort,indexinenumerate(input_text):...inputs_data[i,t,index]=1...#將輸出數(shù)據(jù)每個(gè)字符對應(yīng)的編號(hào)位置設(shè)置為1...outputs_data[i,output_text]=1...yieldinputs_data,outputs_data循環(huán)神經(jīng)網(wǎng)絡(luò)對于文本、語音等序列類型的數(shù)據(jù),其前后輸入數(shù)據(jù)之間具有較強(qiáng)的聯(lián)系,為更好地處理序列的信息,深度學(xué)習(xí)中有一類稱為循環(huán)神經(jīng)網(wǎng)絡(luò)(RecurrentNeuralNetwork,RNN)的序列信息處理模型。如圖所示,與其他神經(jīng)網(wǎng)絡(luò)只能建立曾與層之間的權(quán)重連接相比,循環(huán)神經(jīng)網(wǎng)絡(luò)可以利用其同一層之間建立的權(quán)值連接處理任意時(shí)序的輸入序列,從而使得模型更好地學(xué)習(xí)到序列數(shù)據(jù)的前后關(guān)聯(lián)。長短期記憶網(wǎng)絡(luò)在本案例中,將采取基于循環(huán)神經(jīng)網(wǎng)絡(luò)的長短期記憶(LongShort-TermMemory,LSTM)網(wǎng)絡(luò)作為詩歌生成器模型。其內(nèi)部通過門控單元的設(shè)計(jì),可以使網(wǎng)絡(luò)在長距離依賴的序列上有更佳的表現(xiàn)。下列代碼為構(gòu)建網(wǎng)絡(luò)模型的函數(shù),其首先根據(jù)數(shù)據(jù)集中字符的種類數(shù)量確定輸入層的尺寸;隨后便通過一層包含256個(gè)神經(jīng)元的長短期記憶層,針對輸入數(shù)據(jù)采用默認(rèn)激活函數(shù)‘Tanh’,針對門控單元采用默認(rèn)激活函數(shù)‘Sigmoid’,本層將輸出完整的序列;下一層為隨機(jī)失活(Dropout)層,其通過在訓(xùn)練過程中隨機(jī)丟棄部分神經(jīng)元,避免在訓(xùn)練數(shù)據(jù)上產(chǎn)生復(fù)雜的相互適應(yīng),達(dá)到對抗過擬合的效果,這里設(shè)置失活率為60&;在這之后為包含128個(gè)神經(jīng)元的只輸出最后一項(xiàng)輸出的長短期記憶層和60%失活率的隨機(jī)失活層;最后一層通過全連接層,預(yù)測輸出的字符。>>>defcreate_LSTM(char2num_dict):...char_size=len(char2num_dict)...inputs=Input(shape=(None,char_size))...x=LSTM(256,return_sequences=True)(inputs)...x=Dropout(0.6)(x)...x=LSTM(128)(x)...x=Dropout(0.6)(x)...output=Dense(char_size,activation='softmax')(x)...returnModel(inputs,output)模型構(gòu)建>>>model=create_LSTM(char2num_dict)>>>model.summary()Model:"model"_________________________________________________________________Layer(type)OutputShapeParam#=================================================================input_1(InputLayer)[(None,None,7056)]0lstm(LSTM)(None,None,256)7488512dropout(Dropout)(None,None,256)0lstm_1(LSTM)(None,128)197120dropout_1(Dropout)(None,128)0dense(Dense)(None,7056)910224=================================================================Totalparams:8,595,856Trainableparams:8,595,856Non-trainableparams:0_________________________________________________________________模型可視化>>>tf.keras.utils.plot_model(model,to_file='LSTM_poem.png',show_shapes=True,dpi=300)模型編譯作為詩歌生成器,模型的任務(wù)是根據(jù)序列的輸入,預(yù)測下一個(gè)輸出字符。這實(shí)際上是一個(gè)分類問題,即預(yù)測輸出是所有的字符種類的類別中的哪一類。在神經(jīng)網(wǎng)絡(luò)最后一層經(jīng)過softmax激活函數(shù)獲得概率輸出后,可使用交叉熵?fù)p失函數(shù)將類別的預(yù)測概率輸出與真實(shí)類別的獨(dú)熱編碼形式進(jìn)行計(jì)算。下列代碼使用Adam優(yōu)化器,交叉熵?fù)p失函數(shù),準(zhǔn)確率指標(biāo)對模型進(jìn)行編譯。>>>pile(optimizer=Adam(),...loss='categorical_crossentropy',...metrics=['accuracy'])模型訓(xùn)練在完成模型的定義后,便可使用數(shù)據(jù)集訓(xùn)練模型。為保證代碼能在普通顯存終端上運(yùn)行,下列代碼設(shè)置批量大小為2,若擁有較大顯存的專業(yè)級(jí)顯卡,則可適當(dāng)提高批量大小的數(shù)值使訓(xùn)練更加穩(wěn)定。訓(xùn)練回合數(shù)設(shè)定為70個(gè),在訓(xùn)練時(shí)根據(jù)驗(yàn)證集準(zhǔn)確率保存模型權(quán)重,將每個(gè)回合訓(xùn)練集與驗(yàn)證集的準(zhǔn)確率和損失函數(shù)值保存至csv文件,并使用TensorBoard對訓(xùn)練過程進(jìn)行監(jiān)控。隨后,使用.fit_generator()的方法,以之前定義的生成器對模型開展訓(xùn)練。fit_geneartor()與之前使用的fit()的區(qū)別為后者一次性將所有數(shù)據(jù)加載至內(nèi)存之中而生成器每次僅加載批量大小的數(shù)據(jù)至內(nèi)存中,在面對數(shù)據(jù)數(shù)量遠(yuǎn)超過內(nèi)存大小的情況時(shí),應(yīng)使用生成器的方法。>>>batch_size=2>>>epochs=70>>>unit_sentence=6#訓(xùn)練過程中保存權(quán)重>>>checkpoint=ModelCheckpoint('./logs/{epoch:02d}-{val_loss:.4f}.h5',...monitor='val_loss',...save_weights_only=True,...save_best_only=True)#啟用TensorBoard>>>tbcallback=TensorBoard(log_dir='./logs')#將每個(gè)回合訓(xùn)練集與驗(yàn)證集的損失函數(shù)值與準(zhǔn)確率記錄在csv文件中>>>csvlogger=CSVLogger('./logs/log.csv')#使用構(gòu)建的生成器訓(xùn)練模型>>>model.fit_generator(batch_generator(poem_item,char2num_dict,batch_size,end_char,unit_sentence),steps_per_epoch=max(1,num_train//batch_size),validation_data=batch_generator(poem_item[:num_train],char2num_dict,batch_size,end_char,unit_sentence),validation_steps=max(1,num_val//batch_size),epochs=epochs,initial_epoch=0,allbacks=[checkpoint,tbcallback,csvlogger])每回合訓(xùn)練集和驗(yàn)證集的準(zhǔn)確率>>>x=np.loadtxt('./logs/log.csv',delimiter=",",skiprows=1)>>>plt.figure(figsize=(8,4))>>>plt.plot(x[:,0],x[:,1],'b-',label='訓(xùn)練集準(zhǔn)確率')>>>plt.plot(x[:,0],x[:,3],'r-.',label='驗(yàn)證集準(zhǔn)確率')>>>plt.title('每回合訓(xùn)練集合驗(yàn)證集的正確率')>>>plt.grid()>>>plt.legend()>>>plt.show()Tensorboard如前所述,在訓(xùn)練時(shí)的回調(diào)函數(shù)中定義了TensorBoard的使用,其是一款針對TensorFlow提供機(jī)器學(xué)習(xí)實(shí)驗(yàn)所需的可視化工具的工具包,其中一項(xiàng)重要的功能為跟蹤可視化損失和準(zhǔn)確率等指標(biāo)。在訓(xùn)練過程中或訓(xùn)練結(jié)束后,可以通過在命令行輸入如下代碼啟用Tensorboard,其中l(wèi)ogs為TensorBoard事件日志的存儲(chǔ)地址。之后命令行便會(huì)出現(xiàn)如下字符,6006是TensorBoard的默認(rèn)端口,該端口用來運(yùn)行一個(gè)TensorBoard的實(shí)例,在瀏覽器中輸入端口地址http://localhost:6006/即可觀察到顯示界面。tensorboard--logdirlogsServingTensorBoardonlocalhost;toexposetothenetwork,useaproxyorpass--bind_allTensorBoard2.6.0athttp://localhost:6006/(PressCTRL+Ctoquit)Tensorboard預(yù)測函數(shù)下列代碼定義了根據(jù)當(dāng)前模型進(jìn)行詩歌生成的預(yù)測函數(shù)。其首先在輸入數(shù)據(jù)中隨機(jī)抽取一首詩的包含6個(gè)字符的首句詩詞,將作為第一個(gè)序列輸入。隨后定義模型的預(yù)測函數(shù),其基于模型預(yù)測的獨(dú)熱編碼向量,取向量中的最大索引為預(yù)測的字符編號(hào)。循環(huán)調(diào)用預(yù)測函數(shù)便可進(jìn)行詩句的生成與輸出。>>>defpredict(model,input_data,char2num_dict,num2char_dict,unit_sentence):...char_size=len(char2num_dict)...#隨機(jī)取一首詩的首句,進(jìn)行預(yù)測...index=np.random.randint(0,len(input_data))...#保存詩句...sentence=input_data[index][:unit_sentence]...#預(yù)測函數(shù)...def_pred(text):...temp=text[-unit_sentence:]...x_pred=np.zeros((1,unit_sentence,char_size))...fort,indexinenumerate(temp):...x_pred[0,t,index]=1...#預(yù)測獨(dú)熱編碼向量...preds=model.predict(x_pred)[0]...return[np.argmax(preds)]...#調(diào)用函數(shù)生成詩句...foriinrange(24-unit_sentence):...pred=_pred(sentence)...sentence=np.append(sentence,pred)...#輸出...output=""...foriinrange(len(sentence)):...output=output+num2char_dict[sentence[i]]...print(output)預(yù)測結(jié)果以下選取在訓(xùn)練過程中,部分回合結(jié)束時(shí)模型的輸出數(shù)據(jù),可以發(fā)現(xiàn)僅經(jīng)過3回合,模型已學(xué)習(xí)到五言詩的格式,能夠?qū)?biāo)點(diǎn)符號(hào)與終止符進(jìn)行正確的輸出。隨著訓(xùn)練回合數(shù)的增加,詩歌生成器生成的詩句在文韻上逐漸接近真正的詩詞。此案例展示了深度學(xué)習(xí)的強(qiáng)大能力,只包含兩層長短期記憶的神經(jīng)網(wǎng)絡(luò)模型便可以在文本生成任務(wù)上達(dá)到亮眼的表現(xiàn)。Epoch3:我經(jīng)華原來,引飯重云封。揮手利金壁,犢門雙古陽。Epoch10:春至今朝燕,山東自海溪。何當(dāng)知修在,多作境中全。Epoch16:布石滿山庭,縱橫走氣和。角形連四眼,明月向三關(guān)。Epoch18:天河墮雙魴,知幾嵩陽北。病書尚高既,臥與令人親。Epoch20:翠柏苦猶食,莓松新樹香。晨搖落山樹,雨月空山龕。Epoch23:閑門橫古塘,白日應(yīng)潛侵。草色枝醒種,龍光錦沽分。Epoch26:五老回?zé)o計(jì),千金在意馳。水珠瀛讎白,柳發(fā)霜影紅。Epoch33:淚滴珠難盡,池低玉管清。座中俱在地,貨笠固相憐。Epoch35:文雅關(guān)西族,眸山祖蜀兵。萬年無履賞,萬載誰兵進(jìn)。Epoch44:葦蕭中辟戶,一榻半秋來。掃云塵入砥,問鼓變其期。Epoch48:花開草復(fù)秋,花點(diǎn)春愁楠。驅(qū)馬不有興,贈(zèng)君玉庭香。Epoch50:刻舟尋已化,經(jīng)至正先趨。自生鐘素荇,幽蔬靜上蒿。Epoch54:非惟消旱暑,賴此暢所娛。君子上騕褭,天除繞系飛。Epoch61:情態(tài)任天然,閑論一欲空。聞?dòng)舞孟嘁姡L(fēng)方皦時(shí)。Epoch65:近縣多過客,欲歸信園芻。白雪為南會(huì),乾坤共寄忘。Epoch70:南國佳人至,東天千里知。聽時(shí)生落合,延日氣濺銀。實(shí)例:識(shí)別驗(yàn)證碼的OCR模型03識(shí)別驗(yàn)證碼的OCR模型隨著網(wǎng)絡(luò)爬蟲手段的普及,一些網(wǎng)站為避免過度訪問,通常會(huì)設(shè)置基于圖像驗(yàn)證碼的反爬機(jī)制。該機(jī)制在用戶訪問網(wǎng)站數(shù)據(jù)時(shí)要求用戶輸入給定的圖像中的字符,而這些圖像中的文字往往會(huì)通過線條或扭曲手段分離,讓爬蟲或惡意程序難以識(shí)別。隨著深度學(xué)習(xí)技術(shù)在光學(xué)字符識(shí)別(OpticalCharacterRecognition,OCR)中的廣泛應(yīng)用,圖像驗(yàn)證碼的自動(dòng)識(shí)別技術(shù)得到了長足的驅(qū)動(dòng)。光學(xué)字符識(shí)別是計(jì)算機(jī)視覺中一項(xiàng)重要的領(lǐng)域,其指代通過對文本資料的圖像進(jìn)行分析、識(shí)別與處理,以獲取圖像中文字與版面
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 集體資產(chǎn)股權(quán)轉(zhuǎn)讓合同模板
- 寄遞合同模板
- 醫(yī)院贊助合同模板
- 裝修合同模板附清單
- 采伐山場安全生產(chǎn)合同
- 勞保服裝買賣合同模板
- 設(shè)備租賃合同模板樣本
- 車庫建造合同模板
- 二手商品車買賣合同模板
- 面館培訓(xùn)合同模板
- 腹腔鏡操作流程圖
- (完整)版職業(yè)病危害預(yù)評價(jià)導(dǎo)則
- CT維保服務(wù)投標(biāo)方案
- 治療藥物監(jiān)測與精準(zhǔn)用藥
- 高中音樂-保衛(wèi)黃河(鋼琴協(xié)奏曲《黃河》第四樂章)教學(xué)課件設(shè)計(jì)
- 附臟腑辨證各種歸納表格
- 初中道德與法治-《做人要自尊》教學(xué)課件設(shè)計(jì)
- 市政道路工程技術(shù)標(biāo)2
- 廣東省江門市輔警協(xié)警筆試筆試模擬考試(含答案)
- 教育系統(tǒng)公共工程項(xiàng)目建設(shè)管理內(nèi)控制度
- ?;沸孤?yīng)急處置手冊
評論
0/150
提交評論