Keras fit_generator() 用于长信号
Keras fit_generator() for long signals
我想制作一个 LSTM 网络,我有一个相当长的信号,我想将其用作我的训练数据
- 我的 X_train 是一个 CSV 文件,其中包含 12 个信号,长度为 54 837 488
- 我的 y_train 是一个包含 One Hot 编码信号(9 个类别)的数组,长度为 54 837 488
如果我尝试将 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])
only integers, slices (:
), ellipsis (...
), numpy.newaxis (None
) and integer or boolean arrays are valid indices
在 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)
我想制作一个 LSTM 网络,我有一个相当长的信号,我想将其用作我的训练数据
- 我的 X_train 是一个 CSV 文件,其中包含 12 个信号,长度为 54 837 488
- 我的 y_train 是一个包含 One Hot 编码信号(9 个类别)的数组,长度为 54 837 488
如果我尝试将 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])
only integers, slices (
:
), ellipsis (...
), numpy.newaxis (None
) and integer or boolean arrays are valid indices
在 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)