(Лазанья) ValueError: несоответствие входного размера

Когда я запускаю свой код, я получаю ошибку значения со следующим сообщением:

ValueError: Input dimension mis-match. (input[0].shape[1] = 1, input[2].shape[1] = 20)
Apply node that caused the error: Elemwise{Composite{((i0 + i1) - i2)}}[(0, 0)](Dot22.0, InplaceDimShuffle{x,0}.0, InplaceDimShuffle{x,0}.0)
Toposort index: 18
Inputs types: [TensorType(float64, matrix), TensorType(float64, row), TensorType(float64, row)]
Inputs shapes: [(20, 1), (1, 1), (1, 20)]
Inputs strides: [(8, 8), (8, 8), (160, 8)]
Inputs values: ['not shown', array([[ 0.]]), 'not shown']
Outputs clients: [[Elemwise{Composite{((i0 * i1) / i2)}}(TensorConstant{(1, 1) of 2.0}, Elemwise{Composite{((i0 + i1) - i2)}}[(0, 0)].0, Elemwise{mul,no_inplace}.0), Elemwise{Sqr}[(0, 0)](Elemwise{Composite{((i0 + i1) - i2)}}[(0, 0)].0)]]

Мои тренировочные данные представляют собой матрицу записей, таких как ..

[ 815.257786    320.447   310.841]

И пакеты, которые я ввожу в свою обучающую функцию, имеют форму (BATCH_SIZE, 3) и тип TensorType(float64, matrix)

Моя нейронная сеть очень проста:

    self.inpt = T.dmatrix('inpt')
    self.out  = T.dvector('out')

    self.network_in = nnet.layers.InputLayer(shape=(BATCH_SIZE, 3), input_var=self.inpt)
    self.l0         = nnet.layers.DenseLayer(self.network_in, num_units=40,
                        nonlinearity=nnet.nonlinearities.rectify,
    )
    self.network    = nnet.layers.DenseLayer(self.l0, num_units=1,
                        nonlinearity=nnet.nonlinearities.linear
    )

Моя функция потерь:

    pred = nnet.layers.get_output(self.network)
    loss = nnet.objectives.squared_error(pred, self.out)
    loss = loss.mean()

Я немного смущен тем, почему я получаю несоответствие размеров. Я передаю правильные типы ввода и метки (в соответствии с моими символическими переменными), и форма моих входных данных соответствует ожидаемому параметру «формы», который я даю своему InputLayer. Я считаю, что это проблема с тем, как я указываю размер пакета, поскольку, когда я использую размер пакета 1, моя сеть может обучаться без каких-либо проблем, а значение input[2].shape[1] из сообщения об ошибке равно мой размер партии. Я совершенно новичок в машинном обучении, и любая помощь будет принята с благодарностью!


person tallosan    schedule 11.03.2017    source источник


Ответы (1)


Оказывается, проблема заключалась в том, что мои ярлыки имели неправильную размерность.

Мои данные имели формы:

x_train.shape == (batch_size, 3)
y_train.shape == (batch_size,)

И символические входы в мою сеть были:

self.inpt = T.dmatrix('inpt')
self.out  = T.dvector('out')

Я смог решить свою проблему, изменив форму y_train. Затем я изменил символическую выходную переменную на матрицу, чтобы учесть эти изменения.

y_train = np.reshape(y_train, y_train.shape + (1,))
# y_train.shape == (batch_size, 1)

self.out = T.dmatrix('out')
person tallosan    schedule 14.03.2017