如何将python生成器更改为Keras Sequence对象?

时间:2019-04-17 11:57:58

标签: python tensorflow keras generator sequence

我正在研究回归问题。我的CNN训练的数据具有以下形状:每批 32x513x30 - 32个513x30 实例,然后是 4810 个批次。

我将这些批次保存在一个目录中,每个批次都命名为“ batch#number.npy”。

使用Python生成器时,我不断收到TensorFlow的警告:

  

警告:tensorflow:将生成器与public void showImageNotification(RemoteMessage remoteMessage){ if (remoteMessage.getData().size() > 0) { Map<String, String> messageData = remoteMessage.getData(); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, CHANNEL_ID) .setContentText(messageData.get("text")) .setContentTitle(messageData.get("title")) .setSmallIcon(R.drawable.localplay_logo_notification) .setColorized(true) .setAutoCancel(true) .setContentIntent(pendingIntent); if (messageData.containsKey("image")) { Bitmap bitmap = getBitmapFromURL(messageData.get("image")); if (bitmap != null) { notificationBuilder.setLargeIcon(bitmap); notificationBuilder.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(bitmap)); } } notificationManager.notify(121, notificationBuilder.build()); } } public Bitmap getBitmapFromURL(String strURL) { try { URL url = new URL(strURL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setDoInput(true); connection.connect(); InputStream input = connection.getInputStream(); return BitmapFactory.decodeStream(input); } catch (IOException e) { e.printStackTrace(); return null; } } 一起使用   并且多个工作人员可能会复制您的数据。请考虑使用   use_multiprocessing=True类。

我想出了如何使用Python生成器加载它们。但是,在使用多处理时,建议使用Keras的Sequence类:https://www.tensorflow.org/api_docs/python/tf/keras/utils/Sequence

不幸的是,那对我来说有点复杂。 这是我一直在使用的代码:

keras.utils.Sequence

我使用生成器的方式是否导致我的数据在训练期间重复?如果是这样,我如何将其转换为Sequence类?

谢谢。

1 个答案:

答案 0 :(得分:0)

  class MyBatchGenerator(Sequence):
    def __init__(self, C):
        self.C = C

    def __len__(self):
        return len(self.C)

    def __getitem__(self, idx):   

        n = self.C[idx]
        os.chdir('mydirectory/train')

        placeholder = np.load('batch#' + str(n) + '.npy')
        X = placeholder[:,:513,:]
        Y1= placeholder[:,513:,:]

        Y = X * Y1

        X = X / normalization # normalize X
        X = scale_mag*X.astype(np.float32)

        Y = Y / normalization 
        Y = scale_mag*Y.astype(np.float32)


        X = np.reshape(X,(32,513,30,1))
        Y = np.reshape(Y,(32,513,30,1))
        return (X, Y)