久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Keras數據集加載小結

 行走在理想邊緣 2022-05-20 發(fā)布于四川

對于keras加載訓練數據,,官方上沒有詳說,。然而網上查各種資料,寫法太多,,通過自己跑代碼測試總結以下幾條,,方便自己以后使用。

總的來說keras模型加載數據主要有三種方式:.fit(), .fit_generator()和.train_on_batch(),。

1.fit():

上函數,,各個參數的意義就不解釋了

fit(x=None, y=None, batch_size=None, epochs=1, verbose=1, callbacks=None, validation_split=0.0, validation_data=None, shuffle=True, class_weight=None, sample_weight=None, initial_epoch=0, steps_per_epoch=None, validation_steps=None)

Copy

從官方文檔中可以看出,fit()是需要先把整個數據集加載進來,,然后喂入網絡,,因為minist數據集比較小,這么做是可行的,,但對于實際開發(fā)而言,,這么做是不可行的,需要大量的內存資源,,同時不能對數據進行在線提升,。

一次性加載整個數據集的示例代碼:

任務為貓和狗的二分類,train_data下包含cat和dog兩個文件夾,代碼將兩個文件夾下圖片和標簽存入numpy數組,,返回為訓練數據和訓練標簽,。

  1. def load_data():
  2. tran_imags = []
  3. labels = []
  4. seq_names = ['cat','dog']
  5. for seq_name in seq_names:
  6. frames = sorted(os.listdir(os.path.join(root_path,'data','train_data', seq_name)))
  7. for frame in frames:
  8. imgs = [os.path.join(root_path, 'data', 'train_data', seq_name, frame)]
  9. imgs = np.array(Image.open(imgs[0]))
  10. tran_imags.append(imgs)
  11. if seq_name=='cat':
  12. labels.append(0)
  13. else:
  14. labels.append(1)
  15. return np.array(tran_imags), np.array(labels)
  16. ##
  17. train_data,train_labs = load_data()
  18. model.fit(train_data,keras.utils.to_categorical(train_labs),batch_size=32,epochs=50,verbose=1)

Copy

2.fit_generator()

fit_generator()需要將數據集和標簽寫成生成器格式

fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)

Copy

1).從txt文件讀取圖片路徑的生成器,不進行數據增強

以下代碼從給定路徑的txt文本中循環(huán)讀取圖片路徑,,每次讀取一個batch_size的圖片,,并存入numpy數組返回。其中,,當讀到文本末尾時,,將指針指向文件第一行。

  1. def generate_array_from_txt(path, batch_size,num_class):
  2. with open(path) as f:
  3. while True:
  4. imgs = []
  5. labs = np.zeros(shape=(batch_size,num_class))
  6. i = 0
  7. while len(imgs) < batch_size:
  8. line = f.readline()
  9. if not line:
  10. f.seek(0)
  11. line = f.readline()
  12. img_path = line.split(' ')[0]
  13. lab = line.split(' ')[1]
  14. img = np.array(Image.open(os.path.join('./',img_path)))
  15. lab = keras.utils.to_categorical(int(lab)-1,num_classes=num_class)
  16. imgs.append(img)
  17. labs[i] = lab
  18. i = i +1
  19. yield (np.array(imgs),labs)
  20. ##使用如下
  21. gen = generate_arrays_from_txt(txt_path,batch_size,num_class)
  22. model.fit_generator(gen,steps_per_epoch=N, epochs=EPOCN)
  23. ## 因為生成器是無限生成數據,,所以它不知道一輪要訓練多少圖片,,所以steps_per_epoch為數據集的總數除以batch_size。

Copy

我的txt文本格式如下:前面是圖片路徑,,后面是類別標簽,,因為從1開始的,所以to_categorical 里面減了1.

2).使用.flow_from_directory(directory)

使用ImageDataGenerator類,,ImageDataGenerator類有.flow()與.flow_from_directory(directory)兩個加載數據的方法,,個人認為第一個偏向于先將數據全部加載(看過的示例代碼都是這樣的),第二個從圖片目錄利用生成器返回數據,。

2.1 用于分類網絡,,返回圖像以及標簽

  1. ## 聲明一個ImageDataGenerator類對象,并給出你需要進行的數據增強選項
  2. train_datagen = ImageDataGenerator(
  3. rescale=1./255,
  4. shear_range=0.2,
  5. zoom_range=0.2,
  6. horizontal_flip=True)
  7. ##調用.flow_from_director()方法,,第一個為數據集路徑,。生成數據集及標簽
  8. train_generator = train_datagen.flow_from_directory(
  9. './data/train_data',
  10. target_size=(224, 224),
  11. batch_size=32,
  12. class_mode='categorical')
  13. ##
  14. model.fit_generator(train_generator,steps_per_epoch=N, epochs=EPOCH)

Copy

我的數據集目錄結構如下:

2.2 用于pix2pix

當用于圖像分割、超分辨率重建等需要像素對應像素的任務時,,標簽也為圖片(單通道或多通道),。 示例:加載用于圖像分割的圖像與mask,mask為單通道灰度圖像,目標為白色,,其余背景為黑色,。

  1. # 分別定義兩個ImageDataGenerator對象
  2. image_datagen = ImageDataGenerator(featurewise_center=True,
  3. featurewise_std_normalization=True,
  4. rescale= 1./255)
  5. mask_datagen = ImageDataGenerator(rescale= 1./255)

  6. seed = 1
  7. #訓練圖片路徑
  8. image_generator = image_datagen.flow_from_directory(
  9. 'data/data_seg/davis_train',
  10. class_mode=None,
  11. seed=seed)
  12. # 指定mask
  13. mask_generator = mask_datagen.flow_from_directory(
  14. 'data/data_seg/davis_label',
  15. class_mode=None,
  16. color_mode = 'grayscale'
  17. seed=seed)
  18. # 將以上兩個生成器合為一個
  19. train_generator = zip(image_generator, mask_generator)
  20. #
  21. model.fit_generator(
  22. train_generator,
  23. steps_per_epoch=STEPS_NUM,
  24. epochs=EPOCHS)

Copy

對于標簽為圖像的數據,當用這種方式加載的時候,,需將class_mode指定為None,表示不返回標簽,。對于訓練圖片和標簽要保證順序不變,一一對應,,名字可不同

需要將兩個生成器的seed指定為相同的數字,,此時兩個生成器返回的圖片對就一一對應

3) 使用flow(x, y=None)

使用.flow()時,需要將訓練數據加載到內存中,,每次填充一個Batch_size的數據進網絡

  1. train_data, train_labs = load_data()
  2. dataGenerator = ImageDataGenerator(
  3. preprocessing_function=normalize)
  4. gen = dataGenerator.flow(train_data, train_labs, batch_size=8)
  5. model.fit_generator(gen)

Copy

4) 使用.flow_from_dataframe()

dataframe中保存的是圖片名字和label

  1. import pandas as pd
  2. df=pd.read_csv(r".\train.csv")
  3. datagen=ImageDataGenerator(rescale=1./255)
  4. train_generator=datagen.flow_from_dataframe(dataframe=df, directory=".\train_imgs", x_col="id", y_col="label", class_mode="categorical", target_size=(32,32), batch_size=32)

Copy

3.train_on_batch()

類似于TensorFlow的數據填充了,,一次喂一個batch_size的數據,。

train_on_batch(x, y, sample_weight=None, class_weight=None)

Copy

采用2.2中的生成器例子

  1. train_generator = zip(image_generator, mask_generator)
  2. steps = len(train_generator)/ batch_size * EPOCH
  3. step = 0
  4. for train_batch, label_batch in train_generator:
  5. if step == steps:
  6. break
  7. step += 1
  8. train_on_batch(train_batch, label_batch, sample_weight=None, class_weight=None)

Copy

4.對生成器返回數據進行處理

使用生成器時,如果需要對圖片進行一定的處理,,可以在ImageDataGenerator中定義預處理函數,,但是要求返回的shape不能改變。 如果要對圖片的shape進行改變,,可將生成器返回結果再次包裝為生成器,,如下例:

  1. # 實例化ImageDataGenerator,同時指定預處理函數
  2. datagen = ImageDataGenerator(
  3. preprocessing_function=normalize)

  4. # 定義生成器,,每次從datagen中取出一個Batch,,然后對數據進行自己的操作
  5. def image_a_b_gen(data_path):
  6. for batch in datagen.flow_from_directory(data_path,
  7. target_size=(768, 1024),
  8. color_mode='rgb',
  9. class_mode=None,
  10. batch_size=batch_size,
  11. shuffle=True):
  12. lab_batch = rgb2lab(batch)
  13. X_batch = lab_batch[:, :, :, 0]
  14. Y_batch = lab_batch[:, :, :, 1:] / 128
  15. yield (np.expand_dims(X_batch, axis=3), Y_batch)

原帖:http:///post/keras_dataload/ 

    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內容中的聯(lián)系方式,、誘導購買等信息,,謹防詐騙。如發(fā)現有害或侵權內容,,請點擊一鍵舉報,。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多