tensorflow入門學習及MNIST手寫數字識別學習
1. tensorflow安裝
如果使用pycharm設置來安裝會報下載超時的錯誤
使用命令安裝也需要下載很久
//使用這個命令安裝就很快
pip install tensorflow==2.0.0rc1 -i https://pypi.tuna.tsinghua.edu.cn/simple
2. 安裝tensorflow結果查看
import tensorflow as tf
# 查看安裝版本
print(tf.__version__)
# 打印所有數據集
print(dir(tf.keras.datasets))
#打印結果
2.0.0-rc1
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', '_sys', 'boston_housing', 'cifar10', 'cifar100', 'fashion_mnist', 'imdb', 'mnist', 'reuters']
3. MNIST數據集可視化
# 加載數據集
mnist = tf.keras.datasets.mnist
# 包括兩個數據集,一個是訓練數據(60000個),一個是測試數據(10000個)
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 打印數據格式
print(x_train.shape, y_train.shape)
print(x_test.shape, y_test.shape)
#打印結果
(60000, 28, 28) (60000,)
(10000, 28, 28) (10000,)
# 顯示圖片
# 導入依賴庫
import matplotlib.pyplot as plt
# 隨機選取一個數並查看label
image_index = 15000 # 范圍是[0,59999)
# 圖片顯示(彩色)
# plt.imshow(x_train[image_index])
# 圖片灰度顯示(黑白)
plt.imshow(x_train[image_index], cmap='Greys')
plt.show()
# 打印圖片所代表的數字
print(y_train[image_index])
4. MNIST數據集格式轉換
import numpy as np
# 將圖片從28*28擴充為32*32
x_train = np.pad(x_train, ((0, 0), (2, 2), (2, 2)), 'constant', constant_values=0)
print(x_train.shape)
# 數據類型轉換
x_train = x_train.astype('float32')
# 數據正則化
x_train /= 255
# 數據維度轉換([n,h,w,c])
x_train = x_train.reshape(x_train.shape[0], 32, 32, 1)
print(x_train.shape)
# 打印結果
(60000, 32, 32)
(60000, 32, 32, 1)
5. 構建LeNet模型
# 構建LeNet模型
model = tf.keras.models.Sequential([
# 第一層:卷積層編碼
# 參數:卷積核個數,卷積核大小,填充方式,激活函數,輸入數據格式
tf.keras.layers.Conv2D(filters=6, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu,
input_shape=(32, 32, 1)),
# 第二層:池化層
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
# 第三層:卷積層
tf.keras.layers.Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation=tf.nn.relu),
# 第四層:池化層
tf.keras.layers.AveragePooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
# 扁平處理(多維數據轉換為一維數據)
tf.keras.layers.Flatten(),
# 第五、六、七層:全連接層
tf.keras.layers.Dense(units=120, activation=tf.nn.relu),
tf.keras.layers.Dense(units=84, activation=tf.nn.relu),
tf.keras.layers.Dense(units=10, activation=tf.nn.softmax)
])
print(model.summary())
# 模型訓練
# 超參數設置
num_epochs = 10
batch_size = 64
learning_rate = 0.001
adam_optimizer = tf.keras.optimizers.Adam(learning_rate)
model.compile(optimizer=adam_optimizer,
loss=tf.keras.losses.sparse_categorical_crossentropy,
metrics=['accuracy'])
# 用於計算學習時間
import datetime
start_time = datetime.datetime.now()
model.fit(x=x_train,
y=y_train,
batch_size=batch_size,
epochs=num_epochs)
end_time = datetime.datetime.now()
time_cost = end_time - start_time
print("time_cost = ", time_cost) # CPU time cost: 5min, GPU time cost: less than 1min
# 模型保存(保存在當前目錄下)
model.save('lenet_model.h5')
6. 使用模型來識別手寫的數字
# 使用模型識別圖片數字
import tensorflow as tf
# 加載已經訓練好的LeNet模型
model = tf.keras.models.load_model('lenet_model.h5')
model.summary()
import cv2
import matplotlib.pyplot as plt
# 第一步:讀取圖片
img = cv2.imread('numberImages/9.jpg') # 8.png
print(img.shape)
plt.imshow(img)
plt.show()
# 第二步:將圖片轉為灰度圖
img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
print(img.shape)
plt.imshow(img, cmap='Greys')
plt.show()
# 第三步:將圖片的底色和字的顏色取反
img = cv2.bitwise_not(img)
plt.imshow(img, cmap='Greys')
plt.show()
# 第四步:將底變成純白色,將字變成純黑色
img[img <= 100] = 0
img[img > 140] = 255 # 130
plt.imshow(img)
plt.show()
# 顯示圖片
plt.imshow(img, cmap='Greys')
plt.show()
# 第五步:將圖片尺寸縮放為輸入規定尺寸
img = cv2.resize(img, (32, 32))
plt.show()
# 第六步:將數據類型轉為float32
img = img.astype('float32')
# 第七步:數據正則化
img /= 255
# 第八步:增加維度為輸入的規定格式
img = img.reshape(1, 32, 32, 1)
print(img.shape)
# 第九步:預測
pred = model.predict(img)
# 第十步:輸出結果
print('=========================')
print('預測結果為:', pred.argmax())
9.jpg

# 運行結果
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 28, 28, 6) 156
_________________________________________________________________
average_pooling2d (AveragePo (None, 14, 14, 6) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 10, 10, 16) 2416
_________________________________________________________________
average_pooling2d_1 (Average (None, 5, 5, 16) 0
_________________________________________________________________
flatten (Flatten) (None, 400) 0
_________________________________________________________________
dense (Dense) (None, 120) 48120
_________________________________________________________________
dense_1 (Dense) (None, 84) 10164
_________________________________________________________________
dense_2 (Dense) (None, 10) 850
=================================================================
Total params: 61,706
Trainable params: 61,706
Non-trainable params: 0
_________________________________________________________________
(651, 650, 3)
(651, 650)
(1, 32, 32, 1)
=========================
預測結果為: 9
LetNet模型簡介







資料:
鏈接:https://pan.baidu.com/s/1kJz0IvNIMpYU3-ZLwM20cQ
提取碼:ty40