MNIST識別分類網路實現

2021-09-28 11:36:06 字數 3970 閱讀 6393

本文

import numpy as np

from keras.datasets import mnist

from keras.utils import np_utils

from keras.models import sequential

from keras.layers import dense

from keras.optimizers import sgd

#載入資料

(x_train, y_train)

,(x_test, y_test)

= mnist.load_data(

'/home/n3/pycharmprojects/keras_study/mnist.npz'

)#(60000, 28, 28)

print

(x_train.shape)

#(60000,)

print

(y_train.shape)

#資料格式轉換->(60000, 784),使用-1表示可以定為任意值,除以255.0是為了進行歸一化

x_train =x_train.reshape(x_train.shape[0]

,-1)

/255.0

x_test =x_test.reshape(x_test.shape[0]

,-1)

/255.0

#將label轉換為 one hot 格式

y_train =np_utils.to_categorical(y_train, num_classes=10)

y_test =np_utils.to_categorical(y_test, num_classes=10)

#建立模型,輸入為784個神經元,輸出為10個神經元

model = sequential(

[dense(units=

10, input_dim=

784, bias_initializer=

'one'

, activation=

'softmax')]

)#定義優化器

sgd = sgd(lr=

0.2)

#metrics可以用來在編譯過程中計算準確率

model.

compile

(optimizer=sgd, loss=

'mse'

,metrics=

['accuracy'])

#使用model.fit進行訓練

model.fit(x_train, y_train, batch_size=

32, epochs=10)

# 評估模型

loss , accuracy = model.evaluate(x_test,y_test)

print

('loss:'

,loss)

print

('accuracy:'

,accuracy)

loss: 0.013015691758366301

accuracy: 0.9186000227928162

將loss函式變為categorical_crossentropy,交叉熵其收斂速率比較快

結果比較有了少量的提公升

loss: 0.28222181722521783

accuracy: 0.9215999841690063

在程式中需要新增隱藏層層數才能使用dropout

#建立模型,要使用dropout,需要新增隱藏層層數,softmax一般出現在網路最後一層

#包含兩個隱藏層

model = sequential(

[dense(units=

200, input_dim=

784, bias_initializer=

'one'

, activation=

'tanh'),

dense(units=

100, bias_initializer=

'one'

, activation=

'tanh'),

dense(units=

10, bias_initializer=

'one'

, activation=

'softmax')]

)

最後結果,出現過擬合:

1:loss: 0.05595934414237272

1:accuracy: 0.9817000031471252

2:loss: 0.005265787925516876

2:accuracy: 0.9993500113487244

#建立模型,要使用dropout,需要新增隱藏層層數,softmax一般出現在網路最後一層

#包含兩個隱藏層

model = sequential(

[dense(units=

200, input_dim=

784, bias_initializer=

'one'

, activation=

'tanh'),

dropout(

0.4)

, dense(units=

100, bias_initializer=

'one'

, activation=

'tanh'),

dropout(

0.4)

, dense(units=

10, bias_initializer=

'one'

, activation=

'softmax')]

)

結果:此例子沒有提公升效果,雖然準確率降低,但是兩個準確率比較接近,防止了過擬合

1:loss: 0.10907337165195495

1:accuracy: 0.9699000120162964

2:loss: 0.07446787966905782

2:accuracy: 0.977649986743927

在keras中,層級設定包括kernel_regularizer(權值正則化項),bias_regularizer(偏置值正則化項),activity_regularizer(啟用函式正則化項),一般設定kernel_regularizer

可以部分防止過擬合,當資料比較複雜時,可以新增正則化項,來進行歸一處理,可以得到更好的值

#建立模型,要使用dropout,需要新增隱藏層層數,softmax一般出現在網路最後一層

#包含兩個隱藏層

model = sequential(

[dense(units=

200, input_dim=

784, bias_initializer=

'one'

, activation=

'tanh'

,kernel_regularizer=l2(

0.0003))

, dense(units=

100, bias_initializer=

'one'

, activation=

'tanh'),

dense(units=

10, bias_initializer=

'one'

, activation=

'softmax')]

)

結果:

1:loss: 0.11881063914299012

1:accuracy: 0.9772999882698059

MNIST手寫數字識別 分類應用入門

import tensorflow as tf import numpy as np from tensorflow import placeholder from tensorflow.examples.tutorials.mnist import input data mnist input d...

使用殘差網路實現MNIST手寫數字識別

在第二步中,我們根據輸入和輸出的尺寸是否相同,分為identity block和conv block,每種block都有如下兩種模式 3卷積和2卷積形式,3卷積的速度的要更快一些。定義identity block層的 如下,下面是有3個卷積層,在輸出的時候把輸入值x input和經過3層卷積層後輸出...

神經網路實現Mnist資料集簡單分類

import tensorflow as tf from tensorflow.examples.tutorials.mnist import input data 首先要載入資料集 載入資料集 mnist input data.read data sets mnist data one hot t...