keras基礎學習,與keras斷點連續,minst數據集加載失敗問題

**

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
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])
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章