**
keras
基礎與keras
斷點連續
**
什麼是斷點連續
,剛開始學習keras
是非常迷茫的,對於一些大神的代碼非常的好奇,爲什麼他們的代碼可以接着上次的訓練繼續訓練。
我也因此在網上不停的找資源,原來這種訓練方法叫斷點連續
,斷點連續顧名思義,停下來接着上此繼續訓練。
而我們的模型一般分爲兩種,一種叫初始模型
,一種叫成熟模型
(個人口語,請勿當標準)。而一般的訓練都是基於初始模型訓練的,斷點連續就是基於成熟模型訓練的。
**
一 什麼是初始模型
**
#初始模型構建
def model_nn():
model=keras.Sequential()
model.add(layers.Flatten())
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
return model
這就是一種初始模型,只有四個層,一個輸入層
,一個輸出層
,兩個隱藏層
(理論上隱藏層越多
,訓練效果越好,你可以自己刪掉幾層試一試)。初始模型
就是這種基本搭建的模型。
#載入初始模型
model = model_nn()
二 什麼是成熟模型
成熟模型就是基礎模型在訓練之後的模型,所以我們在模型訓練的時候才發現,像loss,acc
越來越理想。
所以成熟模型
就是基於數據的陶尋薰而變的更加有韻味的基礎模型
。
#模型編譯,包括優化器選擇和損失函數選擇
model.compile(optimizer='adam',\
loss='sparse_categorical_crossentropy',metrics=['acc'])
#模型編譯50次,並同時輸出預測loss和acc
model.fit(train_data,train_label,epochs=50,\
batch_size=500,validation_data=(test_data, test_label))
提示,理論上batch_size
是越大越好,最好是一次就全部輸出進去,但是計算機是不可能完全供應這種配置的,總而言之batch_size
越大,梯度下降越理想。
三 模型載入,數據預測
接下來就是與我們斷點連續
息息相關的關鍵了,它就是模型載入
。
在剛纔的訓練後我們先保存模型
#模型保存名字爲m1,地方在自己py文件同級目錄下
model_label = './m1.h5'
model.save(model_label)
模型保存好當然就載入模型
開始預測了呀
#載入本地模型
model = load_model(model_label)
開始預測test
#輸出我們預測的值,predict爲模型預測的方法,\
# 因爲我們的模型是輸出10個值,所以要用numpy的argmax方法,取10個值裏的最大的值
x_test = np.argmax(model.predict(test_data[:10]),axis=1)
print(x_test,'\n',test_label[:10])
四 斷點連續
這就是我們的關鍵了,斷點連續
,這個就相當於我們載入已經訓練好的成熟的模型
,在成熟的模型
下繼續訓練
的概念
#載入成熟的模型
model = load_model(model_label)
#模型編譯,包括優化器選擇和損失函數選擇
model.compile(optimizer='adam',\
loss='sparse_categorical_crossentropy',metrics=['acc'])
#在成熟模型基礎上,繼續編譯50次,並同時輸出預測loss和acc
model.fit(train_data,train_label,epochs=50,\
batch_size=500,validation_data=(test_data, test_label))
#保存模型
model.save(model_label)
這樣我們就做完了斷點連續
,是不是非常的簡單,其實只要理解這個概念就不難了,就像在最後的數據預測
,需要載入本地保存的模型
,斷點連續
同樣是載入本地保存的模型
,在已有的基礎上訓練。
附加整體源代碼
本代碼是基於mnist數據集
進行訓練的
import keras
import tensorflow as tf
import numpy as np
import keras.datasets.mnist as mnist
from keras import layers
from keras.models import load_model
import os
#初始模型構建
def model_nn():
model=keras.Sequential()
model.add(layers.Flatten())
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
return model
#載入數據
(train_data , train_label),(test_data , test_label) = mnist.load_data()
#載入初始模型
model = model_nn()
#模型編譯,包括優化器選擇和損失函數選擇
model.compile(optimizer='adam',\
loss='sparse_categorical_crossentropy',metrics=['acc'])
#模型編譯50次,並同時輸出預測loss和acc
model.fit(train_data,train_label,epochs=5,\
batch_size=500,validation_data=(test_data, test_label))
#模型保存名字爲m1,地方在自己py文件同級目錄下
model_label = './m2.h5'
model.save(model_label)
#載入本地模型
model = load_model(model_label)
#輸出我們預測的值,predict爲模型預測的方法,\
# 因爲我們的模型是輸出10個值,所以要用numpy的argmax方法,取10個值裏的最大的值
x_test = np.argmax(model.predict(test_data[:10]),axis=1)
print('預測的十個值:',x_test,'\n','實際的十個值:',test_label[:10])
關於mnist數據集
載入失敗的問題解決辦法
辦法一
mnist數據集
下載難免會出問題,鏈接:https://pan.baidu.com/s/17KUWe8JdQBHsAg3B4m5SNg
提取碼:wyxn (csnd上找的連接)原博客地址
將下載好的文件是mnist.npz
然後複製到這種路徑下,根據你python安裝位置而定
負責成這樣打開mnist.py
文件,註釋掉這一段就行
這樣就可以跳過下載,直接加載mnist數據集
了
方法二
把下載好的mnist.npz
文件複製到你的程序文件下,直接定義定義以下方法。我的程序是2.py
,於是我就將mnist.npz
放在我的同及目錄下
def load_data(path='mnist.npz'):
path='mnist.npz'
f = np.load(path)
x_train, y_train = f['x_train'], f['y_train']
x_test, y_test = f['x_test'], f['y_test']
f.close()
return (x_train, y_train), (x_test, y_test)
然後直接讀取數據
(train_data , train_label),(test_data , test_label) = load_data()
方法二代碼總結
import keras
import tensorflow as tf
import numpy as np
from keras import layers
from keras.models import load_model
import os
#讀取mnist數據集
def load_data(path='mnist.npz'):
path='mnist.npz'
f = np.load(path)
x_train, y_train = f['x_train'], f['y_train']
x_test, y_test = f['x_test'], f['y_test']
f.close()
return (x_train, y_train), (x_test, y_test)
#初始模型構建
def model_nn():
model=keras.Sequential()
model.add(layers.Flatten())
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(64,activation='relu'))
model.add(layers.Dense(10,activation='softmax'))
return model
#載入數據
(train_data , train_label),(test_data , test_label) = load_data()
#載入初始模型
model = model_nn()
#模型編譯,包括優化器選擇和損失函數選擇
model.compile(optimizer='adam',\
loss='sparse_categorical_crossentropy',metrics=['acc'])
#模型編譯50次,並同時輸出預測loss和acc
model.fit(train_data,train_label,epochs=5,\
batch_size=500,validation_data=(test_data, test_label))
#模型保存名字爲m1,地方在自己py文件同級目錄下
model_label = './m2.h5'
model.save(model_label)
#載入本地模型
model = load_model(model_label)
#輸出我們預測的值,predict爲模型預測的方法,\
# 因爲我們的模型是輸出10個值,所以要用numpy的argmax方法,取10個值裏的最大的值
x_test = np.argmax(model.predict(test_data[:10]),axis=1)
print('預測的十個值:',x_test,'\n','實際的十個值:',test_label[:10])