使用Keras中的ImageDataGenerator進(jìn)行批次讀圖方式
ImageDataGenerator位于keras.preprocessing.image模塊當(dāng)中,可用于做數(shù)據(jù)增強(qiáng),或者僅僅用于一個批次一個批次的讀進(jìn)圖片數(shù)據(jù).一開始以為ImageDataGenerator是用來做數(shù)據(jù)增強(qiáng)的,但我的目的只是想一個batch一個batch的讀進(jìn)圖片而已,所以一開始沒用它,后來發(fā)現(xiàn)它是有這個功能的,而且使用起來很方便.
ImageDataGenerator類包含了如下參數(shù):(keras中文教程)
ImageDataGenerator(featurewise_center=False, #布爾值。將輸入數(shù)據(jù)的均值設(shè)置為 0,逐特征進(jìn)行
samplewise_center=False, #布爾值。將每個樣本的均值設(shè)置為 0
featurewise_std_normalization=False, #布爾值。將輸入除以數(shù)據(jù)標(biāo)準(zhǔn)差,逐特征進(jìn)行
samplewise_std_normalization=False, #布爾值。將每個輸入除以其標(biāo)準(zhǔn)差
zca_whitening=False, #是否進(jìn)行ZAC白化
zca_epsilon=1e-06, #ZCA 白化的 epsilon 值
rotation_range=0, #整數(shù)。隨機(jī)旋轉(zhuǎn)的度數(shù)范圍
width_shift_range=0.0,
height_shift_range=0.0,
brightness_range=None,
shear_range=0.0, #浮點數(shù)。剪切強(qiáng)度(以弧度逆時針方向剪切角度)
zoom_range=0.0, #浮點數(shù) 或 [lower, upper]。隨機(jī)縮放范圍。如果是浮點數(shù),[lower, upper] = [1-zoom_range, 1+zoom_range]。
channel_shift_range=0.0, #浮點數(shù)。隨機(jī)通道轉(zhuǎn)換的范圍
fill_mode='nearest', #輸入邊界以外的點的模式填充
cval=0.0, #當(dāng) fill_mode = "constant",邊界點的填充值
horizontal_flip=False, #隨機(jī)水平翻轉(zhuǎn)
vertical_flip=False, #隨機(jī)垂直翻
rescale=None, #默認(rèn)為 None。如果是 None 或 0,不進(jìn)行縮放,否則將數(shù)據(jù)乘以所提供的值(在應(yīng)用任何其他轉(zhuǎn)換之前)
preprocessing_function=None, #應(yīng)用于每個輸入的函數(shù)。這個函數(shù)會在任何其他改變之前運(yùn)行。這個函數(shù)需要一個參數(shù):一張圖像(秩為 3 的 Numpy 張量),并且應(yīng)該輸出一個同尺寸的 Numpy 張量。
data_format=None, #圖像數(shù)據(jù)格式,{"channels_first", "channels_last"} 之一
validation_split=0.0,
dtype=None) #生成數(shù)組使用的數(shù)據(jù)類型
雖然包含了很多參數(shù),但實際應(yīng)用時用到的并不會很多,假設(shè)我的目的只是一個batch一個batch的讀進(jìn)圖片,那么,我在實例化對象的時候什么參數(shù)都不需要設(shè)置,然后再調(diào)用ImageDataGenerator類的成員函數(shù)flow_from_directory()就可以從目錄中讀圖.
我放圖片的目錄如下圖,在train文件夾中包含了兩個子文件夾,然后在兩個子文件夾里面分別包含了貓和狗的圖片.

先看看flow_from_directory()的參數(shù).需要注意的是,第一個參數(shù)directory不是圖片的路徑,而是子文件夾的路徑,還有就是第四個參數(shù)classes,它填寫是子文件夾的名稱,比如此處的為['cat', 'dog'],然后該函數(shù)就會自動把兩個子文件夾看成是2個類別,cat文件夾里面所有圖片的標(biāo)簽都為0,dog文件夾里面所有圖片的標(biāo)簽都為1.而且可以通過設(shè)置第5個參數(shù)class_mode把標(biāo)簽設(shè)置為ont-hot形式(默認(rèn)的categorical就是one-hot 形式).可以看出,這個函數(shù)有多方便,直接把標(biāo)簽和原圖對應(yīng)起來了.
def flow_from_directory(self, directory, #子文件夾所在的目錄 target_size=(256, 256), #輸出的圖片的尺寸 color_mode='rgb', #單通道還是三通道 classes=None, #類別,有多少個子文件夾就有多少個類別,填寫的是子文件夾的名稱 class_mode='categorical', #通常默認(rèn),表示標(biāo)簽采用one-hot形式, batch_size=32, shuffle=True, #是否隨機(jī)打亂順序 seed=None, save_to_dir=None, #把圖片保存,輸入的是路徑 save_prefix='', #圖像前綴名, save_format='png', #圖像后綴名 follow_links=False, subset=None, interpolation='nearest')
接下來看一個例子,部分代碼.
from tensorflow.keras.preprocessing.image import ImageDataGenerator #我是直接裝tensorflow,然后使用里面的keras的, #實例化對象datagen datagen=ImageDataGenerator() #讀訓(xùn)練集圖片 train_generator = datagen.flow_from_directory( '/home/hky/folder/kaggle/DataGenerator/train', classes=['cat','dog'], target_size=(227, 227), class_mode='categorical', batch_size=batch_size) #讀驗證集圖片 validation_generator = datagen.flow_from_directory( '/home/hky/folder/kaggle/DataGenerator/validation', classes=['cat','dog'], target_size=(227, 227), class_mode='categorical', batch_size=batch_size) '''開始訓(xùn)練''' #steps_per_epoch是為了判斷是否完成了一個epoch,這里我訓(xùn)練集有20000張圖片,然后batch_size=16,所以是10000/16 #同樣,validation_steps=2496/16是因為我的驗證集有2496張圖片 model.fit_generator(generator=train_generator,steps_per_epoch=20000/16,epochs=10,validation_data=validation_generator,validation_steps=2496/16)
下面是完整代碼,實現(xiàn)了一個AlexNet模型.
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing import image
from tensorflow.keras.callbacks import EarlyStopping
from tensorflow.keras import optimizers
from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
import cv2
import yaml
from tensorflow.keras.models import model_from_yaml
batch_size = 16
''' 搭建模型'''
l=tf.keras.layers
model=Sequential()
#第一層卷積和池化
model.add(l.Conv2D(filters=96,kernel_size=(11,11),strides=(4,4),padding='valid',input_shape=(227,227,3),activation='relu'))
model.add(l.BatchNormalization())
model.add(l.MaxPooling2D(pool_size=(3,3),strides=(2,2),padding='valid'))
#第二層卷積和池化
model.add(l.Conv2D(256,(5,5),(1,1),padding='same',activation='relu'))
model.add(l.BatchNormalization())
model.add(l.MaxPooling2D((3,3),(2,2),padding='valid'))
#第三層卷積
model.add(l.Conv2D(384,(3,3),(1,1),'same',activation='relu'))
#第四層卷積
model.add(l.Conv2D(384,(3,3),(1,1),'same',activation='relu'))
#第五層卷積和池化
model.add(l.Conv2D(256,(3,3),(1,1),'same',activation='relu'))
model.add(l.MaxPooling2D((3,3),(2,2),'valid'))
#全連接層
model.add(l.Flatten())
model.add(l.Dense(4096,activation='relu'))
model.add(l.Dropout(0.5))
model.add(l.Dense(4096,activation='relu'))
model.add(l.Dropout(0.5))
model.add(l.Dense(1000,activation='relu'))
model.add(l.Dropout(0.5))
#輸出層
model.add(l.Dense(2,activation='softmax'))
model.compile(optimizer='sgd',loss='categorical_crossentropy',metrics=['accuracy'])
'''導(dǎo)入圖片數(shù)據(jù)'''
#利用ImageDataGenerator生成一個batch一個batch的數(shù)據(jù)
datagen=ImageDataGenerator(samplewise_center=True,rescale=1.0/255) #samplewise_center:使輸入數(shù)據(jù)的每個樣本均值為0,rescale:歸一化
train_generator = datagen.flow_from_directory(
'/home/hky/folder/kaggle/DataGenerator/train',
classes=['cat','dog'],
target_size=(227, 227),
class_mode='categorical',
batch_size=batch_size)
validation_generator = datagen.flow_from_directory(
'/home/hky/folder/kaggle/DataGenerator/validation',
classes=['cat','dog'],
target_size=(227, 227),
class_mode='categorical',
batch_size=batch_size)
'''開始訓(xùn)練'''
model.fit_generator(generator=train_generator,steps_per_epoch=20000/16,epochs=10,validation_data=validation_generator,validation_steps=2496/16)
yaml_string = model.to_yaml() # 保存模型結(jié)構(gòu)到y(tǒng)aml文件
open('./model_architecture.yaml', 'w').write(yaml_string)
model.save_weights('./AlexNet_model.h5') #保存模型參數(shù)
'''導(dǎo)入模型'''
#model = model_from_yaml(open('./model_architecture.yaml').read())
#model.load_weights('./AlexNet_model.h5')
'''隨便輸入一張圖片測試一下'''
imgs=[]
img=cv2.imread('/home/hky/folder/kaggle/test/120.jpg')
img=cv2.resize(img,(227,227))
imgs.append(img)
a=np.array(imgs)
result=model.predict(a)
idx=np.argmax(result)
if idx==0:
print('the image is cat\n')
else:
print('the image is dog\n')
cv2.imshow("image",img)
cv2.waitKey(0)
以上這篇使用Keras中的ImageDataGenerator進(jìn)行批次讀圖方式就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
在Tensorflow中實現(xiàn)leakyRelu操作詳解(高效)
這篇文章主要介紹了在Tensorflow中實現(xiàn)leakyRelu操作詳解(高效),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-06-06
解析pandas apply() 函數(shù)用法(推薦)
這篇文章主要介紹了pandas apply() 函數(shù)用法,大家需要掌握函數(shù)作為一個對象,能作為參數(shù)傳遞給其它函數(shù),也能作為函數(shù)的返回值,具體內(nèi)容詳情跟隨小編一起看看吧2021-10-10
基于Python pyecharts實現(xiàn)多種圖例代碼解析
這篇文章主要介紹了基于Python pyecharts實現(xiàn)多種圖例代碼解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-08-08
django實現(xiàn)圖片上傳數(shù)據(jù)庫并顯示
這篇文章主要為大家詳細(xì)介紹了django實現(xiàn)圖片上傳數(shù)據(jù)庫并顯示,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08
Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的廣度優(yōu)先與深度優(yōu)先搜索算法示例
這篇文章主要介紹了Python數(shù)據(jù)結(jié)構(gòu)與算法之圖的廣度優(yōu)先與深度優(yōu)先搜索算法,結(jié)合實例形式分析了圖的廣度優(yōu)先與深度優(yōu)先搜索算法原理與相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2017-12-12
python實現(xiàn)批量轉(zhuǎn)換文件編碼(批轉(zhuǎn)換編碼示例)
這篇文章主要介紹了python實現(xiàn)批量轉(zhuǎn)換文件編碼示例,指定文件編碼、目錄或擴(kuò)展名即可進(jìn)行轉(zhuǎn)換,大家參考使用吧2014-01-01

