如何使用 MXNet 进行图像分类?
how to do image classification with MXNet?
我刚开始使用 MXNet,我已经根据一些教程使用 MNIST 编写并训练了一个 CNN。现在我想实际发送一张图片到这个 CNN 并从中得到一个结果,我应该怎么做?
这是我的代码:
def get_lenet():
data = mx.symbol.Variable('data')
# first conv
conv1 = mx.symbol.Convolution(data=data, kernel=(5,5), num_filter=20)
tanh1 = mx.symbol.Activation(data=conv1, act_type="tanh")
pool1 = mx.symbol.Pooling(data=tanh1, pool_type="max",
kernel=(2,2), stride=(2,2))
# second conv
conv2 = mx.symbol.Convolution(data=pool1, kernel=(4,4), num_filter=50)
tanh2 = mx.symbol.Activation(data=conv2, act_type="tanh")
pool2 = mx.symbol.Pooling(data=tanh2, pool_type="max",
kernel=(2,2), stride=(2,2))
# first fullc
flatten = mx.symbol.Flatten(data=pool2)
fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)
tanh4 = mx.symbol.Activation(data=fc1, act_type="tanh")
# second fullc
fc2 = mx.symbol.FullyConnected(data=tanh4, num_hidden=10)
# loss
lenet = mx.symbol.SoftmaxOutput(data=fc2, name='softmax')
return lenet
logging.getLogger().setLevel(logging.DEBUG)
model = mx.model.FeedForward(
ctx=mx.cpu(),
symbol=get_lenet(),
num_epoch=5,
learning_rate=0.1
)
model.fit(
X=train_iter,
eval_data=val_iter,
batch_end_callback=mx.callback.Speedometer(batch_size, 200)
)
在此先感谢您的帮助
您正在使用 MXNet 的模型 API,该模型已被弃用,取而代之的是 Module API。但是,在您的具体示例中,您可以 运行 使用此代码进行推断:preds = model.predict(infer_iter)
其中 infer_iter
是推理图像的 DataIter。如果你只想输入一张图片,你可以创建一个 NDArrayIter
并将 data
字段设置为包含图片的 numpy 数组:
# Replace this line with real test data
test_data = np.random.uniform(size=(1, 1, 28, 28))
# Create data iterator
test_iter = mx.io.NDArrayIter(test_data)
# Perform inference
prediction = model.predict(test_iter)
print("prediction: ", np.argmax(prediction, axis=1))
我还建议您看一下 Gluon 中的 Gluon API, which is significantly easier to understand and debug. Here is a tutorial on convolutional networks。
我刚开始使用 MXNet,我已经根据一些教程使用 MNIST 编写并训练了一个 CNN。现在我想实际发送一张图片到这个 CNN 并从中得到一个结果,我应该怎么做?
这是我的代码:
def get_lenet():
data = mx.symbol.Variable('data')
# first conv
conv1 = mx.symbol.Convolution(data=data, kernel=(5,5), num_filter=20)
tanh1 = mx.symbol.Activation(data=conv1, act_type="tanh")
pool1 = mx.symbol.Pooling(data=tanh1, pool_type="max",
kernel=(2,2), stride=(2,2))
# second conv
conv2 = mx.symbol.Convolution(data=pool1, kernel=(4,4), num_filter=50)
tanh2 = mx.symbol.Activation(data=conv2, act_type="tanh")
pool2 = mx.symbol.Pooling(data=tanh2, pool_type="max",
kernel=(2,2), stride=(2,2))
# first fullc
flatten = mx.symbol.Flatten(data=pool2)
fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)
tanh4 = mx.symbol.Activation(data=fc1, act_type="tanh")
# second fullc
fc2 = mx.symbol.FullyConnected(data=tanh4, num_hidden=10)
# loss
lenet = mx.symbol.SoftmaxOutput(data=fc2, name='softmax')
return lenet
logging.getLogger().setLevel(logging.DEBUG)
model = mx.model.FeedForward(
ctx=mx.cpu(),
symbol=get_lenet(),
num_epoch=5,
learning_rate=0.1
)
model.fit(
X=train_iter,
eval_data=val_iter,
batch_end_callback=mx.callback.Speedometer(batch_size, 200)
)
在此先感谢您的帮助
您正在使用 MXNet 的模型 API,该模型已被弃用,取而代之的是 Module API。但是,在您的具体示例中,您可以 运行 使用此代码进行推断:preds = model.predict(infer_iter)
其中 infer_iter
是推理图像的 DataIter。如果你只想输入一张图片,你可以创建一个 NDArrayIter
并将 data
字段设置为包含图片的 numpy 数组:
# Replace this line with real test data
test_data = np.random.uniform(size=(1, 1, 28, 28))
# Create data iterator
test_iter = mx.io.NDArrayIter(test_data)
# Perform inference
prediction = model.predict(test_iter)
print("prediction: ", np.argmax(prediction, axis=1))
我还建议您看一下 Gluon 中的 Gluon API, which is significantly easier to understand and debug. Here is a tutorial on convolutional networks。