mnist數(shù)據(jù)集的識別使用了兩個非常小的網(wǎng)絡(luò)來實(shí)現(xiàn),第一個是最簡單的全連接網(wǎng)絡(luò),第二個是卷積網(wǎng)絡(luò),mnist數(shù)據(jù)集是入門數(shù)據(jù)集,所以不需要進(jìn)行圖像增強(qiáng),或者用生成器讀入內(nèi)存,直接使用簡單的fit()命令就可以一次性訓(xùn)練
"""多層感知機(jī)訓(xùn)練"""
from tensorflow.examples.tutorials.mnist import input_data
from keras.models import Sequential
from keras.layers import Dense
#模擬原始灰度數(shù)據(jù)讀入
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)
#搭建網(wǎng)絡(luò)
def baseline():
"""
optimizer:優(yōu)化器,如Adam
loss:計(jì)算損失,當(dāng)使用categorical_crossentropy損失函數(shù)時,標(biāo)簽應(yīng)為多類模式,例如如果你有10個類別,
每一個樣本的標(biāo)簽應(yīng)該是一個10維的向量,該向量在對應(yīng)有值的索引位置為1其余為0
metrics: 列表,包含評估模型在訓(xùn)練和測試時的性能的指標(biāo)
"""
model=Sequential()
#第一步是確定輸入層的數(shù)目:在創(chuàng)建模型時用input_dim參數(shù)確定,例如,有784個個輸入變量,就設(shè)成num_pixels。
#全連接層用Dense類定義:第一個參數(shù)是本層神經(jīng)元個數(shù),然后是初始化方式和激活函數(shù),初始化方法有0到0.05的連續(xù)型均勻分布(uniform
#Keras的默認(rèn)方法也是這個,也可以用高斯分布進(jìn)行初始化normal,初始化實(shí)際就是該層連接上權(quán)重與偏置的初始化
model.add(Dense(num_pixels,input_dim=num_pixels,kernel_initializer='normal',activation='relu'))
#softmax是一種用到該層所有神經(jīng)元的激活函數(shù)
model.add(Dense(num,kernel_initializer='normal',activation='softmax'))
#categorical_crossentropy適用于多分類問題,并使用softmax作為輸出層的激活函數(shù)的情況
model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['accuracy'])
return model
#訓(xùn)練模型
model = baseline()
"""
batch_size
整數(shù)
每次梯度更新的樣本數(shù)。
未指定,默認(rèn)為32
epochs
整數(shù)
訓(xùn)練模型迭代次數(shù)
verbose
日志展示,整數(shù)
0:為不在標(biāo)準(zhǔn)輸出流輸出日志信息
1:顯示進(jìn)度條
2:每個epoch輸出一行記錄
對于一個有 2000 個訓(xùn)練樣本的數(shù)據(jù)集,將 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()返回的是 損失值和你選定的指標(biāo)值(例如,精度accuracy)
"""
verbose:控制日志顯示的方式
verbose = 0 不在標(biāo)準(zhǔn)輸出流輸出日志信息
verbose = 1 輸出進(jìn)度條記錄
"""
scores = model.evaluate(X_test,y_test,verbose=0)
print(scores)
#模型保存
model_dir="./Dense.h5"
model.save(model_dir)
"""
模型構(gòu)建與訓(xùn)練
Sequential 模型結(jié)構(gòu): 層(layers)的線性堆棧,它是一個簡單的線性結(jié)構(gòu),沒有多余分支,是多個網(wǎng)絡(luò)層的堆疊
多少個濾波器就輸出多少個特征圖,即卷積核(濾波器)的深度
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
#模擬原始灰度數(shù)據(jù)讀入
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網(wǎng)絡(luò)
def CNN():
"""
第一層是卷積層。該層有32個feature map,作為模型的輸入層,接受[pixels][width][height]大小的輸入數(shù)據(jù)。feature map的大小是1*5*5,其輸出接一個‘relu'激活函數(shù)
下一層是pooling層,使用了MaxPooling,大小為2*2
Flatten壓縮一維后作為全連接層的輸入層
接下來是全連接層,有128個神經(jīng)元,激活函數(shù)采用‘relu'
最后一層是輸出層,有10個神經(jīng)元,每個神經(jīng)元對應(yīng)一個類別,輸出值表示樣本屬于該類別的概率大小
"""
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
#模型訓(xùn)練
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)
到此這篇關(guān)于mnist的文章就介紹到這了,希望可以幫到你們,更多相關(guān)深度學(xué)習(xí)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持腳本之家!