如何将 .csv 训练数据提供给 mxnet 中的卷积神经网络?
How can I feed .csv training data to a convolutional neural network in mxnet?
我最近在 Windows 10 和 Python 3.5 上安装了支持 GPU 的 mxnet(python 软件包)。我 运行 通过几个示例,它们似乎工作正常。
我习惯了 scikit-learn 风格的机器学习包,并且对 Python 深度学习包(如 Mxnet)非常陌生,尽管我已经在 R 中使用过 Mxnet。我很难理解如何将 .csv 训练数据提供给模型。
我想向简单的 CNN 提供一些图像。图像为 28x28 像素,并以扁平化数组的形式存储在 .csv 中。我有两个 .csv 文件,一个用于训练,另一个用于测试。每个 .csv 文件具有以下结构:
label, pixel1, pixel2, ..., pixel784
0,...
1,...
训练 set/test 集中共有 10 个标签和大约 1000/300 张图像。
我正在使用以下代码加载数据和训练模型:
import mxnet as mx
import pandas as pd
import numpy as np
import os
path = "C://users//me//data"
os.chdir(path)
df_train = pd.read_csv("train_28.csv")
df_test = pd.read_csv("test_28.csv")
keys = ['pixel.'+str(i) for i in range(1,785)]
X_train = df_train[keys].get_values().T
X_train = X_train.reshape((1200,28,28,1))
y_train = df_train['label'].get_values().reshape((1200,1))
#y_train = y_train.reshape((28,28,1,1200))
data = mx.symbol.Variable('data')
# First conv layer
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 layer
conv2 = mx.symbol.Convolution(data=pool1, kernel=(5,5), 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 fully connected
flatten = mx.symbol.Flatten(data=pool2)
fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)
tanh3 = mx.symbol.Activation(data=fc1, act_type="tanh")
# second fullc
fc2 = mx.symbol.FullyConnected(data=tanh3, num_hidden=10)
# loss
lenet = mx.symbol.SoftmaxOutput(data=fc2, name='softmax')
device = mx.gpu()
model = mx.model.FeedForward.create(lenet,
X = X_train,
y = y_train,
ctx = device,
num_epoch = 30)
我正在使用这种方法,它类似于我在 R 中使用 mxnet 的方法,(顺便说一句,在 R 上它工作得很好,但是我不能在 R 上使用 GPU,所以我需要使用 Python为了更好的表现......)但是我收到以下错误:
[16:54:11] D:\chhong\mxnet\dmlc-core\include\dmlc/logging.h:235: [16:54:11] d:\chhong\mxnet\src\operator\./convolution-inl.h:347: Check failed: ksize_x <= dshape[3] && ksize_y <= dshape[2] kernel size exceed input
Traceback (most recent call last):
File "C:\Users\Me\Desktop\esempio_lenet.py", line 57, in <module>
num_epoch = 30)
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 901, in create
eval_batch_end_callback=eval_batch_end_callback)
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 745, in fit
self._init_params(dict(data.provide_data+data.provide_label))
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 485, in _init_params
arg_shapes, _, aux_shapes = self.symbol.infer_shape(**input_shapes)
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\symbol.py", line 453, in infer_shape
return self._infer_shape_impl(False, *args, **kwargs)
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\symbol.py", line 513, in _infer_shape_impl
ctypes.byref(complete)))
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\base.py", line 77, in check_call
raise MXNetError(py_str(_LIB.MXGetLastError()))
mxnet.base.MXNetError: InferShape Error in convolution0: [16:54:11] d:\chhong\mxnet\src\operator\./convolution-inl.h:347: Check failed: ksize_x <= dshape[3] && ksize_y <= dshape[2] kernel size exceed input
而且我不知道我做错了什么。请有人告诉我这个错误是什么,并为我提供一组清晰的说明,说明如何加载与上述结构相同的 .csv 文件并训练 mxnet 模型?我查看了文档,但无法自行弄清楚如何正确加载 .csv 文件...
我要求加载此类 .csv 文件的过程的原因是我主要处理那种格式的数据,能够 运行 脚本对我来说非常有价值包含这些 .csv 文件的文件夹,并准备好它们用于训练深度卷积神经网络。
一组训练和测试 .csv 文件可用 here 如果您需要它们来重现我编写的示例代码。
谢谢
问题出在这一行:
X_train = X_train.reshape((1200,28,28,1))
mxnet中第二个维度是feature maps,第三个和第四个维度是width和height,所以应该是:
X_train = X_train.reshape((1200,1,28,28))
我最近在 Windows 10 和 Python 3.5 上安装了支持 GPU 的 mxnet(python 软件包)。我 运行 通过几个示例,它们似乎工作正常。
我习惯了 scikit-learn 风格的机器学习包,并且对 Python 深度学习包(如 Mxnet)非常陌生,尽管我已经在 R 中使用过 Mxnet。我很难理解如何将 .csv 训练数据提供给模型。
我想向简单的 CNN 提供一些图像。图像为 28x28 像素,并以扁平化数组的形式存储在 .csv 中。我有两个 .csv 文件,一个用于训练,另一个用于测试。每个 .csv 文件具有以下结构:
label, pixel1, pixel2, ..., pixel784
0,...
1,...
训练 set/test 集中共有 10 个标签和大约 1000/300 张图像。
我正在使用以下代码加载数据和训练模型:
import mxnet as mx
import pandas as pd
import numpy as np
import os
path = "C://users//me//data"
os.chdir(path)
df_train = pd.read_csv("train_28.csv")
df_test = pd.read_csv("test_28.csv")
keys = ['pixel.'+str(i) for i in range(1,785)]
X_train = df_train[keys].get_values().T
X_train = X_train.reshape((1200,28,28,1))
y_train = df_train['label'].get_values().reshape((1200,1))
#y_train = y_train.reshape((28,28,1,1200))
data = mx.symbol.Variable('data')
# First conv layer
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 layer
conv2 = mx.symbol.Convolution(data=pool1, kernel=(5,5), 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 fully connected
flatten = mx.symbol.Flatten(data=pool2)
fc1 = mx.symbol.FullyConnected(data=flatten, num_hidden=500)
tanh3 = mx.symbol.Activation(data=fc1, act_type="tanh")
# second fullc
fc2 = mx.symbol.FullyConnected(data=tanh3, num_hidden=10)
# loss
lenet = mx.symbol.SoftmaxOutput(data=fc2, name='softmax')
device = mx.gpu()
model = mx.model.FeedForward.create(lenet,
X = X_train,
y = y_train,
ctx = device,
num_epoch = 30)
我正在使用这种方法,它类似于我在 R 中使用 mxnet 的方法,(顺便说一句,在 R 上它工作得很好,但是我不能在 R 上使用 GPU,所以我需要使用 Python为了更好的表现......)但是我收到以下错误:
[16:54:11] D:\chhong\mxnet\dmlc-core\include\dmlc/logging.h:235: [16:54:11] d:\chhong\mxnet\src\operator\./convolution-inl.h:347: Check failed: ksize_x <= dshape[3] && ksize_y <= dshape[2] kernel size exceed input
Traceback (most recent call last):
File "C:\Users\Me\Desktop\esempio_lenet.py", line 57, in <module>
num_epoch = 30)
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 901, in create
eval_batch_end_callback=eval_batch_end_callback)
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 745, in fit
self._init_params(dict(data.provide_data+data.provide_label))
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\model.py", line 485, in _init_params
arg_shapes, _, aux_shapes = self.symbol.infer_shape(**input_shapes)
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\symbol.py", line 453, in infer_shape
return self._infer_shape_impl(False, *args, **kwargs)
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\symbol.py", line 513, in _infer_shape_impl
ctypes.byref(complete)))
File "C:\Users\Me\Anaconda3\lib\site-packages\mxnet-0.7.0-py3.5.egg\mxnet\base.py", line 77, in check_call
raise MXNetError(py_str(_LIB.MXGetLastError()))
mxnet.base.MXNetError: InferShape Error in convolution0: [16:54:11] d:\chhong\mxnet\src\operator\./convolution-inl.h:347: Check failed: ksize_x <= dshape[3] && ksize_y <= dshape[2] kernel size exceed input
而且我不知道我做错了什么。请有人告诉我这个错误是什么,并为我提供一组清晰的说明,说明如何加载与上述结构相同的 .csv 文件并训练 mxnet 模型?我查看了文档,但无法自行弄清楚如何正确加载 .csv 文件...
我要求加载此类 .csv 文件的过程的原因是我主要处理那种格式的数据,能够 运行 脚本对我来说非常有价值包含这些 .csv 文件的文件夹,并准备好它们用于训练深度卷积神经网络。
一组训练和测试 .csv 文件可用 here 如果您需要它们来重现我编写的示例代码。
谢谢
问题出在这一行:
X_train = X_train.reshape((1200,28,28,1))
mxnet中第二个维度是feature maps,第三个和第四个维度是width和height,所以应该是:
X_train = X_train.reshape((1200,1,28,28))