[ALEXNET] [keras]手書きの数字認識

環境設定

Python 3.6
tensorflow1.13.1
ハード2.2.4

pip install tensorflow==1.13.1
pip install keras==2.2.4

プログラムの進捗状況

手書きのデータセットを読み込む

import keras
from keras.datasets import mnist

(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

手書きのデータセットはkerasパッケージにあります。このとき、プログラムは公式Webサイトからデータを自動的にダウンロードします。
手書きのデータセット:
ここに画像の説明を挿入
X、Yを次の形式で表示します
ここに画像の説明を挿入
。X_trainには画像が含まれます:
ここに画像の説明を挿入
対応するラベルY_trainは画像を表す整数番号は何ですか:
ここに画像の説明を挿入

入力データをモデルに受け入れられる形式に整理します

X_train = X_train.reshape(60000, 28, 28, 1)
X_test = X_test.reshape(10000, 28, 28, 1)

トレーニングセットの最初の画像データは5のようです(最後のパラメーターは0として書き込む必要があり、「:」を試しても機能しません)
ここに画像の説明を挿入
テストセットのデータは類似しています。最初のテスト画像:
ここに画像の説明を挿入
変換された画像を表示しますフォーマット:
ここに画像の説明を挿入
それは単なる追加の次元です

入力画像データの範囲を確認します。
ここに画像の説明を挿入
値は0〜255であり、正規化のために以下が0〜1に変換されます。

X_train = X_train / 255
X_test = X_test / 255

ここに画像の説明を挿入

出力データをワンホットコード化する

簡単に言えば、スパース行列は予測結果を表すために使用されます.n種類の分類結果があり、行列には​​n列があります.j番目の列は1であり、これはj番目の種類の予測結果が最も多いことを意味しますおそらく。

Y_train = keras.utils.to_categorical(Y_train, 10)
Y_test = keras.utils.to_categorical(Y_test, 10)

フォーマットを確認してください:
ここに画像の説明を挿入
それは確かに広いです。
101番目のラベルを確認し、画像データを確認します。0、1、2
ここに画像の説明を挿入
、…、9の10のカテゴリがあり、7番目の列は1です。つまり、結果は6であり、実際には6のように見えます。

モデルを構築する

model = Sequential() # 空模型

model.add(Conv2D(32, (3, 3), input_shape=(28, 28, 1))) 
model.add(Activation("relu"))
model.add(Conv2D(32, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten()) # 展开成一维
model.add(Dense(200))
model.add(Activation("relu"))

model.add(Dense(200))
model.add(Activation("relu"))

model.add(Dense(10, activation="softmax"))

簡単な説明:

model.add(Conv2D(32, (3, 3), input_shape=(28, 28, 1))) 

Conv2D 32の最初のパラメーターは、最終結果が32層(m ∗ n ∗ 3 m * n * 3)であることを意味します。mn3- >m ′∗ n′ ∗ 32 m '* n' * 32mn3 2
2番目のパラメーター(3、3)は、畳み込み演算子のサイズを表します
。input_shapeは入力データの形式です

model.add(Dense(200))

ニューラルネットワークの200層をオーバーレイします(これは最も一般的な種類、または隠れ層のようです...私はそれをあまり理解していません)

モデル情報の表示:(実行中のプロセスを表す括弧内の数字は無視してください)
ここに画像の説明を挿入

モデルのオプティマイザーを定義します

adam = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model.compile(loss="categorical_crossentropy", optimizer=adam, metrics=["accuracy"])

Adamオプティマイザーを選択し、パラメーターβ1β_1を導入しますb1β2β_2b2εεε、一般的に使用される値を取ります。lrは学習率であり、0.001に設定され
ます。損失関数はクロスエントロピーを使用し、モデルのパフォーマンスの精度を測定するための計算式は精度です。

トレーニングモデル

model.fit(X_train, Y_train, batch_size=100, epochs=1, verbose=1, validation_data=[X_test, Y_test])

バッチトレーニングでは、データは100の部分に分割され、1回だけトレーニングされます(エポックは反復回数です)。詳細が何であるかは不明です。

とどろく扇風機!
ここに画像の説明を挿入

予測を行うために写真を入力してください

テストセットの3番目の画像を最初に見てください:(この画像は前に見たものです)
ここに画像の説明を挿入
プリントアウト、予測結果は数値1であり、データラベルと一致しています。
ここに画像の説明を挿入
出力はそれぞれの可能性を記録したリストです。分類結果、最終的な予測結果として可能な限り最大の結果を手動で抽出する必要があります。
ここで、np.round()関数は小数点以下数桁を保持し、最初のパラメーターは入力データ、2番目のパラメーターは小数点以下数桁を保持します。デフォルトは1桁です。

上記の.reshape(1、28、28、1)は、他のメソッドがエラーを報告しているために必要です。
(1)
ここに画像の説明を挿入
ここに画像の説明を挿入
(2)
ここに画像の説明を挿入
ここに画像の説明を挿入
私の理解では、最後のパラメーターと同様に、0の場合、つまりレイヤーが1つしかない場合、そのような次元はないと見なされ((1)を参照)、すべてを取るだけです。 、記号「:」を使用してください。これらはこの次元を持っていると見なされますが、私の意見では同じようです。
したがって、最初のパラメーターは数値のみを使用し、エラーを報告するためのそのような次元はないと見なされます。
これは、画像情報が以前に表示されたときに、すべてを取得するための記号「:」が付いた最後のパラメーターがエラーを報告する理由も証明する必要があります。これは、画像よりも1つ多い次元と見なされるためです。

モデルストレージ

主に、トレーニングから取得した一連のパラメータにアクセスします。

model.save("model/My_Alexnet_mnist.h5")
# 这里我之前手动创建了文件夹 model, 如果没有的话,应该会报文件不存在的错

プログラムファイルのメインディレクトリの下にあるmodelフォルダの.h5ファイルに保存します

モデルの読み込み

from keras.models import load_model
model = load_model("model/My_Alexnet_mnist.h5")

オリジナルモデルが帰ってきました!
ここに画像の説明を挿入
コンピュータの電源を切った後、再び実行することを心配する必要はありません!

完全なソースコード

不要な出力はありません。

# 完整版
import numpy as np
import matplotlib.pyplot as plt
import keras

from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Activation
from keras.layers import Conv2D, MaxPooling2D
#from keras import backend as K

# 手写数据集读入
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

# 把输入数据整理成模型可以接受的格式
X_train = X_train.reshape(60000, 28, 28, 1)
X_test = X_test.reshape(10000, 28, 28, 1)

# 进行归一化处理
X_train = X_train / 255
X_test = X_test / 255

# 对于输出进行 one-hot-codeing
Y_train = keras.utils.to_categorical(Y_train, 10)
Y_test = keras.utils.to_categorical(Y_test, 10)

# 搭建模型
model = Sequential()

model.add(Conv2D(32, (3, 3), input_shape=(28, 28, 1)))
model.add(Activation("relu"))
model.add(Conv2D(32, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(Conv2D(64, (3, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten()) # 展开成一维
model.add(Dense(200))
model.add(Activation("relu"))

model.add(Dense(200))
model.add(Activation("relu"))

model.add(Dense(10, activation="softmax"))

# 定义模型的优化器
adam = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
model.compile(loss="categorical_crossentropy", optimizer=adam, metrics=["accuracy"])

# 训练模型
model.fit(X_train, Y_train, batch_size=100, epochs=1, verbose=1, validation_data=[X_test, Y_test])

# 模型预测
test_index = 2
plt.imshow(X_test[test_index, :, :, 0])
output = model.predict(X_test[test_index, :, :, :].reshape(1, 28, 28, 1))

print("predicted output: ", np.round(output))
print("the label is: ", Y_test[test_index])

# 模型的存储
model.save("model/My_Alexnet_mnist.h5")

# 载入训练完成的模型
# from keras.models import load_model
# model = load_model("model/My_Alexnet_mnist.h5")
model.summary()

おすすめ

転載: blog.csdn.net/weixin_44092088/article/details/113031972