1. 程式人生 > >Keras:自建資料集影象分類的模型訓練、儲存與恢復

Keras:自建資料集影象分類的模型訓練、儲存與恢復

資料擴增

在資料集中的資料不多的情況下,可以使用圖片生成器ImageDataGenerator用來生成一個batch的影象資料,進行資料擴增.

示例:

#!/usr/bin/python
# coding:utf8

from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img
datagen = ImageDataGenerator(rotation_range=40,
                             width_shift_range=0.2
, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True, fill_mode='nearest') img = load_img('/image/panda.jpg') x = img_to_array(img) x = x.reshape((1
,)+x.shape) i = 0 for batch in datagen.flow(x, batch_size=1, save_to_dir='/train/1/', save_prefix='pandas', save_format='jpg'): i += 1 if i>60: break

輸出:
這裡寫圖片描述

模型的訓練、儲存與恢復

將擴增之後的圖片資料集按類分為訓練集驗證集.
圖片資料放置形式:

train\
      0\
        dog_0_1.jpg
        dog_0_2.jpg
        dog_0_3.jpg
        ...
1\ panda_0_1.jpg panda_0_2.jpg panda_0_3.jpg ... validation\ 0\ dog_0_1.jpg dog_0_2.jpg dog_0_3.jpg ... 1\ panda_0_1.jpg panda_0_2.jpg panda_0_3.jpg ...

訓練模型並儲存模型(分別儲存整個模型、儲存模型權重、儲存模型結構).
示例:

#!/usr/bin/python
# coding:utf8

from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dropout, Flatten, Dense
from keras.preprocessing.image import ImageDataGenerator
# 建立模型
model = Sequential()
model.add(Conv2D(32, 3, activation='relu', input_shape=(150,150,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
# 編譯
model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

train_datagen = ImageDataGenerator(rescale=1./255,
                                   shear_range=0.2,
                                   zoom_range=0.2,
                                   horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1./255)
# 從圖片中直接產生資料和標籤
train_generator = train_datagen.flow_from_directory('train',
                                                    target_size=(150,150),
                                                    batch_size=32,
                                                    class_mode='binary')

validation_generator = test_datagen.flow_from_directory('validation',
                                                        target_size=(150,150),
                                                        batch_size=32,
                                                        class_mode='binary')
model.fit_generator(train_generator,
                    steps_per_epoch=1000,
                    epochs=60,
                    validation_data=validation_generator,
                    validation_steps=200)
# 儲存整個模型
model.save('model.hdf5')

# 儲存模型的權重
model.save_weights('model_weights.h5')

# 儲存模型的結構
json_string = model.to_json()
open('model_to_json.json','w').write(json_string)
yaml_string = model.to_yaml()
open('model_to_yaml.yaml','w').write(json_string)

儲存完整模型

通過model.save()將模型和權重儲存在一個.hdf5檔案中.

model.save('model/model.hdf5')

完整模型的恢復

通過keras.models.load_model()可以將模型重新例項化.

示例:

#!/usr/bin/python
# coding:utf8

from keras.models import load_model
import numpy as np
from keras.preprocessing import image
from keras.preprocessing.image import load_img

# 載入權重
model = load_model('model.hdf5')

# 載入影象
img = load_img('pandas_0_96.jpg',target_size=(150, 150))
img = image.img_to_array(img) / 255.0
img = np.expand_dims(img, axis=0)

predictions = model.predict(img)
print (predictions)

輸出:

[[0.9967361]]

儲存模型權重

通過model.save_weights()可以將模型的權重儲存到指定路徑下的.h5檔案中.

model.save_weights('model/model_weights.h5')

模型權重的恢復

首先建立對應模型,然後通過model.load_weights()從.hdf5檔案中載入到當前模型.
如果想將權過載入不同的模型(有些層相同)中,則設定by_name=True,只有名字匹配的層才會載入權重.

示例:

#!/usr/bin/python
# coding:utf8

from keras.preprocessing.image import load_img
from keras.models import Sequential
from keras.layers import Conv2D, MaxPooling2D
from keras.layers import Dropout, Flatten, Dense
import numpy as np
from keras.preprocessing import image

# 建立模型
model = Sequential()
model.add(Conv2D(32, 3, activation='relu', input_shape=(150,150,3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='rmsprop', metrics=['accuracy'])

# 載入權重
classifier = model.load_weights('model_weights.h5')

# 載入影象
img = load_img('pandas_0_96.jpg',target_size=(150, 150))
img = image.img_to_array(img) / 255.0
img = np.expand_dims(img, axis=0)
predictions = model.predict(img)
print (predictions)

輸出:

[[0.9967361]]

儲存模型結構

通過model.to_json()或model.to_yaml(),返回代表模型的JSON字串,僅包含網路結構,不包含權值.這樣可以把模型序列化為json或yaml檔案,然後儲存到本地.
儲存為json檔案:

json_string = model.to_json()
open('model_to_json.json','w').write(json_string)

儲存為yaml檔案:

yaml_string = model.to_yaml()
open('model_to_yaml.yaml','w').write(json_string)

模型結構的恢復

通過model.to_json或model.to_yaml可以從JSON字串或YAML字串中重構原模型.
JSON字串或YAML字串可以通過open(filepath).read()從對應的json檔案或yaml檔案中讀取.

示例:

from keras.models import model_from_yaml
yaml_string = open('model_to_yaml.yaml').read()
model = model_from_yaml(yaml_string)
# 打印出模型
model.summary()

打印出模型概況:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_1 (Conv2D)            (None, 148, 148, 32)      896       
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 74, 74, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 72, 72, 32)        9248      
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 36, 36, 32)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 34, 34, 64)        18496     
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 17, 17, 64)        0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 18496)             0         
_________________________________________________________________
dense_1 (Dense)              (None, 64)                1183808   
_________________________________________________________________
dropout_1 (Dropout)          (None, 64)                0         
_________________________________________________________________
dense_2 (Dense)              (None, 1)                 65        
=================================================================
Total params: 1,212,513
Trainable params: 1,212,513
Non-trainable params: 0
_________________________________________________________________

dog:
這裡寫圖片描述
panda:
這裡寫圖片描述

Keras版本:2.1.5

參考:

相關推薦

Keras資料影象分類模型訓練儲存恢復

資料擴增 在資料集中的資料不多的情況下,可以使用圖片生成器ImageDataGenerator用來生成一個batch的影象資料,進行資料擴增. 示例: #!/usr/bin/python # coding:utf8 from keras.prepro

Windows下mnist資料caffemodel分類模型訓練及測試

1. MNIST資料集介紹 MNIST是一個手寫數字資料庫,樣本收集的是美國中學生手寫樣本,比較符合實際情況,大體上樣本是這樣的: MNIST資料庫有以下特性: 包含了60000個訓練樣本集和

caffe練習例項(4)——caffe實現caltech101資料影象分類

1.準備資料集 caltech101(101類影象資料庫)資料集 資料集地址: http://www.vision.caltech.edu/Image_Datasets/Caltech101/Calt

我的Keras使用總結(2)——構建影象分類模型(針對小資料

  Keras基本的使用都已經清楚了,那麼這篇主要學習如何使用Keras進行訓練模型,訓練訓練,主要就是“練”,所以多做幾個案例就知道怎麼做了。   在本文中,我們將提供一些面向小資料集(幾百張到幾千張圖片)構造高效,實用的影象分類器的方法。 1,熱身練習——CIFAR10 小圖片分類示例(Sequentia

keras RNNLSTM對IMDB資料進行分類

本文介紹如何基於keras採用RNN和LSTM對IMDB資料集進行分類。 示例程式碼: from keras.layers import SimpleRNN from keras.models import Sequential from keras.layers import Embedd

keras對貓資料進行分類(三)

使用已訓練模型對貓狗圖片進行測試,以及視覺化模型訓練過程。 示例程式碼: # # 視覺化卷積神經網路 # # 人們常說,深度學習模型是“黑盒子”,學習表示難以提取並以人類可讀的形式呈現。 # 雖然對於某些型別的深度學習模型來說這是部分正確的,但對於小行星來說絕對不是這樣。 # 由con

ML之預測以某個資料為例從0到1深入理解科學預測之分類問題的思路框架

ML之預測:以某個資料集為例從0到1深入理解科學預測之分類問題的思路框架 總體思路設計框架         1、獲取資料集,並確定新資料集的規模 資料集規模為(208*61) 2、確定資料集每個屬性的型別 &

sklearn 學習實踐之——基於資料(波士頓房價鳶尾花糖尿病等)構建分類迴歸模型

      只要是接觸機器學習的,很少有沒聽過sklearn的,這個真的可以稱得上是機器學習快速進行的神器了,在研究生的時候搭建常用的機器學習模型用的就是sklearn,今天應部門的一些需求,簡單的總結了一點使用方法,後面還會繼續更新,今天僅使用sklearn自帶的資料

使用Keras建立神經網路對資料MNIST分類

0. 環境 Ubuntu 18.04,64bit,i3-6100,8G Python 2.7 1. 例程所需檔案 │  keras_mnist.py │   ├─mldata │      mnist-original.mat │       └─output

CNN-中文文字分類-開源專案-定義資料

最近參加學校的一個數據分析比賽,因為自己前面自學了一些基本的機器學習演算法,但其實還處於入門階段,便參加了。選擇了一道中文文字分類的題目。 今日頭條使用者畫像 選題背景: 隨著機器創作能力越來越強,今後社會媒體上將會產生越來越多的機器創作者自動生產的內容。有效

TensorFlow深度學習實戰(一)AlexNet對MNIST資料進行分類

概要 進來一段時間在看深度學習中經典的CNN模型相關論文。同時,為了督促自己學習TensorFlow,通讀論文之後開始,利用TensorFlow實現各個模型,復現相關實驗。這是第一篇論文講解的是AlexNet,論文下載網址為:ImageNet Classific

資料預處理原始資料快速分類的方法,numpy的使用技巧,資料的row=mask的column

問題 假如資料集有3類,怎麼把一個龐大的陣列集3類,放在不同的數組裡。 分析 首先龐大資料集分類,肯定不能一個一個遍歷,而且強烈避免個人的操作,需要藉助於numpy處理。 示例 資料集,可以看出資料集為3類,我們要x也分成3類 x = [[1,2],[2,9],[3,

UFLDL向量化程式設計練習用MNIST資料的稀疏編碼器訓練實現

     折騰了兩天,總算實現了用MNIST資料集的稀疏自編碼器訓練。發現了以下問題:      1,matlab程式設計所寫程式碼不能太奢侈。定義變數時要儘量節省記憶體資源,向量能解決的不要用方陣,int8型別能解決的不要用雙精度數;      2,UFLDL提供的min

DL之NN(sklearn資料為1797個樣本*64個特徵)利用NN之sklearnNeuralNetwor.py實現手寫數字圖片識別95%準確率

先檢視sklearn自帶digits手寫資料集(1797*64)import numpy as np from sklearn.datasets import load_digits from skl

Spark 機器學習實踐 Iris資料分類

今天試用了一下Spark的機器學習,體驗如下: 第一步,匯入資料 我們使用Iris資料集,做一個分類,首先要把csv檔案匯入。這裡用到了spark的csv包,不明白為什麼這麼常見的功能不是內建的,還需要額外載入。 --packages com.databricks:spar

Tensorflow2 定義資料圖片完成圖片分類任務

對於自定義資料集的圖片任務,通用流程一般分為以下幾個步驟: - Load data - Train-Val-Test - Build model - Transfer Learning 其中大部分精力會花在資料的準備和預處理上,本文用一種較為通用的資料處理手段,並通過手動構建,簡單模型, 層數較深的

雲HBase小組成功搶救某公司HBase群,挽救30+T數據

HBase摘要: 使用過開源HBase的人都知道,運維HBase是多麽復雜的事情,集群大的時候,讀寫壓力大,配置稍微不合理一點,就可能會出現集群狀態不一致的情況,糟糕一點的直接導致入庫、查詢某個業務表不可用, 甚至集群運行不了。 概述 使用過開源HBase的人都知道,運維HBase是多麽復雜的事情,集群大的時

每天學點SpringCloud(三)定義Eureka群負載均衡策略

log util domain 避免 can val 如果 dba filters 相信看了 每天學點SpringCloud(一):簡單服務提供者消費者調用,每天學點SpringCloud(二):服務註冊與發現Eureka這兩篇的同學都了解到了我的套路,沒錯,本篇博客同樣是

notMNIST 資料pyTorch分類

notMNIST資料集分類 簡介 notMNIST資料集 是於2011公佈的,可以認為是MNIST資料集地一個加強版本。資料集包含了從A到J十個字母,由large與small兩個子集組成。其中samll資料集是經過手工清理的,包含19k個圖片,誤分類率越為0.5%,large資料集是未經過手工清理的,包含

Keras 多工實現,Multi Loss #########Keras Xception Multi loss 細粒度影象分類

這裡只摘取關鍵程式碼: # create the base pre-trained model input_tensor = Input(shape=(299, 299, 3)) base_model = Xception(include_top=True, weights='imagenet'