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)