cifar10 рандомизирует поезд и тестовый набор - PullRequest
0 голосов
/ 11 декабря 2018

Я хотел бы рандомизировать 60000 наблюдений набора данных CIFAR-10, присутствующего в библиотеке keras.datasets .Я знаю, что это может быть не так важно для построения нейронной сети, но я новичок в Python, и я хотел бы научиться обрабатывать данные с этим языком программирования.

Итак, чтобы импортировать набор данных,Я запускаю

from keras.datasets import cifar10
(X_train, Y_train), (X_test, Y_test) = cifar10.load_data()

, что автоматически дает мне подразделение поезда и тестового набора по умолчанию;но я хотел бы смешать их.Я имею в виду следующие шаги:

  • объединение наборов поездов и испытаний в наборе данных X формы (60000, 32, 32, 3) и наборе данных Y формы (60000, 1)
  • генерирует несколько случайных величин для подмножества набора данных X и Y , скажем, в обучающем наборе 50000 obsи тестовый набор из 10000 obs
  • для создания новых наборов данных (в формате ndarray ) X_train , X_test , Y_train , Y_test с теми же формами, что и исходные, так что я могу начать тренировать свою сверточную нейронную сеть

, но, возможно, есть даже более быстрый подход к этому.

Я пробовал разные методы в течение нескольких часов, но мне ничего не удалось достичь.Кто-нибудь может мне помочь?Я был бы очень признателен, спасибо.

Ответы [ 2 ]

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

Вот полное демо, как вы и просили.Сначала мы загружаем данные и рандомизируем их один раз, а затем берем первые 50 КБ для обучения и оставшиеся 10 КБ для целей проверки.

In [21]: import tensorflow  
In [22]: import tensorflow.keras.datasets as datasets    
In [23]: cifar10 = datasets.cifar10.load_data() 
In [24]: (X_train, Y_train), (X_test, Y_test) = datasets.cifar10.load_data() 

In [25]: X_train.shape, Y_train.shape 
Out[25]: ((50000, 32, 32, 3), (50000, 1))

In [26]: X_test.shape, Y_test.shape 
Out[26]: ((10000, 32, 32, 3), (10000, 1)) 

In [27]: import numpy as np
In [28]: X, Y = np.vstack((X_train, X_test)), np.vstack((Y_train, Y_test))  

In [29]: X.shape, Y.shape 
Out[29]: ((60000, 32, 32, 3), (60000, 1)) 

In [30]: # Shuffle only the training data along axis 0 
    ...: def shuffle_train_data(X_train, Y_train): 
    ...:     """called after each epoch""" 
    ...:     perm = np.random.permutation(len(Y_train)) 
    ...:     Xtr_shuf = X_train[perm] 
    ...:     Ytr_shuf = Y_train[perm] 
    ...:      
    ...:     return Xtr_shuf, Ytr_shuf 


In [31]: X_shuffled, Y_shuffled = shuffle_train_data(X, Y) 

In [32]: (X_train_new, Y_train_new) = X_shuffled[:50000, ...], Y_shuffled[:50000, ...] 

In [33]: (X_test_new, Y_test_new) = X_shuffled[50000:, ...], Y_shuffled[50000:, ...] 

In [34]: X_train_new.shape, Y_train_new.shape 
Out[34]: ((50000, 32, 32, 3), (50000, 1))

In [35]: X_test_new.shape, Y_test_new.shape 
Out[35]: ((10000, 32, 32, 3), (10000, 1))

У нас есть функция shuffle_train_data, которая последовательно перетасовывает данные, сохраняяпримеры и их метки в том же порядке.

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

Вы можете использовать sklearn.model_selection.train_test_split для разделения данных.Если вы хотите использовать один и тот же случайный выбор индекса каждый раз, когда запускаете код, вы можете установить значение random_state, и у вас будет одинаковое тестирование / разделение поезда каждый раз.

from keras.datasets import cifar10
(X_train, Y_train), (X_test, Y_test) = cifar10.load_data()

# View first image
import matplotlib.pyplot as plt
plt.imshow(X_train[0])
plt.show()

enter image description here

import numpy as np
from sklearn.model_selection import train_test_split

# Concatenate train and test images
X = np.concatenate((X_train,X_test))
y = np.concatenate((Y_train,Y_test))

# Check shape
print(X.shape) # (60000, 32, 32, 3)

# Split data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=10000, random_state=1234)

# Check shape
print(X_train.shape) # (50000, 32, 32, 3)

# View first image
plt.imshow(X_train[0])
plt.show()

enter image description here

...