我正在尝试使用 Gluon API 在 MXNet 中编写一个训练循环,并编写一个验证循环来评估经过训练的网络。
我目前正在尝试定义网络。我需要定义一个基于 LeNet 架构的网络,而不是原始 MNIST 数据的 10 个输出层,我应该有 2 个输出层。
我真的不知道该怎么做。我在创建网络时尝试包括 Flatten 和 Dense,但无论如何我都会收到以下错误。是否与 Conv2D 和 MaxPool2D 层中的某些设置有关?
编辑:在搞了更多之后,我现在认为它与损失函数有关...
def get_network():
"""
Should create the LeNet 10 network but with 2 output units instead of 10 and return a classification loss function
:return: the network and the loss function
:rtype: (gluon.Block, gluon.Block)
"""
net = None
loss_fn = None
# create a network
net = nn.Sequential()
net.add(
nn.Conv2D(channels=6, kernel_size=5, activation='relu'),
nn.MaxPool2D(pool_size=2, strides=2),
nn.Conv2D(channels=16, kernel_size=3, activation='relu'),
nn.MaxPool2D(pool_size=2, strides=2)
)
net.initialize(init=init.Xavier())
# choose and set loss_fn for a classification task
loss_fn = gluon.loss.SoftmaxCrossEntropyLoss()
return net, loss_fn
n, loss_fn = get_network()
assert isinstance(n[0], nn.Conv2D)
assert isinstance(n[2], nn.Conv2D)
assert isinstance(n[1], nn.MaxPool2D)
assert isinstance(n[3], nn.MaxPool2D)
for l in n[-3:]:
assert isinstance(l, nn.Dense)
我收到以下错误:
AssertionError Traceback (most recent call last)
<ipython-input-29-e1d75f4e8660> in <module>
7
8 for l in n[-3:]:
----> 9 assert isinstance(l, nn.Dense)
AssertionError:
答案 0 :(得分:0)
您应该为模型添加 3 个 Dense 层,以下代码将运行而不会出现任何错误:
from mxnet import init, gluon
from mxnet.gluon import nn
def get_network():
"""
Should create the LeNet 10 network but with 2 output units instead of 10 and return a classification loss function
:return: the network and the loss function
:rtype: (gluon.Block, gluon.Block)
"""
net = None
loss_fn = None
# create a network
net = nn.Sequential()
net.add(
nn.Conv2D(channels=6,kernel_size=5,activation='relu'),
nn.MaxPool2D(pool_size=2,strides=2),
nn.Conv2D(channels=16,kernel_size=3,activation='relu'),
nn.MaxPool2D(pool_size=2,strides=2),
nn.Dense(120, activation='relu'),
nn.Dense(84, activation='relu'),
nn.Dense(2))
net.initialize(init=init.Xavier())
# choose and set loss_fn for a classification task
loss_fn = gluon.loss.SoftmaxCrossEntropyLoss()
return net, loss_fn
n, loss_fn = get_network()
assert isinstance(n[0], nn.Conv2D)
assert isinstance(n[2], nn.Conv2D)
assert isinstance(n[1], nn.MaxPool2D)
assert isinstance(n[3], nn.MaxPool2D)
for l in n[-3:]:
assert isinstance(l, nn.Dense)
此外,here 是使用 FashionMNIST 训练 LeNet 的示例代码