Tensorflow2-Lenet-5實現Cifar10分類
阿新 • • 發佈:2020-12-19
技術標籤:Tensorflowpythontensorflow神經網路深度學習
Tensorflow2-Lenet-5實現Cifar10分類
引言
- 為了掌握tensorflow一些函式的基本操作,寫寫部落格記錄下。
- 在學習時為了方便查詢一些函式,這裡放了keras中文文件方便查詢,也有pdf版本:百度網盤連結:https://pan.baidu.com/s/1gf_vlnyPqeCRsoywzFrHrQ
提取碼:jnwq - 這也是自己的第一篇部落格,希望能堅持寫下去,3年後能有一個好的收穫。
模型
在keras中有建立模型時有兩種模型:
Sequential
順序模型是多個網路層的線性堆疊。
可以通過將網路層例項的列表傳遞給 Sequential 的構造器,來建立一個 Sequential 模型:
from keras.models import Sequential
from keras.layers import Dense, Activation
model = Sequential([
Dense(32, input_shape=(784,)),
Activation( 'relu'),
Dense(10),
Activation('softmax'),
])
也可以簡單地使用 model.add() 方法將各層新增到模型中:
model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
Model
通用模型可以設計比較複雜的網路
from tensorflow.keras import Model,Sequential,optimizers
from tensorflow.keras.layers import Activation, Dense,Conv2D,MaxPool2D,Input,Dropout,Flatten
inputs=Input([32,32,3])
x=Conv2D(6,kernel_size=(5,5),activation='relu')(inputs)
x=Dropout(0.5)(x)
x=MaxPool2D(pool_size=(2,2))(x)
x=Dense(84)(x)
out=Dense(10,activation='softmax')(x)
#例項化匯入輸入輸出
model=Model(inputs,out)
基本函式
本次實驗使用Model模型,所以在函式編寫上會和Sequential不太一樣。
1.全連線層Dense
- Dense是全連線層,一般放在網路結構的最後幾層。
- Dense層一般需要設定卷積核個數,啟用函式。(有時候可以省略啟用函式)
x=Dense(64,activation='relu')(x)
2.卷積層Conv2D
- Conv2D需要設定卷積核個數,卷積核大小,啟用函式,步長,填充方式。
x=Conv2D(64,kernel_size=(5,5),activation='relu',strides=2,padding='same')
3.池化層Maxpool2D
- Maxpool2D需要設定卷積核大小,啟用函式。
- 池化層不需要設定卷積核個數,因為池化層的作用就是讓特徵圖尺寸變小,不改變通道數。
搭建網路
1.匯入資料集
#匯入資料
data=tf.keras.datasets.cifar10
(x_train,y_train),(x_test,y_test)=data.load_data()
#對訓練標籤和測試標籤進行one-hot編碼
y_train=tf.keras.utils.to_categorical(y_train, num_classes=10)
y_test=tf.keras.utils.to_categorical(y_test, num_classes=10)
#對樣本進行歸一化,減小計算量
x_train=x_train/255.0
x_test=x_test/255.0
注:這裡要對訓練標籤和測試標籤進行升維,因為cifar10是個10分類的問題,我們要將標籤數字[0-9]轉化為one-hot向量。
做個展示:
data=tf.keras.datasets.cifar10
(x_train,y_train),(x_test,y_test)=data.load_data()
print("y_train",y_train.shape)
y_train=tf.keras.utils.to_categorical(y_train, num_classes=10)
y_test=tf.keras.utils.to_categorical(y_test, num_classes=10)
print("y_train",y_train.shape)
#result
y_train (50000, 1)
y_train (50000, 10)
2.建立模型
#建立模型
inputs=Input([32,32,3])
x=Conv2D(6,kernel_size=(5,5),activation='relu')(inputs)
x=Dropout(0.5)(x)
x=MaxPool2D(pool_size=(2,2))(x)
x=Conv2D(16,kernel_size=(5,5),activation='relu')(x)
x=Dropout(0.5)(x)
x=MaxPool2D(pool_size=(2,2))(x)
x=Conv2D(120,kernel_size=(5,5),activation='relu')(x)
x=Flatten()(x)
x=Dense(120)(x)
x=Dense(84)(x)
out=Dense(10,activation='softmax')(x)
model=Model(inputs,out)
3.model.compile
編譯需要設定優化器,損失函式,度量環節。
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['sparse_categorical_accuracy'])
如果想改變優化器的引數比如學習率等,可以自己設定優化器,不用按照系統預設引數,如下:
adam=optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(loss='categorical_crossentropy',
optimizer=adam,
metrics=['accuracy'])
4.model.fit
- 訓練過程一般需要設定訓練集輸入特徵,訓練集輸入標籤,batch_size個數,epoch數,訓練集和測試集的比例/多少epoch測試一次。
model.fit(x_train, y_train, batch_size=16,epochs=5,validation_split=0.25)
5.model.summary
- 列印資訊,如訓練引數
model.summary()
程式碼
"""
Author: Wang Qiang
Date:2020/12/11
"""
import tensorflow as tf
from tensorflow.keras import Model,Sequential,optimizers
from tensorflow.keras.layers import Activation,Dense,Conv2D,MaxPool2D,Input,Dropout,Flatten
import os
import numpy as np
import matplotlib.pyplot as plt
np.set_printoptions(threshold=np.inf)
#匯入資料
data=tf.keras.datasets.cifar10
(x_train,y_train),(x_test,y_test)=data.load_data()
#對訓練標籤和測試標籤進行one-hot編碼
y_train=tf.keras.utils.to_categorical(y_train, num_classes=10)
y_test=tf.keras.utils.to_categorical(y_test, num_classes=10)
#對樣本進行歸一化,減小計算量
x_train=x_train/255.0
x_test=x_test/255.0
#建立模型
inputs=Input([32,32,3])
x=Conv2D(6,kernel_size=(5,5),activation='relu')(inputs)
x=Dropout(0.5)(x)
x=MaxPool2D(pool_size=(2,2))(x)
x=Conv2D(16,kernel_size=(5,5),activation='relu')(x)
x=Dropout(0.5)(x)
x=MaxPool2D(pool_size=(2,2))(x)
x=Conv2D(120,kernel_size=(5,5),activation='relu')(x)
x=Flatten()(x)
x=Dense(120)(x)
x=Dense(84)(x)
out=Dense(10,activation='softmax')(x)
model=Model(inputs,out)
#設定優化器
adam=optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)
model.compile(loss='categorical_crossentropy',
optimizer=adam,
metrics=['accuracy'])
#儲存模型
# 先定義出存放模型的路徑和檔名,命名為ckpt檔案
# 生成ckpt檔案時,會同步生成索引表,所以通過判斷是否已經有索引表,就知道是不是已經儲存過模型引數
save_path = "./checkpoint/lenet5.ckpt"
if os.path.exists(save_path + '.index'):
print('-------------load the model-----------------')
# 如果有索引表,就說明儲存過模型,則可以呼叫load_weights讀取模型引數
model.load_weights(save_path)
cp_callback=tf.keras.callbacks.ModelCheckpoint(filepath=save_path,monitor='val_loss',verbose=0,
save_best_only=True,save_weights_only=True)
history = model.fit(x_train, y_train, validation_split=0.25, epochs=5, batch_size=16,
callbacks=[cp_callback])
model.summary()
#print(model.trainable_variables)
file = open('./weights.txt', 'w')
for v in model.trainable_variables:
file.write(str(v.name) + '\n')
file.write(str(v.shape) + '\n')
file.write(str(v.numpy()) + '\n')
file.close()
# 繪製訓練 & 驗證的準確率值
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
# 繪製訓練 & 驗證的損失值
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()
實驗結果
- 簡單跑了幾個epoch,程式碼內部設定了儲存模型引數,所以每次訓練都可以實現載入最優的模型引數。
Epoch 1/5
2344/2344 [==============================] - 17s 7ms/step - loss: 1.1881 - accuracy: 0.5783 - val_loss: 1.4333 - val_accuracy: 0.4962
Epoch 2/5
2344/2344 [==============================] - 16s 7ms/step - loss: 1.1655 - accuracy: 0.5863 - val_loss: 1.4670 - val_accuracy: 0.4942
Epoch 3/5
2344/2344 [==============================] - 15s 6ms/step - loss: 1.1525 - accuracy: 0.5939 - val_loss: 1.4527 - val_accuracy: 0.4910
Epoch 4/5
2344/2344 [==============================] - 15s 7ms/step - loss: 1.1376 - accuracy: 0.5993 - val_loss: 1.5371 - val_accuracy: 0.4561
Epoch 5/5
2344/2344 [==============================] - 15s 6ms/step - loss: 1.1290 - accuracy: 0.5981 - val_loss: 1.4024 - val_accuracy: 0.5110