У меня есть 20 канальных данных, каждое из которых содержит 5000 значений (всего более 150 000 записей, хранящихся в виде файлов .npy на жестком диске).
Я следую учебному пособию keras fit_generator, доступному на https://stanford.edu/~shervine/blog/keras-how-to-generate-data-on-the-fly.html длячитать данные (каждая запись читается как (5000, 20) массив NumPy типа float32.
Сети, которые я теоретизировал, имеют параллельные сверточные сети для каждого канала, которые объединяются в конце и, следовательно, должныпараллельная подача данных. Считывание и передача только одного канала из данных и подача в одну сеть успешна
def __data_generation(self, list_IDs_temp):
'Generates data containing batch_size samples' # X : (n_samples, *dim, n_channels)
# Initialization
if(self.n_channels == 1):
X = np.empty((self.batch_size, *self.dim))
else:
X = np.empty((self.batch_size, *self.dim, self.n_channels))
y = np.empty((self.batch_size), dtype=int)
# Generate data
for i, ID in enumerate(list_IDs_temp):
# Store sample
d = np.load(self.data_path + ID + '.npy')
d = d[:, self.required_channel]
d = np.expand_dims(d, 2)
X[i,] = d
# Store class
y[i] = self.labels[ID]
return X, keras.utils.to_categorical(y, num_classes=self.n_classes)
Однако при чтении всей записи и попытке передать ее в сеть с помощью нарезки с помощью лямбдыя получаю слои
Чтение всей записи
X[i,] = np.load(self.data_path + ID + '.npy')
Использование реализации Lambda Slicing Layer доступно по адресу: https://github.com/keras-team/keras/issues/890 и вызов
input = Input(shape=(5000, 20))
slicedInput = crop(2, 0, 1)(input)
IЯ могу скомпилировать модель и показать ожидаемые размеры слоев.
Когда данные поступают в эту сеть, я получаю
ValueError: could not broadcast input array from shape (5000,20) into shape (5000,1)
AЛюбая помощь будет высоко ценится ....