Keras fit_generator принимает размер изображения как batch_size - PullRequest
1 голос
/ 09 октября 2019

Я пытаюсь обучить мою реализацию enet на простом тесте. Для этой задачи я написал генератор (унаследованный от keras.utils.Sequence).

Но когда я начинаю тренироваться, модель keras всегда принимает высоту изображения как размер пакета.

Я уже написал генератор similair для других наборов данных, и у меня не было этой проблемы, даже если выходные значения обоих одинаковы.

edit : Iобнаружил некоторые ошибки в коде моего генератора и исправил их, но они все еще присутствуют в приведенном ниже коде, однако они не влияют на проблему с размером пакета

import tensorflow as tf
import json
import numpy as np
import cv2
class tusimple_gen(tf.keras.utils.Sequence):
    def __init__(self, batch_size,shape=(720,1280), filepath='../culane/', start=0, end=1):
        self.batch_size = batch_size
        self.filepath = filepath

        self.json = [json.loads(line) for line in open(self.filepath+'label_data_0313.json')]

        s = int(start*len(self.json))
        e = int(end*len(self.json))
        self.json = self.json[s:e]
        self.shape = shape

    def __len__(self):
        return len(self.json) // self.batch_size


    def get_item(self, idx):
        gt = self.json[idx]
        gt_lanes = gt['lanes']
        y_samples = gt['h_samples']
        raw_file = self.filepath + gt['raw_file']

        x = cv2.imread(raw_file, -1)
        x = x/255

        gt_lanes_vis = [[(x,y) for (x,y) in zip(lane,y_samples) if x>=0] for lane in gt_lanes]
        y = np.zeros((x.shape[0],x.shape[1],5))
        y_5 = np.ones((x.shape[0],x.shape[1]))
        y[:,:,4] = y_5

        for i,lane in enumerate(gt_lanes_vis):            
            lane_im = cv2.polylines(np.zeros_like(y[:,:,0]), np.int32([lane]), isClosed=False, color=(255,255,255), thickness=10)
            y[:,:,i] = lane_im
            y[:,:,4] = y[:,:,4] - lane_im




        if self.shape[:2] != x.shape[:2]:
            x = cv2.resize(x,(self.shape[1],self.shape[0] ))
            y = cv2.resize(y,(self.shape[1],self.shape[0] ))

        return (x,y)

    def __getitem__(self, idx):
        x_ret = np.zeros((self.batch_size, self.shape[0],self.shape[1],3))
        y_ret = np.zeros((self.batch_size, self.shape[0],self.shape[1],5))

        for i in range(self.batch_size):
            x,y = self.get_item(i)
            x_ret[i,:,:,:] = x
            y_ret[i,:,:,:] = y

        return (x_ret,y_ret)

Фактический обучающий код:

WIDTH = 1280//2
HEIGHT = 720//2

gen_train = tusimple_gen(batch_size=1,shape=(HEIGHT,WIDTH),start=0,end=0.8)
gen_val = tusimple_gen(batch_size=1,shape=(HEIGHT,WIDTH),start=0.8,end=1)

training_history = model.fit_generator(
                    generator=gen_train,
                    epochs=40,
                    verbose=1,
                    validation_data=gen_val,
                    validation_steps=len(gen_val),
                    callbacks=[tensorboard_callback],
                    shuffle=True
                   )

Вывод fit_generator ()

WARNING:tensorflow:Model failed to serialize as JSON. Ignoring... Layers with arguments in `__init__` must override `get_config`.
Epoch 1/40
 31/360 [=>............................] - ETA: 1:47 - loss: -111.2384 - acc: 0.9998 - dice_coef: 0.9694 - iou_loss_core: 0.9380
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...