深度學習tensorflow基礎mnist
軟件架構
mnist數據集的識別使用瞭兩個非常小的網絡來實現,第一個是最簡單的全連接網絡,第二個是卷積網絡,mnist數據集是入門數據集,所以不需要進行圖像增強,或者用生成器讀入內存,直接使用簡單的fit()命令就可以一次性訓練
安裝教程
- 使用到的主要第三方庫有tensorflow1.x,基於TensorFlow的Keras,基礎的庫包括numpy,matplotlib
- 安裝方式也很簡答,例如:pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple
- 註意tensorflow版本不能是2.x
使用說明
- 首先,我們預覽數據集,運行mnistplt.py,繪制瞭4張訓練用到的圖像
- 訓練全連接網絡則運行Densemnist.py,得到權重Dense.h5,加載模型並預測運行Denseload.py
- 訓練卷積網絡則運行CNNmnist.py,得到權重CNN.h5,加載模型並預測運行CNNload.py
結果圖
訓練過程註釋
全連接網絡訓練:
"""多層感知機訓練""" from tensorflow.examples.tutorials.mnist import input_data from keras.models import Sequential from keras.layers import Dense #模擬原始灰度數據讀入 img_size=28 num=10 mnist=input_data.read_data_sets("./data",one_hot=True) X_train,y_train,X_test,y_test=mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels X_train=X_train.reshape(-1,img_size,img_size) X_test=X_test.reshape(-1,img_size,img_size) X_train=X_train*255 X_test=X_test*255 y_train=y_train.reshape(-1,num) y_test=y_test.reshape(-1,num) print(X_train.shape) print(y_train.shape) #全連接層隻能輸入一維 num_pixels = X_train.shape[1] * X_train.shape[2] X_train = X_train.reshape(X_train.shape[0],num_pixels).astype('float32') X_test = X_test.reshape(X_test.shape[0],num_pixels).astype('float32') #歸一化 X_train=X_train/255 X_test=X_test/255 # one hot編碼,這裡編好瞭,省略 #y_train = np_utils.to_categorical(y_train) #y_test = np_utils.to_categorical(y_test) #搭建網絡 def baseline(): """ optimizer:優化器,如Adam loss:計算損失,當使用categorical_crossentropy損失函數時,標簽應為多類模式,例如如果你有10個類別, 每一個樣本的標簽應該是一個10維的向量,該向量在對應有值的索引位置為1其餘為0 metrics: 列表,包含評估模型在訓練和測試時的性能的指標 """ model=Sequential() #第一步是確定輸入層的數目:在創建模型時用input_dim參數確定,例如,有784個個輸入變量,就設成num_pixels。 #全連接層用Dense類定義:第一個參數是本層神經元個數,然後是初始化方式和激活函數,初始化方法有0到0.05的連續型均勻分佈(uniform #Keras的默認方法也是這個,也可以用高斯分佈進行初始化normal,初始化實際就是該層連接上權重與偏置的初始化 model.add(Dense(num_pixels,input_dim=num_pixels,kernel_initializer='normal',activation='relu')) #softmax是一種用到該層所有神經元的激活函數 model.add(Dense(num,kernel_initializer='normal',activation='softmax')) #categorical_crossentropy適用於多分類問題,並使用softmax作為輸出層的激活函數的情況 model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy']) return model #訓練模型 model = baseline() """ batch_size 整數 每次梯度更新的樣本數。 未指定,默認為32 epochs 整數 訓練模型迭代次數 verbose 日志展示,整數 0:為不在標準輸出流輸出日志信息 1:顯示進度條 2:每個epoch輸出一行記錄 對於一個有 2000 個訓練樣本的數據集,將 2000 個樣本分成大小為 500 的 batch,那麼完成一個 epoch 需要 4 個 iteration """ model.fit(X_train,y_train,validation_data=(X_test,y_test),epochs=10,batch_size=200,verbose=2) #模型概括打印 model.summary() #model.evaluate()返回的是 損失值和你選定的指標值(例如,精度accuracy) """ verbose:控制日志顯示的方式 verbose = 0 不在標準輸出流輸出日志信息 verbose = 1 輸出進度條記錄 """ scores = model.evaluate(X_test,y_test,verbose=0) print(scores) #模型保存 model_dir="./Dense.h5" model.save(model_dir)
CNN訓練:
""" 模型構建與訓練 Sequential 模型結構: 層(layers)的線性堆棧,它是一個簡單的線性結構,沒有多餘分支,是多個網絡層的堆疊 多少個濾波器就輸出多少個特征圖,即卷積核(濾波器)的深度 3通道RGB圖片,一個濾波器有3個通道的小卷積核,但還是隻算1個濾波器 """ import numpy as np from tensorflow.examples.tutorials.mnist import input_data from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout #Flatten層用來將輸入“壓平”,即把多維的輸入一維化, #常用在從卷積層到全連接層的過渡 from keras.layers import Flatten from keras.layers.convolutional import Conv2D from keras.layers.convolutional import MaxPooling2D #模擬原始灰度數據讀入 img_size=28 num=10 mnist=input_data.read_data_sets("./data",one_hot=True) X_train,y_train,X_test,y_test=mnist.train.images,mnist.train.labels,mnist.test.images,mnist.test.labels X_train=X_train.reshape(-1,img_size,img_size) X_test=X_test.reshape(-1,img_size,img_size) X_train=X_train*255 X_test=X_test*255 y_train=y_train.reshape(-1,num) y_test=y_test.reshape(-1,num) print(X_train.shape) #(55000, 28, 28) print(y_train.shape) #(55000, 10) #此處卷積輸入的形狀要與模型中的input_shape匹配 X_train = X_train.reshape(X_train.shape[0],28,28,1).astype('float32') X_test = X_test.reshape(X_test.shape[0],28,28,1).astype('float32') print(X_train.shape)#(55000,28,28,1) #歸一化 X_train=X_train/255 X_test=X_test/255 # one hot編碼,這裡編好瞭,省略 #y_train = np_utils.to_categorical(y_train) #y_test = np_utils.to_categorical(y_test) #搭建CNN網絡 def CNN(): """ 第一層是卷積層。該層有32個feature map,作為模型的輸入層,接受[pixels][width][height]大小的輸入數據。feature map的大小是1*5*5,其輸出接一個‘relu'激活函數 下一層是pooling層,使用瞭MaxPooling,大小為2*2 Flatten壓縮一維後作為全連接層的輸入層 接下來是全連接層,有128個神經元,激活函數采用‘relu' 最後一層是輸出層,有10個神經元,每個神經元對應一個類別,輸出值表示樣本屬於該類別的概率大小 """ model = Sequential() model.add(Conv2D(32, (5, 5), input_shape=(img_size,img_size,1), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dense(num, activation='softmax')) #編譯 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) return model #模型訓練 model=CNN() model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=5, batch_size=200, verbose=1) model.summary() scores = model.evaluate(X_test,y_test,verbose=1) print(scores) #模型保存 model_dir="./CNN.h5" model.save(model_dir)
到此這篇關於mnist的文章就介紹到這瞭,希望可以幫到你們,更多相關深度學習內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章,希望大傢以後多多支持WalkonNet!
推薦閱讀:
- None Found