tensorflow实现宝可梦数据集迁移学习
目錄
一、遷移學習簡介
二、構建預訓練模型
1、調用內置模型
2、修改模型
3、構建模型
三、導入數據和預處理
1、設置batch size
2、讀取訓練數據
3、讀取驗證數據
4、讀取測試數據
5、預處理
四、模型訓練
1、設置early_stopping
2、模型編譯
3、模型設置
4、模型評估
5、保存訓練權重
五、模型預測
1、構建預測模型
2、導入權重
3、預測
4、對比分析
一、遷移學習簡介
遷移學習就是把預先定義好的模型,以及該模型在對應數據集上訓練得到的參數遷移到新的模型,用來幫助新模型訓練。通過遷移學習我們可以將模型已經學到的參數,分享給新模型從而加快并優化模型的學習效率,從而不用像大多數網絡那樣從零開始學習。對于小樣本學習的也可以減少過擬合或者欠擬合問題。
遷移學習的幾種實現方式:
Transfer Learning:凍結預訓練模型的全部卷積層,只訓練自己定制的全連接層。
Extract Feature Vector:先計算出預訓練模型的卷積層對所有訓練和測試數據的特征向量,然后拋開預訓練模型,只訓練自己定制的簡配版全連接網絡。
Fine-tuning:凍結預訓練模型的部分卷積層(通常是靠近輸入的多數卷積層,因為這些層保留了大量底層信息)甚至不凍結任何網絡層,訓練剩下的卷積層(通常是靠近輸出的部分卷積層)和全連接層。
二、構建預訓練模型
1、調用內置模型
調用tensorflow內置VGG19模型,下載該模型在"imagenet"數據集上預訓練權重
net = keras.applications.VGG19(weights='imagenet', include_top=False,
???????????????????????????????pooling='max')
2、修改模型
凍結卷積層,將全連接層修改為自定義數據集對應分類數。
net.trainable = False
newnet = keras.Sequential([
???? net,
???? layers.Dense(5)
])
3、構建模型
newnet.build(input_shape=(4,224,224,3))
newnet.summary()
三、導入數據和預處理
1、設置batch size
根據模型參數量和硬件環境設定batch size大小
batchsz = 128
2、讀取訓練數據
images, labels, table = load_pokemon('pokemon',mode='train')
db_train = tf.data.Dataset.from_tensor_slices((images, labels))
db_train = db_train.shuffle(1000).map(preprocess).batch(batchsz)
3、讀取驗證數據
images2, labels2, table = load_pokemon('pokemon',mode='val')
db_val = tf.data.Dataset.from_tensor_slices((images2, labels2))
db_val = db_val.map(preprocess).batch(batchsz)
4、讀取測試數據
images3, labels3, table = load_pokemon('pokemon',mode='test')
db_test = tf.data.Dataset.from_tensor_slices((images3, labels3))
db_test = db_test.map(preprocess).batch(batchsz)
5、預處理
def preprocess(x,y):
???? # x: 圖片的路徑,y:圖片的數字編碼
???? x = tf.io.read_file(x)
???? x = tf.image.decode_jpeg(x, channels=3)
???? x = tf.image.resize(x, [244, 244])
???? x = tf.image.random_flip_up_down(x)
???? x = tf.image.random_crop(x, [224,224,3])
????x = tf.cast(x, dtype=tf.float32) / 255.
??? x = normalize(x)
???? y = tf.convert_to_tensor(y)
???? y = tf.one_hot(y, depth=5)
???? return x, y
四、模型訓練
1、設置early_stopping
為防止過擬合,這里使用early_stopping,當模型在驗證集上精度變化在min_delta以內,并且持續次數達到patience以后,模型訓練即停止。
early_stopping = EarlyStopping(
???? monitor='val_accuracy',
???? min_delta=0.001,
???? patience=5
)
2、模型編譯
設置優化器,損失函數和精度衡量標準
newnet.compile(optimizer=optimizers.Adam(lr=1e-3),
???????????????loss=losses.CategoricalCrossentropy(from_logits=True),
???????????????metrics=['accuracy'])
3、模型設置
設置訓練集,驗證集,驗證頻率,迭代次數以及回調函數
newnet.fit(db_train, validation_data=db_val, validation_freq=1, epochs=20,
???????????callbacks=[early_stopping])
4、模型評估
訓練結束后,使用evaluate函數進行模型評估,了解模型最終精度情況。
newnet.evaluate(db_test)
5、保存訓練權重
newnet.save_weights('weights.ckpt')
五、模型預測
1、構建預測模型
net = keras.applications.VGG19(weights='imagenet', include_top=False,
???????????????????????????????pooling='max')
net.trainable = False
model= keras.Sequential([
???? net,
???? layers.Dense(5)
])
model.build(input_shape=(4,224,224,3))
2、導入權重
model.load_weights('weights.ckpt')
3、預測
logits = newnet.predict(x)
prob = tf.nn.softmax(logits, axis=1)
print(prob)
max_prob_index = np.argmax(prob, axis=-1)[0]
prob = prob.numpy()
max_prob = prob[0][max_prob_index]
print(max_prob)
max_index = np.argmax(logits, axis=-1)[0]
name = ['妙蛙種子', '小火龍', '超夢', '皮卡丘', '杰尼龜']
print(name[max_index])
測試圖像:
?
預測結果:
tf.Tensor([[0.78470963 0.09179451 0.03650109 0.01834733 0.06864741]], shape=(1, 5), dtype=float32)
0.78470963
妙蛙種子
4、對比分析
使用同樣測試圖像在沒有進行遷移學習訓練的模型上進行測試,輸出結果:
tf.Tensor([[0.46965462 0.0470721 ?0.20003504 0.11915307 0.16408516]], shape=(1, 5), dtype=float32)
0.46965462
妙蛙種子
從結果上看,兩個模型都能準確預測,但輸出的分類概率(遷移學習0.7847,非遷移學習0.4696),兩者存在明顯差別,可以看出使用遷移學習能夠達到更好的擬合效果。
總結
以上是生活随笔為你收集整理的tensorflow实现宝可梦数据集迁移学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深度学习tensorflow实现宝可梦图
- 下一篇: python字符串转字典并获取多层嵌套字