tensorflow入門學習及MNIST手寫數字識別學習


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM