【问题标题】:Keras fit_generator() for long signalsKeras fit_generator() 用于长信号
【发布时间】:2020-03-19 19:30:22
【问题描述】:

我想创建一个 LSTM 网络,我有一个很长的信号,我想将其用作我的训练数据

  • 我的 X_train 是一个 CSV 文件,其中包含 12 个长度为 54 837 488 的信号
  • 我的 y_train 是一个数组,其中包含长度为 54 837 488 的 One Hot 编码信号(9 个类别)

如果我尝试将 CSV 文件作为数据框或 Python 中的数组上传,则会超出 RAM 的限制,所以我的想法是使用 fit_generator()。我之前在制作图像模型时使用过它,但后来我只使用了一些预构建生成器,但我真的找不到任何用于信号的预构建生成器,所以我决定尝试自己制作一个。

def generate_data_to_model(y_train):
    while True:
        with open("/mypath/myData.csv") as f:
            for line in f:
                x= line.rstrip('\n').split(",")
                x= np.asarray(x)
                x=x[1:]
                x= x.reshape(1,1,12)
                yield (x, y_train[line])


model = Sequential()
model.add(LSTM(32, input_shape=(1, 12)))
model.add(Dense(32, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(9, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer="Adam", metrics=['acc'])

model.fit_generator(generate_data_to_model(y_train),
                    steps_per_epoch=1, epochs=2, verbose=1)

当我开始训练时出现此错误:

<ipython-input-29-33b2195fea44> in generate_data_to_model(y_train)
      8                 x= x.reshape(1,1,12)
 ---> 9                 yield (x, y_train[line])

只有整数、切片 (:)、省略号 (...)、numpy.newaxis (None) 和整数或布尔数组是有效的索引

【问题讨论】:

    标签: python tensorflow keras model yield


    【解决方案1】:

    在this article 的帮助下,我找到了解决这个问题的方法。 我发现真正方便的是制作两个发电机。一种用于特征或 X,另一种用于标签或 y。

    def generate_X():
        while True:
            with open("/mypath/myData.csv") as f:
                for line in f:
                    x= line.rstrip('\n').split(",")
                    x= np.asarray(x)
                    x=x[1:]
                    x= x.reshape(1,1,12)
                    yield x
    
    
    def generate_y():
        while True:
            for i in range(len(y_train)):
                y= y_train[i]
                yield y
    

    然后我继续使用这两个生成器作为我的第三个生成器的输入,它将为 fit_generator() 生成所需大小的批次

    def batch_generator(batch_size, gen_x,gen_y): 
    
        batch_features = np.zeros((batch_size,1, 12))
        batch_labels = np.zeros((batch_size,9))
    
        while True:
            for i in range(batch_size):
                batch_features[i] = next(gen_x)
                batch_labels[i] = next(gen_y)
            yield batch_features, batch_labels
    

    最后,但同样重要的是,我现在可以在训练我的模型时使用 batch_generator

    model.fit_generator(batch_generator(128, generate_X(), generate_y()),
                        steps_per_epoch=(len(y_train)/128), epochs=2, verbose=1)
    

    【讨论】:

      猜你喜欢
      • 2019-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 2019-10-26
      • 2020-04-25
      相关资源
      最近更新 更多