在一次偶然的機(jī)會下,接觸到了指導(dǎo)老師所經(jīng)手的項目,開始了我的深度學(xué)習(xí)之旅。在此進(jìn)行一些學(xué)習(xí)上的記錄與心得:
1.安裝tensorflow庫
????對于深度學(xué)習(xí)而言,其必備庫自然為tensorflow,關(guān)于這個庫的安裝確實存在一些坑,該庫已經(jīng)更新到2.2.0版本及其以上。但如果你在網(wǎng)上直接檢索,你會發(fā)現(xiàn)其大多數(shù)的安裝貼均為1.8 1.9版本,而實際上隨著更新,官方已經(jīng)移除了這兩個版本,并且語法也有較大的改變。所以按照其上進(jìn)行安裝的時候,我的python也進(jìn)行了瘋狂報錯:主要分為下列兩個大問題:
? ? 1.DLL error 找不到相應(yīng)模塊
? ? 2.HDF5文件不匹配
? ? 關(guān)于第一個問題,我個人采取的解決方案是搭建虛擬python環(huán)境為3.6。 經(jīng)過查找相關(guān)資料發(fā)現(xiàn)python 3.5-3.8均可,然后在虛擬環(huán)境下進(jìn)行tensorflow安裝,隨后發(fā)現(xiàn)可能是太久沒用python,相關(guān)庫未進(jìn)行更新。隨即upgrade一下就能成功import tensorflow as tf
? ? 第二個問題就是在實際運行中,總會報錯HDF5不匹配? 仔細(xì)查看報錯原因是HDF5已經(jīng)到1.10.5而tensorflow 所使用的HDF5基于1.10.4。所以就會報不匹配的錯。解決方案也很簡單,卸載高版本重新安裝低版本即可。
2.使用tensorflow進(jìn)行搭建一個簡單的LSTM網(wǎng)絡(luò)
? ? 由于剛?cè)腴T接觸這個tensorflow庫,對其函數(shù)還不甚了解,在網(wǎng)上查找半天發(fā)現(xiàn)長代碼稍許難以理解。故選取了一個最簡單的LSTM進(jìn)行入手,其功能主要為鑒別整數(shù)與小數(shù),代碼如下:
from tensorflow.python.keras.layers.core import Dense, Dropout,Activation,Flatten
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.utils import np_utils
from tensorflow.python.keras.layers import LSTM
import tensorflow as tf
import numpy as np
def train():
? ? nyarray= [ [[9]],[[2.5]],[[3]],[[4.6]],[[6.9]],[[10]] ]
? ? nycheck= [ [[1]],[[0]],[[1]],[[0]],[[0]],[[1]] ]
? ? pd=tf.cast(nyarray,tf.float32)
? ? pe=tf.cast(nycheck,tf.float32)
? ? model = Sequential()
? ? lstm = LSTM(10,input_shape=(1,1))
? ? dense = Dense((1),input_shape = (1,1))
? ? activate= Activation('relu')
? ? model.add(lstm)
? ? model.add(dense)
? ? model.add(activate)
? ? model.compile(loss='mse',optimizer='adam',metrics=['accuracy'])
? ? model.fit(pd,pe,epochs=500,shuffle=True)
train()
我們先從引用的庫進(jìn)行分析? dense為全連接層?
dropout是tensorflow中防止訓(xùn)練過擬合的一種措施,實際作用無非是使輸入tensor中某些元素變?yōu)?,其它沒變0的元素變?yōu)樵瓉淼?/keep_prob大小。但是我這里數(shù)據(jù)量非常小,故實際上沒有進(jìn)行調(diào)用。
Activation 字面意思 激活函數(shù)
Sequential 序列模型 就是個將各個層加在一起,然后開始訓(xùn)練。
隨即開始代碼分析,我們首先給出兩個數(shù)據(jù)組 一個是輸入數(shù)據(jù)一個是識別數(shù)據(jù),隨后我們將數(shù)據(jù)進(jìn)行轉(zhuǎn)化為32位浮點數(shù)據(jù)。設(shè)定了10個單元,輸入數(shù)據(jù)為1維。添加一個全連接層,隨后用relu函數(shù)進(jìn)行激活。最后將之前構(gòu)建的層相連接,開始訓(xùn)練
訓(xùn)練時損失函數(shù)采用均方誤差(標(biāo)準(zhǔn)差)優(yōu)化器則采用adam(沒咋看過這個)然后就開始訓(xùn)練了?
訓(xùn)練次數(shù)為500次,輸出結(jié)果如下
6/6 [==============================] - 0s 651us/sample - loss: 0.1900 - accuracy: 0.6667
Epoch 148/500
6/6 [==============================] - 0s 488us/sample - loss: 0.1899 - accuracy: 0.6667
Epoch 149/500
6/6 [==============================] - 0s 813us/sample - loss: 0.1898 - accuracy: 0.6667
6/6 [==============================] - 0s 814us/sample - loss: 0.1511 - accuracy: 0.8333
Epoch 499/500
6/6 [==============================] - 0s 651us/sample - loss: 0.1510 - accuracy: 0.8333
Epoch 500/500
6/6 [==============================] - 0s 813us/sample - loss: 0.1508 - accuracy: 0.8333
發(fā)現(xiàn)損失值的確在緩慢下降 并且準(zhǔn)確度也再提高,符合預(yù)期。