Преобразование данных массива Mnist в одно горячо закодированные массивы для каждого значения пикселя - PullRequest
1 голос
/ 27 сентября 2019

Я пытаюсь превратить матрицу нормализованных данных пикселей из mnist в матрицу массивов с одним «горячим» массивом, представляющих y_val каждого пикселя в зависимости от класса, и если он больше 0.

Вотпример ввода, более конкретно, одна строка из одного примера в наборе данных:

[[0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.01176471]
 [0.07058824]
 [0.07058824]
 [0.07058824]
 [0.49411765]
 [0.53333336]
 [0.6862745 ]
 [0.10196079]
 [0.6509804 ]
 [1.        ]
 [0.96862745]
 [0.49803922]
 [0.        ]
 [0.        ]
 [0.        ]
 [0.        ]]

Массив из 28 элементов значений яркости пикселей.Теперь предположим, что реальный класс этого входа имеет число «2».Скрипт будет проходить и вставлять один горячий массив, в котором в настоящее время находится каждое значение пикселя.

Если пиксель равен == 0, то он будет преобразован из

[0.        ]

в

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 1.]

Поскольку я использую 11-ю запись для представления пустого пикселя.

Если бы значение элемента массива было> 0, он вставил бы горячий массив примеров истинной метки, "2".

[0. 0. 1. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

Это код, который у меня такfar

#copying the shape of the train data matrix of arrays into a new
#array
new_y_train = np.copy(x_train)

for ex_index, example in enumerate(x_train):
  for row_index, row in enumerate(example):
    for px_index, pixel in enumerate(row):
      temp_arr = np.zeros(11)
      if pixel > 0:
        pixel = np.insert(temp_arr, np.argmax(y_train[index]), 1)
        new_y_train[ex_index][row_index][px_index] = pixel
      else:
        pixel = np.insert(temp_arr, 11, 1)
        new_y_train[ex_index][row_index][px_index] = pixel

Однако, когда я попадаю на эту строку

new_y_train[ex_index][row_index][px_index] = pixel

, я получаю ошибку о трансляции массива до значения в пикселях ", не удалось передать входной массив из фигуры (12) в форму (1) "

Не уверен, как изменить размер или изменить массив, чтобы учесть ввод этого нового горячего массива в матрицу.

Любая помощь будет отличной!

1 Ответ

0 голосов
/ 27 сентября 2019

вы можете сделать это с помощью необычного индексирования

arr = np.array([[0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.01176471],
 [0.07058824],
 [0.07058824],
 [0.07058824],
 [0.49411765],
 [0.53333336],
 [0.6862745 ],
 [0.10196079],
 [0.6509804 ],
 [1.        ],
 [0.96862745],
 [0.49803922],
 [0.        ],
 [0.        ],
 [0.        ],
 [0.        ],],)

labels = np.random.choice(10, len(arr)).reshape(-1,1)

ind_row = np.arange(len(arr))
ind_col = np.where(arr>0, labels, 10).ravel()

one_hot_coded_arr = np.zeros((len(arr), 11))
one_hot_coded_arr[ind_row,ind_col]=1

one_hot_coded_arr

edit

если у вас есть 10 данных изображения, то преобразование в желаемую форму может быть выполнено следующим образом

data = np.random.choice(255, (10,28,28))
labels = np.random.choice(9, (10,1))

## do you calculation of brightness here
## and expand it to one row per pixel
arr = data.reshape(-1,1)/255
## repeat labels to match the expanded pixel
labels = labels.repeat(28*28).reshape(-1,1)

ind_row = np.arange(len(arr))
ind_col = np.where(arr>0, labels, 10).ravel()

one_hot_coded_arr = np.zeros((len(arr), 11))
one_hot_coded_arr[ind_row,ind_col]=1

## convert back to desired shape
one_hot_coded_arr.reshape(-1, 28,28,11)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...