Я пытаюсь обучить мою реализацию 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