Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras fit_发电机问题_Python_Keras_Generator - Fatal编程技术网

Python Keras fit_发电机问题

Python Keras fit_发电机问题,python,keras,generator,Python,Keras,Generator,我随后为我的Keras模型创建了一个自定义生成器。以下是一个MWE,显示了我面临的问题: import sys, keras import numpy as np import tensorflow as tf import pandas as pd from keras.models import Model from keras.layers import Dense, Input from keras.optimizers import Adam from keras.losses imp

我随后为我的Keras模型创建了一个自定义生成器。以下是一个MWE,显示了我面临的问题:

import sys, keras
import numpy as np
import tensorflow as tf
import pandas as pd
from keras.models import Model
from keras.layers import Dense, Input
from keras.optimizers import Adam
from keras.losses import binary_crossentropy

class DataGenerator(keras.utils.Sequence):
    'Generates data for Keras'
    def __init__(self, list_IDs, batch_size, shuffle=False):
        'Initialization'
        self.batch_size = batch_size
        self.list_IDs = list_IDs
        self.shuffle = shuffle
        self.on_epoch_end()

    def __len__(self):
        'Denotes the number of batches per epoch'
        return int(np.floor(len(self.list_IDs) / self.batch_size))

    def __getitem__(self, index):
        'Generate one batch of data'
        # Generate indexes of the batch
        #print('self.batch_size: ', self.batch_size)
        print('index: ', index)
        sys.exit()

    def on_epoch_end(self):
        'Updates indexes after each epoch'
        self.indexes = np.arange(len(self.list_IDs))
        print('self.indexes: ', self.indexes)
        if self.shuffle == True:
            np.random.shuffle(self.indexes)

    def __data_generation(self, list_IDs_temp):
        'Generates data containing batch_size samples' # X : (n_samples, *dim, n_channels)

        X1 = np.empty((self.batch_size, 10), dtype=float)
        X2 = np.empty((self.batch_size, 12),  dtype=int)

        #Generate data
        for i, ID in enumerate(list_IDs_temp):
            print('i is: ', i, 'ID is: ', ID)

            #Preprocess this sample (omitted)
            X1[i,] = np.repeat(1, X1.shape[1])
            X2[i,] = np.repeat(2, X2.shape[1])

        Y = X1[:,:-1]
        return X1, X2, Y

if __name__=='__main__':
    train_ids_to_use = list(np.arange(1, 321)) #1, 2, ...,320 
    valid_ids_to_use = list(np.arange(321, 481)) #321, 322, ..., 480

    params = {'batch_size': 32}

    train_generator = DataGenerator(train_ids_to_use, **params)
    valid_generator = DataGenerator(valid_ids_to_use, **params)

    #Build a toy model
    input_1 = Input(shape=(3, 10))
    input_2 = Input(shape=(3, 12))
    y_input = Input(shape=(3, 10))

    concat_1 = keras.layers.concatenate([input_1, input_2])
    concat_2 = keras.layers.concatenate([concat_1, y_input])

    dense_1 = Dense(10, activation='relu')(concat_2)
    output_1 = Dense(10, activation='sigmoid')(dense_1)

    model = Model([input_1, input_2, y_input], output_1)
    print(model.summary())

    #Compile and fit_generator
    model.compile(optimizer=Adam(lr=0.001), loss=binary_crossentropy)
    model.fit_generator(generator=train_generator, validation_data = valid_generator, epochs=2, verbose=2)
我不想乱洗我的输入数据。我以为这已经得到了处理,但在我的代码中,当我在
\uuu get\u item\uuu
中打印出
索引时,我得到了随机数。我想要连续的数字。请注意,我试图使用
sys.exit
inside
\uu getitem\uuu
终止进程,以查看发生了什么

我的问题是:

  • 为什么索引不连续?我怎样才能解决这个问题

  • 当我在终端使用屏幕上运行这个时,为什么它不响应Ctrl+C


  • 您可以使用
    fit\u generator
    方法的
    shuffle
    参数连续生成批。从
    安装发电机()

    洗牌:布尔值。是否在每个历元开始时洗牌批次的顺序。仅用于
    Sequence
    keras.utils.Sequence
    )的实例。当
    steps\u per\u epoch
    不是
    None
    时无效

    只需将shuffle=False传递给
    fit\u生成器

    model.fit_generator(generator=train_generator, shuffle=False, ...)
    

    我认为您可以通过将
    shuffle=False
    传递到
    fit_generator
    方法来实现这一点?您好,谢谢您的回复。我在
    \uuuu init\uuuuu
    中默认这么做,后来我测试了索引值是否被
    中的if语句在\u epoch\u end
    中乱序。我发现if语句中的东西没有被执行,我认为这意味着shuffle确实是错误的。您希望批量索引连续生成,对吗?这就是
    fit\u生成器的
    shuffle=False
    参数。你试过了吗?是的,请看上面的评论。对不起,我不明白。在我的机器上,当我在
    fit\u generator
    调用中设置
    shuffle=False
    时(不是在
    \uuuuu init\uuuuuu
    方法中),我会得到连续的索引。好的,请让我检查我的理解:
    fit\u generator
    没有被覆盖,它属于Keras,并且有自己的参数。我使用
    DataGenerator
    所做的是创建我自己的生成器(train\u generator和valid\u generator),以创建供Keras使用的数据片段。但是为什么这意味着我需要在调用
    fit_生成器
    时指定
    shuffle=False
    ,而不是在我自己的生成器中指定呢?@StatsSorceress
    fit_生成器
    已经实现,这样它就可以使用给定的索引值调用
    序列
    getitem
    方法。因此,
    fit_生成器
    为您提供要生成的批次的索引。将
    shuffle=False
    传递给
    fit_生成器
    将强制它按顺序给出批索引,即0、1、2、3、。。。