Как исправить эту ошибку: «MXNetError: форма несовместима, предоставляется» - PullRequest
0 голосов
/ 20 апреля 2019

Я новичок в mxnet, я пытаюсь сделать этот код:

from mxnet import nd, sym
from mxnet.gluon import nn

class HybridNet(nn.HybridBlock):
    def __init__(self, **kwargs):
         super(HybridNet, self).__init__(**kwargs)
         self.hidden = nn.Dense(10)
         self.output = nn.Dense(2)

    def hybrid_forward(self, F, x):
         print('F: ', F)
         print('x: ', x.shape)

         x = F.relu(self.hidden(x))
         print('hidden: ', x.shape)

         x = F.relu(self.hidden(x))
         print('hidden: ', x.shape)

    return self.output(x)


    net = HybridNet()

    net.initialize()

    x = nd.random.normal(shape=(1, 4))
    net(x)

, однако, он получил эту ошибку: MXNetError: Форма не соответствует, Предоставлено = [10,4], предполагаемая форма = (10,10)

, но если я изменю self.hidden = nn.Dense (10) на self.hidden = nn.Dense (4), ошибка больше не будет существовать.но я не могу понять, почему, кто-нибудь может объяснить это мне?спасибо

1 Ответ

0 голосов
/ 14 мая 2019

Проблема в том, что вы дважды используете один и тот же скрытый слой с другим размером ввода.

  1. Когда вы вызываете x = F.relu(self.hidden(x)) в первый раз, скрытый слой автоматически обнаруживает, что ваш размер ввода равен 4 из-за ввода: x = nd.random.normal(shape=(1, 4)).
  2. Выводит NDArray размером 10 (из-за 10 нейронов).
  3. Затем вы снова используете скрытый слой, но теперь с вводом размера 10 ... Слой уже инициализирован и ожидает получения ввода размера 4, но получает размер 10, поэтому он не работает.

Чтобы исправить это, добавьте еще один скрытый слой любого произвольного размера:

from mxnet import nd, sym
from mxnet.gluon import nn


class HybridNet(nn.HybridBlock):
    def __init__(self, **kwargs):
        super(HybridNet, self).__init__(**kwargs)
        self.hidden1 = nn.Dense(10)
        self.hidden2 = nn.Dense(20)
        self.output = nn.Dense(2)

    def hybrid_forward(self, F, x):
        print('F: ', F)
        print('x: ', x.shape)

        x = F.relu(self.hidden1(x))
        print('hidden: ', x.shape)

        x = F.relu(self.hidden2(x))
        print('hidden: ', x.shape)

        return self.output(x)


net = HybridNet()
net.initialize()

x = nd.random.normal(shape=(1, 4))
net(x)

...