Сеть DNN требует, чтобы входные данные были 2D, но мои данные обучения - rgb (3D) - PullRequest
0 голосов
/ 03 августа 2020

Я новичок в глубоком обучении. Я пытаюсь обучить глубокую нейронную сеть онлайн-настройки на наборе данных ucf101. Перед тренировкой я прочитал приведенный автором пример использования. Сеть dnn требует обучающих данных в 2D. Но видеокадры, извлеченные из видеоданных, являются 3D-изображениями. Для этого я преобразовываю каждое изображение в тензоры в размерности (1, ШxВx C), но точность обучения слишком низкая. что мне делать?

Первая ячейка кода является примером использования. Второй - мой, а третий - потеря тренировки. Данные обучения в примере использования - (15000,10), что означает, что размерность каждой выборки равна (1,10). Размер моих тренировочных данных (160,160,10)

onn_network = ONN(features_size=10, max_num_hidden_layers=5, 
                  qtd_neuron_per_hidden_layer=40, n_classes=10)
X, Y = make_classification(n_samples=50000, n_features=10, n_informative=4, n_redundant=0, n_classes=10,
                           n_clusters_per_class=1, class_sep=3)
X_train, X_test, y_train, y_test = train_test_split(X,Y, test_size=0.3, 
                                                    random_state=42, shuffle=True)

for i in range(len(X_train)):
  onn_network.partial_fit(np.asarray([X_train[i, :]]), np.asarray([y_train[i]]))
  
  if i % 1 == 0:
    predictions = onn_network.predict(X_test)
    print(" Online Accuracy: {}".format(balanced_accuracy_score(y_test, predictions)))
X_train=np.load('ucf101_X_train_3channels.npy')
X_test=np.load('ucf101_X_test_3channels.npy')
y_train=np.load('ucf101_y_train_3channels.npy')
y_test=np.load('ucf101_y_test_3channels.npy')
X_test=X_test.reshape(7385,160*160*3)
onn_network = ONN(features_size=160*160*3, max_num_hidden_layers=20, qtd_neuron_per_hidden_layer=100, 
                  n_classes=101)
for i in range(len(X_train)):
    
    onn_network.partial_fit(np.asarray([X_train[i]]).reshape(1,160*160*3), 
                            np.asarray(y_train[i]).reshape(1,))
  
    if i % 100 == 0:
        predictions = onn_network.predict(X_test)
        print("Online Accuracy: {}".format(balanced_accuracy_score(y_test, predictions)))
Online Accuracy: 0.0244914025343677
Online Accuracy: 0.02107729631350257
Online Accuracy: 0.02098160986186016
Online Accuracy: 0.025212566301405722
Online Accuracy: 0.02635510928009669
Online Accuracy: 0.025764109717447806
Online Accuracy: 0.026325141135435725
Online Accuracy: 0.018179492570127884
Online Accuracy: 0.025331778179893114
Online Accuracy: 0.02743639553656709
WARNING: Set 'show_loss' to 'False' when not debugging. It will deteriorate the fitting performance.
Alpha:[0.18638033 0.07175495 0.04563371 ... 0.04181847 0.04256647 0.03721857]
Training Loss: 4.5786605
Online Accuracy: 0.028941511549095487
Online Accuracy: 0.031018418116356354
Online Accuracy: 0.01979826579435767
Online Accuracy: 0.03229507089186072
Online Accuracy: 0.024989337301466186
Online Accuracy: 0.03374924564377245

Ответы [ 2 ]

0 голосов
/ 04 августа 2020

Таким образом, кажется, что входные изображения являются RGB, но вы хотите использовать 2D-изображения (что означает шкалу серого, цвета не так важны для этой задачи). Вы не можете просто преобразовать 3D-изображение в 2D, вам нужно удалить два из трех каналов, например удалить GB из RBG и просто оставить красный канал. Вы хотите go от (3, W, H) до (1, W, H). Вот пример удаления каналов:


# let's say img is a 3D numpy array
image = image[:, :, 0]
# image is now 2D (red channel only)
0 голосов
/ 03 августа 2020

вы можете использовать torch.flatten () вместо изменения формы. Во-вторых, поделитесь ссылкой репо, который вы используете. Ваш вопрос непонятен.

...