Объединить вложенные списки в группы в списке кортежей списков - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть список размером 50000. скажем a.Каждый элемент - это кортеж, скажем b=a[0].Каждый кортеж состоит из 2 списков, скажем c=b[0], d=b[1].1-й список, т. Е. c, имеет длину 784, а второй, т. Е. d, имеет длину 10. Из этого списка мне нужно извлечь следующее:
Сгруппировать первые 10 элементов списка a.Из этих 10 кортежей извлеките их первый элемент (c) и поместите их в матрицу размером 784x10.Также извлеките вторые элементы кортежей и поместите их в другую матрицу размером 10x10.Повторите это для каждой партии из 10 элементов в списке a.
Возможно ли это сделать в одной строке, используя понимание списка?Или я должен написать несколько для циклов?Какой метод эффективен и лучший?Примечание: все в порядке, если я получу в виде списка или матрицы numpy.ndarray.

Дополнительная информация : я следую этому учебнику по нейронным сетям, который нацелен наразработать нейронную сеть для распознавания рукописных цифр.База данных MNIST используется для обучения сети.Данные обучения находятся в вышеописанном формате.Мне нужно создать матрицу input_images иpected_output для каждой мини-партии.

Вот код, который я пробовал.Я получаю список размером 50000. Он не разбивается на мини-пакеты

f = gzip.open('mnist.pkl.gz', 'rb')
tr_d, va_d, te_d = pickle.load(f, encoding='latin1')
f.close()
training_inputs = [numpy.reshape(x, (784, 1)) for x in tr_d[0]]
training_results = [vectorized_result(y) for y in tr_d[1]]
training_data = zip(training_inputs, training_results)

# training_data is a list of size 50000 as described above
n = len(training_data)  # n=50000
mini_batch_size = 10
mini_batch = [x[0] for k in range(0, n, mini_batch_size) for x in training_data[k:k+mini_batch_size]]

mnist.pkl.gz доступно здесь

1 Ответ

0 голосов
/ 29 декабря 2018

Я написал свой ответ до того, как вы добавили источник, и поэтому он основан исключительно на первой части, где вы записываете его словами.Поэтому он не очень надежен с точки зрения изменения размера входных данных.Если вы читаете дальше в книге, Андерс Нильсен на самом деле предлагает свою собственную реализацию.

Мой основной ответ - не однострочный ответ, поскольку это запутало бы то, что он делает, и я бы очень посоветовал вам написать сложныепроцессы, подобные этому, чтобы вы лучше понимали, что на самом деле происходит.В моем коде я делаю firstMatrix, который содержит c-элементы в матрице, и secondMatrix, который содержит d-элементы.Я делаю это для каждой партии из 10, но потом не знал, что вы хотите делать с матрицами, поэтому я просто делаю их для каждой партии.Если вы хотите сгруппировать их или что-то в этом роде, скажите, пожалуйста, и я постараюсь реализовать это.

for batch in np.array_split(a,10):
    firstMatrix = np.zeros(shape=(784,10))
    secondMatrix = np.zeros(shape=(10,10))
    for i in range(len(batch)):
        firstMatrix[:,i] = batch[i][0]
        secondMatrix[:,i] = batch[i][1]

Если вы действительно хотите однострочный, вот тот, который создает массив firstMatrices и одиндля второй матрицы:

firstMatrices = [np.array([batch[i][0] for i in range(len(batch))]).T for batch in np.array_split(a,10)]
secondMatrices = [np.array([batch[i][1] for i in range(len(batch))]).T for batch in np.array_split(a,10)]
...