1. 程式人生 > >Keras 資料增強 ImageDataGenerator 多輸入 多輸出

Keras 資料增強 ImageDataGenerator 多輸入 多輸出

import os  
os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID"   
os.environ["CUDA_VISIBLE_DEVICES"]=""

import sys
import gc
import time
import cv2
import random
import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from tqdm import tqdm

from random_eraser import get_random_eraser
from keras.preprocessing.image import ImageDataGenerator, array_to_img, img_to_array, load_img

datagen = ImageDataGenerator(
        rotation_range=20
, #旋轉 width_shift_range=0.1, #水平位置平移 # height_shift_range=0.2, #上下位置平移 shear_range=0.5, #錯切變換,讓所有點的x座標(或者y座標)保持不變,而對應的y座標(或者x座標)則按比例發生平移 zoom_range=[0.9,0.9], # 單方向縮放,當一個數值時兩個方向等比例縮放,引數為list時長寬不同程度縮放。引數大於0小於1時,執行的是放大操作,當引數大於1時,執行的是縮小操作。 channel_shift_range = 40
, #偏移通道數值,改變圖片顏色,越大顏色越深 horizontal_flip=True, #水平翻轉,垂直翻轉vertical_flip fill_mode='nearest', #操作導致影象缺失時填充方式。“constant”、“nearest”(預設)、“reflect”和“wrap” preprocessing_function = get_random_eraser(p=0.7,v_l=0,v_h=255,s_l=0.01,s_h=0.03,r_1=1,r_2=1.5,pixel_level=True) ) # train_generator = datagen.flow_from_directory(
# 'base/Images/', # save_to_dir = 'base/fake/', # batch_size=1 # ) # for i in range(5): # train_generator.next() # ! # df_train = pd.read_csv('base/Annotations/label.csv', header=None) # df_train.columns = ['image_id', 'class', 'label'] # classes = ['collar_design_labels', 'neckline_design_labels', 'skirt_length_labels', # 'sleeve_length_labels', 'neck_design_labels', 'coat_length_labels', 'lapel_design_labels', # 'pant_length_labels'] # ! # classes = ['collar_design_labels'] # ! # for i in range(len(classes)): # gc.enable() # # 單個分類 # cur_class = classes[i] # df_load = df_train[(df_train['class'] == cur_class)].copy() # df_load.reset_index(inplace=True) # del df_load['index'] # # print(cur_class) # # 載入資料和label # n = len(df_load) # # n_class = len(df_load['label'][0]) # # width = 256 # # X = np.zeros((n,width, width, 3), dtype=np.uint8) # # y = np.zeros((n, n_class), dtype=np.uint8) # print(f'starting load trainset {cur_class} {n}') # sys.stdout.flush() # for i in tqdm(range(n)): # # tmp_label = df_load['label'][i] # img = load_img('base/{0}'.format(df_load['image_id'][i])) # x = img_to_array(img) # x = x.reshape((1,) + x.shape) # m=0 # for batch in datagen.flow(x,batch_size=1): # # plt.imshow(array_to_img(batch[0])) # # print(batch) # array_to_img(batch[0]).save(f'base/fake/{format(df_load["image_id"][i])}-{m}.jpg') # m+=1 # if m>3: # break # gc.collect() # ! img = load_img('base/Images/collar_design_labels/2f639f11de22076ead5fe1258eae024d.jpg') plt.figure() plt.imshow(img) x = img_to_array(img) x = x.reshape((1,) + x.shape) i = 0 for batch in datagen.flow(x,batch_size=5): plt.figure() plt.imshow(array_to_img(batch[0])) # print(len(batch)) i += 1 if i >0: break
#多輸入,設定隨機種子
# Define the image transformations here
gen = ImageDataGenerator(horizontal_flip = True,
                         vertical_flip = True,
                         width_shift_range = 0.1,
                         height_shift_range = 0.1,
                         zoom_range = 0.1,
                         rotation_range = 40)

# Here is the function that merges our two generators
# We use the exact same generator with the same random seed for both the y and angle arrays
def gen_flow_for_two_inputs(X1, X2, y):
    genX1 = gen.flow(X1,y,  batch_size=batch_size,seed=666)
    genX2 = gen.flow(X1,X2, batch_size=batch_size,seed=666)
    while True:
            X1i = genX1.next()
            X2i = genX2.next()
            #Assert arrays are equal - this was for peace of mind, but slows down training
            #np.testing.assert_array_equal(X1i[0],X2i[0])
            yield [X1i[0], X2i[1]], X1i[1]
#手動構造,直接輸出多label
generator = ImageDataGenerator(rotation_range=5.,
                                width_shift_range=0.1, 
                                height_shift_range=0.1, 
                                horizontal_flip=True,  
                                vertical_flip=True)

def generate_data_generator(generator, X, Y1, Y2):
    genX = generator.flow(X, seed=7)
    genY1 = generator.flow(Y1, seed=7)
    while True:
            Xi = genX.next()
            Yi1 = genY1.next()
            Yi2 = function(Y2)
            yield Xi, [Yi1, Yi2]
model.fit_generator(generate_data_generator(generator, X, Y1, Y2),
                epochs=epochs)
def batch_generator(generator,X,Y):
    Xgen = generator.flow(X)
    while True:
        yield Xgen.next(),Y
h = model.fit_generator(batch_generator(datagen, X_all, y_all), 
                            steps_per_epoch=len(X_all)//32+1,
                            epochs=80,workers=3,
                            callbacks=[EarlyStopping(patience=3), checkpointer,ReduceLROnPlateau(monitor='val_loss',factor=0.5,patience=1)], 
                            validation_data=(X_val,y_val))

相關推薦

Keras 資料增強 ImageDataGenerator 輸入 輸出

import os os.environ["CUDA_DEVICE_ORDER"]="PCI_BUS_ID" os.environ["CUDA_VISIBLE_DEVICES"]="" import sys import gc import time

”單層輸入輸出“BP神經網路(公式+c 程式碼)

上圖為本文所考慮的簡單的 單層多輸入單輸出BP神經網路。 輸入變數個數:n 隱含層神經元個數:k 輸出變數個數:1 輸入變數:x 輸出變數:y 期望輸出:t 樣本數量:m 隱含層-輸入層連線權值:ωjp 隱含層神經元偏置值:

C程式設計——從鍵盤輸入個數據,並輸出其中第二大的資料

1、注:第二大數小於最大數 2、程式 #include <stdio.h> int getmax2(int *,int); int main() { int a[99] = {0}; int count = 0; printf ("Please input

Keras中的輸入ImageDataGenerator圖片生成器

keras:2.1.2 tensorflow:1.4.0 python3.6 win7 from keras import backend as K import numpy as np from PIL import Image from kera

C++輸入資料

動機 程式設計題常用需求,比如輸入兩行資料。 解決思路:使用getline 程式 #include <iostream> #include <vector> #include <string> #include <algorithm> using na

Keras搭建輸入模型

簡介 當我們的任務涉及到多個維度不同的資料來擬合一個目標時,我們需要構建多輸入模型。 模型構建  假設我們需要搭建如下的模型,輸入資料分別為100維和50維的向量,輸出為0或1: from keras.layers import Conv1D, Dense

輸入通道和輸出通道

多輸入通道 多輸出通道: 設卷積核輸入通道,輸出通道是 ci , co,高寬為 kh , kw 為每個輸出通道分別建立 ci * kh * kw 的核陣列。在輸出通道維上連結,卷積核的形狀即為co * ci *kh*kw from mxnet import autograd,nd from

C++從鍵盤輸入資料

遇到很多筆試題不是事先留好的介面寫函式,而需要自己從鍵盤輸入多行資料。 下面是利用C++類從鍵盤獲取資料: #include <iostream> using namespace std; class Node { public: int a;

關於連續輸入資料的淺談

這裡是本鹹魚的第一篇部落格,由於被一道水題給搞的要死要活的,心態爆炸,於是去問了下大佬鼠,然後知道了不少東西,在這裡記錄一下,先粘下這個水題 再粘上鹹魚我的錯誤程式碼 #include<bits/stdc++.h> using namespace std; int main

simulink使用MATLAB function的埠出入輸出輸入輸出向量設定

1.simulink中的MATLAB function如何實現多個輸入輸出埠 解決方案:雙擊MATLAB function模組,進入其程式設計介面,定義函式 函式名為fcn,有幾個形參,simulink中的模組就會有幾個埠,輸出埠同樣。在我的測試過程中發現如果函式名不用fcn,則無法實現多個輸入輸出埠

simulink使用MATLAB function的端口出入輸出輸入輸出向量設置

模塊 語言 方案 雙擊 如何實現 顯示 定義 不用 link 1.simulink中的MATLAB function如何實現多個輸入輸出端口 解決方案:雙擊MATLAB function模塊,進入其編程界面,定義函數 函數名為fcn,有幾個形參,simulink中的模塊就

如何讓textarea中輸入行的資料在p標籤中換行?

我們在用React開發Web專案的過程中,有的時候,我們需要把textarea中輸入的多行字串,在其他的標籤中輸出來,比如p標籤。但是,往往這個時候,在p標籤中輸出的內容其預設情況下是不換行的。比如下面的程式碼: import React,{Component} from 'reac

(十)Mapper輸入源及Reduce輸出檔案

目的 Mapper多個輸入源,處理後變成一個輸出。 reduce多輸出源,根據輸出的資料,按照自己的要求來決定,輸出到不同的檔案裡。 案例 有以下兩個檔案,作為輸入源(Mapper處理) 最後把每個人的成績列印到不同的檔案裡(Reduce處理) tom math 90 e

打鐵就女裝(1) C 如何輸入資料

while(~scanf("%d",&A)) ~ 是按位取反運算子,屬於單目運算子 通過這樣這樣也可以獲取多組資料 while(scanf("%d",&A)!=EOF) 這種方式通過檔案結束標誌完成資料的連續輸入 但是這種方法有一個弊端 當輸入為字

keras 自定義ImageDataGenerator用於標籤分類

感想 keras提供了flow_from_directory用於單個標籤分類,但是對圖片的多標籤分類沒有支援,這就需要我們自己動手實現ImageDataGenerator,我這裡把我實現的用於多標籤分類的自定義DataGenerator分享出來,讀者可以根據自己的情況來進行修改。 資料集

python實現一行輸入個值和一行輸出個值

注:以下內容在python3中操作 一. 一行輸入多個值 a,b = input().split() #此時得到的a和b的型別均為字串,以空格為分隔符 a,b = input().split(',') #此時得到的a和b的型別均為字串,以逗號為分隔符 具體操作如下: a,

ACM連續輸入資料問題

一直對這個不太熟悉,故拿出一些簡單題目進行練習,現在清楚了很多 假設每次要輸入4個數 自己常犯錯誤 用while (true){  在這裡實現輸入4個數並做後續處理  },這個明顯是死迴圈,程式不會結

用java語言做hdu題目之輸入資料的方法

如果你在做hdu 1073,hdu 1075就會發現這個問題。 嘿嘿!這是給新手看的,,,畢竟這題讓我太糾結了,wa了不知道多少次了,心都塞了。 後來我發現是我的輸入方式不對,大家可以對比輸入的資料,當然前面兩題我都發在部落格裡了,可以在搜尋欄搜尋到。 錯誤的輸入: 錯誤

C語言輸入資料------“~”與 “EOF”的抉擇

while(~scanf("%d",&A)) 通過這樣這樣也可以獲取多組資料 ~ 是按位取反運算子,屬於單目運算子的一種 自己昨天寫的第一篇文章中小小地記錄了一下用EOF如何輸入多組資料 EOF,C語言輸入多組資料 我們也都知道其中whi