Python 为keras建造螺纹安全发电机以使用多个工人
如果有人有构建线程安全生成器的经验,那么有没有其他方法可以使用函数生成器来实现这一点?我是在以下网站上看到这篇文章的: 我试图根据这篇文章来编写我的代码,但我遇到了一个错误,这个错误对我来说毫无意义,有人有什么见解吗Python 为keras建造螺纹安全发电机以使用多个工人,python,multithreading,tensorflow,keras,multiprocessing,Python,Multithreading,Tensorflow,Keras,Multiprocessing,如果有人有构建线程安全生成器的经验,那么有没有其他方法可以使用函数生成器来实现这一点?我是在以下网站上看到这篇文章的: 我试图根据这篇文章来编写我的代码,但我遇到了一个错误,这个错误对我来说毫无意义,有人有什么见解吗 import numpy as np import keras import cv2 import os from depth_functional import predict class data_generator(keras.utils.Sequence): d
import numpy as np
import keras
import cv2
import os
from depth_functional import predict
class data_generator(keras.utils.Sequence):
def __init__(self,ImgPath,string_ids,keys,bs,model,bboxes):
'Initialize'
self.ImgPath=ImgPath
self.string_ids=string_ids
self.keys=keys
self.bs=bs
self.model=model
self.bboxes=bboxes
#will keep track how many times we have pulled batches of data
self.count=0
def __len__(self):
#Denotes Number of batches per epoch
return (int(np.floor(len(self.list_IDs))/self.bs))
def __getitem__(self,index):
#Generate index of the batch
indexes=self.indexes[index*self.bs:(index+1)*self.bs]
#find a list of ids you want to generate
string_ids_temp=[self.string_ids[k] for k in indexes]
#Generate data
RGBD,Masks=self.__data_generation(string_ids_temp)
return RGBD,Masks
def on_epoch_end(self):
self.indexes=np.arange(len(self.string_ids))
def __data_generation(self,string_ids_temp):
os.chdir('C:\\Users\\'+self.ImgPath)
RGBD_images=np.zeros((self.bs,240,320))
Masks=np.zeros((self.bs,240,320,19))
for i in range(len(string_ids_temp)):
img=cv2.imread(string_ids_temp[i] +'.jpg')
RGBD,masks=self.ProcessData(img,self.bboxes[self.count],self.keys[self.count])
RGBD_images[i,:,:,:]=RGBD
Masks[i,:,:,:]=masks
if self.count >= len(self.keys):
self.count=0
def ProcessData(self,img,bbox,keys):
zeros=np.zeros((img.shape[0],img.shape[1],18))
mask=np.zeros((240,320,19))
bbox_height=abs(bbox[0]-bbox[2])
bbox_width=abs(bbox[1]-bbox[3])
sigma_x=400*(bbox_width/224)
sigma_y=400*(bbox_height/224)
for part in range(18):
if keys[part][2]==2:
for j in range(img.shape[1]):
x=np.linspace(0,img.shape[0]-1,img.shape[0])
y=np.full((img.shape[0],),float(j))
x_key=np.full((img.shape[0],),keys[part][1])
y_key=np.full((img.shape[0],),keys[part][0])
zeros[:,j,part]=np.exp(-(np.square(x-x_key)/sigma_x+np.square(y-y_key)/sigma_y))
zeros=cv2.resize(zeros,(320,240))
mask[:,:,18]=np.amax(mask,axis=-1)
resized_img=cv2.resize(img,(640,480))/255.0
depth=predict(self.model,resized_img)[0]
depth=depth/np.amax(depth)
smaller_img=cv2.resize(img,(320,240))/255.0
RGBD = np.concatenate((smaller_img,depth),axis=-1)
return RGBD,mask
我一直得到以下错误,我不太明白
File "C:\Users\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 827, in runfile
execfile(filename, namespace)
File "C:\Users\Anaconda3\lib\site-packages\spyder_kernels\customize\spydercustomize.py", line 110, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:\Users\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training.py", line 1297, in fit_generator
steps_name='steps_per_epoch')
File "C:\Users\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_generator.py", line 144, in model_iteration
shuffle=shuffle)
File "C:\Users\Anaconda3\lib\site-packages\tensorflow_core\python\keras\engine\training_generator.py", line 477, in convert_to_generator_like
num_samples = int(nest.flatten(data)[0].shape[0])
AttributeError: 'data_generator' object has no attribute 'shape'
编辑以下LaneDeranger骨架:
我将此作为快速为TF/KERA制造新发电机的基础。还有其他方法可以做到这一点,但我在大多数情况下都使用这种方法
class Generator:
def __init__(self,base_path):
# initialize however... for example:
self.base_path = base_path
self.files = os.listdir(self.base_path)
def __iter__(self):
return self
def __len__(self):
return len(self.files) # needs to return total training samples
def __next__(self):
# get your images and labels
return (images,labels)
然后,您可以这样使用它们:
train_gen = Generator(train_path)
val_gen = Generator(val_path)
model.fit_generator(train_gen,
validation_data=val_gen,
steps_per_epoch=200,
validation_steps=200,
epochs=666)
希望有帮助 谢谢你,我必须试着让它符合我的要求。您是否能够使用此类型的生成器为.fit_生成器指定工人数>1?是!刚刚测试了一下以确定。还有,一个旧项目的例子,也许它会给你一个好的开始。这很奇怪,因为即使使用你的结构,我也会得到同样的错误:num_samples=int(nest.flatte(data)[0]。shape[0])AttributeError:'Generator'对象没有属性'shape',可能是这样的吗?这就是我的想法,但我正在传递验证数据和训练数据,这是我根据你的模型构建的同一个生成器。。。
train_gen = Generator(train_path)
val_gen = Generator(val_path)
model.fit_generator(train_gen,
validation_data=val_gen,
steps_per_epoch=200,
validation_steps=200,
epochs=666)