Neupy проблемы нейронной сети

Я пытаюсь обучить / использовать сверточную нейронную сеть с библиотекой neupy для проекта, но я получаю ошибки на этапе обучения.

У меня много изображений (rgb, shape=66, 160, 3), и я разбил их на тренировочные и тестовые наборы. Затем я пытаюсь обучить одну сверточную нейронную сеть (позже я попытаюсь оптимизировать с другим алгоритмом, номером слоя и размером). Целевым выходом для моего проекта является число [-1, 1], я решаю проблему регрессии, но раньше у меня были проблемы.

Сейчас я получаю ошибку: ValueError: Невозможно перемешать матрицы. Все матрицы должны иметь одинаковое количество строк

Соответствующий код:

print numpy.array(y_train).shape
# outputs (84, 66, 160, 3)
print numpy.array(y_test).shape
# outputs (15, 66, 160, 3)

cgnet = algorithms.Adadelta(
    [
        layers.Input((6, 66, 160*3)),

        layers.Convolution((8, 3, 3)),
        layers.Relu(),
        layers.Convolution((8, 3, 3)),
        layers.Relu(),
        layers.MaxPooling((2, 2)),
        layers.Reshape(),
        layers.Linear(1024),
        layers.Softmax(10),
    ],

    error='categorical_crossentropy',
    step=1.0,
    verbose=True,
    shuffle_data=True,
    #shuffle_data=False,

    reduction_freq=8,
    addons=[algorithms.StepDecay],
)

print cgnet.architecture()
cgnet.train(x_train, y_train, x_test, y_test, epochs=100)

Выход:

Main information

[ALGORITHM] Adadelta

[OPTION] batch_size = 128
[OPTION] verbose = True
[OPTION] epoch_end_signal = None
[OPTION] show_epoch = 1
[OPTION] shuffle_data = True
[OPTION] step = 1.0
[OPTION] train_end_signal = None
[OPTION] error = categorical_crossentropy
[OPTION] addons = ['StepDecay']
[OPTION] decay = 0.95
[OPTION] epsilon = 1e-05
[OPTION] reduction_freq = 8

[THEANO] Initializing Theano variables and functions.
[THEANO] Initialization finished successfully. It took 7.01 seconds

Network's architecture

-------------------------------------------------
| # | Input shape  | Layer Type  | Output shape |
-------------------------------------------------
| 1 | (6, 66, 480) | Input       | (6, 66, 480) |
| 2 | (6, 66, 480) | Convolution | (8, 64, 478) |
| 3 | (8, 64, 478) | Relu        | (8, 64, 478) |
| 4 | (8, 64, 478) | Convolution | (8, 62, 476) |
| 5 | (8, 62, 476) | Relu        | (8, 62, 476) |
| 6 | (8, 62, 476) | MaxPooling  | (8, 31, 238) |
| 7 | (8, 31, 238) | Reshape     | 59024        |
| 8 | 59024        | Linear      | 1024         |
| 9 | 1024         | Softmax     | 10           |
-------------------------------------------------

None

Start training

[TRAIN DATA] 84 samples, feature shape: (66, 160, 3)
[TEST DATA] 15 samples, feature shape: (66, 160, 3)
[TRAINING] Total epochs: 100

------------------------------------------------
| Epoch # | Train err | Valid err | Time       |
------------------------------------------------
Traceback (most recent call last):
  File "./ml_neupy.py", line 68, in <module>
    cgnet.train(x_train, y_train, x_test, y_test, epochs=100)
  File "/usr/local/lib/python2.7/dist-packages/neupy/algorithms/constructor.py", line 539, in train
    *args, **kwargs
  File "/usr/local/lib/python2.7/dist-packages/neupy/algorithms/learning.py", line 49, in train
    summary=summary
  File "/usr/local/lib/python2.7/dist-packages/neupy/algorithms/base.py", line 409, in train
    target_train)
  File "/usr/local/lib/python2.7/dist-packages/neupy/algorithms/utils.py", line 146, in shuffle
    raise ValueError("Cannot shuffle matrices. All matrices should "
ValueError: Cannot shuffle matrices. All matrices should have the same number of rows

Что не так с входными данными или сетью?

Спасибо

1 ответ

Решение

Есть несколько вещей, которые вам нужно изменить:

  1. Вы упомянули, что пытаетесь решить проблему регрессии. Ваша сеть имеет слой Softmax в качестве выхода, что означает, что ваша сеть может давать вам только выходы из диапазона [0, 1] вместо [-1, 1]. Вы можете изменить его на слой Tanh. Он будет производить вывод из диапазона [-1, 1].

  2. Перекрестная энтропийная ошибка подходит только для задач классификации

    error='categorical_crossentropy'
    

    Для регрессии вы можете использовать MSE или RMSE (больше функций ошибок вы можете найти здесь)

    error='mse'
    
  3. Я предполагаю, что в форме (66, 160, 3) число 3 определяет каждый из каналов RGB. NeuPy работает с библиотекой Theano, что означает, что вам нужно определить форму канала перед шириной и высотой изображения. Правильный порядок: (n_samples, n_channels, height, width), В вашем случае я предполагаю, что у вас есть 84 сэмпла, высота 66 пикселей, ширина 160 пикселей и 3 канала (RGB). Если это правда, то вам нужно преобразовать свой вклад следующим образом

    # convert this shape (n_samples, height, width, n_channels)
    # to (n_samples, n_channels, height, width)
    x_train = x_train.transpose((0, 3, 1, 2))
    print(x_train.shape)  # (84, 3, 66, 160)
    
  4. Выход из последнего слоя должен быть 1 вместо 10. Это означает, что вы прогнозируете только одно значение для каждого образца вместо вектора с 10 значениями (используйте layers.Tanh(1) вместо layers.Softmax(10))

Следующий код работает без ошибок (не работает должным образом, потому что значения являются случайными):

import numpy
from neupy import algorithms, layers


x_train = numpy.random.random((84, 3, 66, 160))
x_test = numpy.random.random((15, 3, 66, 160))
y_train = numpy.random.random(84)
y_test = numpy.random.random(15)

cgnet = algorithms.Adadelta(
    [
        layers.Input((3, 66, 160)),

        layers.Convolution((8, 3, 3)),
        layers.Relu(),
        layers.Convolution((8, 3, 3)),
        layers.Relu(),
        layers.MaxPooling((2, 2)),

        layers.Reshape(),
        layers.Linear(1024),
        layers.Tanh(1),
    ],

    error='mse',
    step=1.0,
    verbose=True,
    shuffle_data=True,

    reduction_freq=8,
    addons=[algorithms.StepDecay],
)

cgnet.architecture()
cgnet.train(x_train, y_train, x_test, y_test, epochs=100)
Другие вопросы по тегам