如何解决此错误:“ MXNetError:形状不一致,已提供”

时间:2019-04-20 03:28:01

标签: python mxnet

我是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 :(得分:0)

问题是您用不同的输入大小重复使用了相同的隐藏层两次。

  1. 当您第一次调用x = F.relu(self.hidden(x))时,隐藏层会自动由于输入x = nd.random.normal(shape=(1, 4))而发现输入大小为4。
  2. 它输出大小为10的NDArray(由于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)