OneHotEncoding с использованием keras.utils.to_categorical не может преобразоваться в массив Numpy размера полной длины - PullRequest
0 голосов
/ 28 февраля 2019

Я работаю в распределенной среде, чтобы отследить модель машинного обучения 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, так что первый метод содержит функции и меткив цифровом формате.

1 Ответ

0 голосов
/ 28 февраля 2019

эта ValueError: setting an array element with a sequence. ошибка, вызванная попыткой преобразовать преобразуемый список немультимерного массива в массив

, возможно, у вас есть список, подобный этому [2,[3,4]], или у вас есть объект string и int [1,2,"r"]

и для функции не нужно конвертировать по одному:

def generate_rdd_data(dataRDD):
    return dataRDD,keras.utils.to_categorical(dataRDD,num_classes=14)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...