Я работаю в распределенной среде, чтобы отследить модель машинного обучения keras, поэтому мне нужно распределить данные по кластеру.для этой цели я использую библиотеку TensorflowOnSpark.Ниже маленький кусочек кода, где я застрял.
def generate_rdd_data(dataRDD):
while True:
feature_vector = []
lbls = []
for item in dataRDD:
#record = item[0]
feature_vector.append(item[0])
lbls.append(keras.utils.to_categorical(item[1], num_classes = 14))
features = numpy.array(feature_vector).astype('float32')
#labels = numpy.array(lbls).astype('float32')
return (features, labels)
Этот метод работает нормально, но преобразование keras OneHotEncoding для меток не выполняется.Ниже приведена ошибка
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 10, in generate_rdd_data
ValueError: setting an array element with a sequence.
Это результат lbls:
>>> lbls.take(4)
[array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], dtype=float32), array([1.], dtype=float32), array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.], dtype=float32), array([1.], dtype=float32)]
Но хотя я выполняю ту же логику в фиктивном методе, показанном ниже, он отлично работает
def temp(data):
no = []
for item in data:
no.append(keras.utils.to_categorical(item, num_classes = 15))
return no
Вход для временного метода:
a = [14,13,2,5,1,0]
Выход соответствует ожидаемому
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]],
dtype=float32)
Добавление дополнительной информации.Для первого метода входные данные - это rdd-архив с набором данных и соответствующими метками.
Пример rdd выглядит следующим образом:
[([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0], 12.0)]
Как вы можете видеть, rdd состоит из двух частей: одна - feature_vector, а вторая - label, так что первый метод содержит функции и меткив цифровом формате.