我试图训练/使用带有neupy库的卷积神经网络进行项目,但我在训练阶段遇到错误。
我有很多图像(rgb,shape = 66,160,3),我将它们分成训练和测试集。然后,我试图训练一个卷积神经网络(我将尝试使用不同的算法,层数和大小进行优化)。我的项目的目标输出是数字[-1,1],我解决了回归问题,但我之前遇到过问题。
我现在得到的错误是: ValueError:无法随机播放矩阵。所有矩阵应具有相同的行数
相关代码:
print numpy.array(y_train).shape
# outputs (84, 66, 160, 3)
print numpy.array(y_test).shape
# outputs (15, 66, 160, 3)
cgnet = algorithms.Adadelta(
[
layers.Input((6, 66, 160*3)),
layers.Convolution((8, 3, 3)),
layers.Relu(),
layers.Convolution((8, 3, 3)),
layers.Relu(),
layers.MaxPooling((2, 2)),
layers.Reshape(),
layers.Linear(1024),
layers.Softmax(10),
],
error='categorical_crossentropy',
step=1.0,
verbose=True,
shuffle_data=True,
#shuffle_data=False,
reduction_freq=8,
addons=[algorithms.StepDecay],
)
print cgnet.architecture()
cgnet.train(x_train, y_train, x_test, y_test, epochs=100)
输出:
Main information
[ALGORITHM] Adadelta
[OPTION] batch_size = 128
[OPTION] verbose = True
[OPTION] epoch_end_signal = None
[OPTION] show_epoch = 1
[OPTION] shuffle_data = True
[OPTION] step = 1.0
[OPTION] train_end_signal = None
[OPTION] error = categorical_crossentropy
[OPTION] addons = ['StepDecay']
[OPTION] decay = 0.95
[OPTION] epsilon = 1e-05
[OPTION] reduction_freq = 8
[THEANO] Initializing Theano variables and functions.
[THEANO] Initialization finished successfully. It took 7.01 seconds
Network's architecture
-------------------------------------------------
| # | Input shape | Layer Type | Output shape |
-------------------------------------------------
| 1 | (6, 66, 480) | Input | (6, 66, 480) |
| 2 | (6, 66, 480) | Convolution | (8, 64, 478) |
| 3 | (8, 64, 478) | Relu | (8, 64, 478) |
| 4 | (8, 64, 478) | Convolution | (8, 62, 476) |
| 5 | (8, 62, 476) | Relu | (8, 62, 476) |
| 6 | (8, 62, 476) | MaxPooling | (8, 31, 238) |
| 7 | (8, 31, 238) | Reshape | 59024 |
| 8 | 59024 | Linear | 1024 |
| 9 | 1024 | Softmax | 10 |
-------------------------------------------------
None
Start training
[TRAIN DATA] 84 samples, feature shape: (66, 160, 3)
[TEST DATA] 15 samples, feature shape: (66, 160, 3)
[TRAINING] Total epochs: 100
------------------------------------------------
| Epoch # | Train err | Valid err | Time |
------------------------------------------------
Traceback (most recent call last):
File "./ml_neupy.py", line 68, in <module>
cgnet.train(x_train, y_train, x_test, y_test, epochs=100)
File "/usr/local/lib/python2.7/dist-packages/neupy/algorithms/constructor.py", line 539, in train
*args, **kwargs
File "/usr/local/lib/python2.7/dist-packages/neupy/algorithms/learning.py", line 49, in train
summary=summary
File "/usr/local/lib/python2.7/dist-packages/neupy/algorithms/base.py", line 409, in train
target_train)
File "/usr/local/lib/python2.7/dist-packages/neupy/algorithms/utils.py", line 146, in shuffle
raise ValueError("Cannot shuffle matrices. All matrices should "
ValueError: Cannot shuffle matrices. All matrices should have the same number of rows
输入数据或网络有什么问题?
由于
答案 0 :(得分:2)
您需要修改一些内容:
您已经提到过您正试图解决回归问题。您的网络将Softmax图层作为输出,这意味着您的网络只能为您提供[0,1]范围的输出,而不是[-1,1]。您可以将其更改为Tanh图层。它将产生[-1,1]范围的输出。
仅适用于分类问题的交叉熵误差
error='categorical_crossentropy'
对于回归,您可以使用MSE或RMSE(您可以找到更多错误函数here)
error='mse'
我假设在(66,160,3)中,形状编号3定义了每个RGB通道。 NeuPy与Theano库一起使用,这意味着您需要在图像的宽度和高度之前定义通道形状。正确的顺序是:(n_samples, n_channels, height, width)
。在您的情况下,我假设您有84个样本,66像素的高度,160像素的宽度和3个通道(RGB)。如果是,那么您需要转换输入如下
# convert this shape (n_samples, height, width, n_channels)
# to (n_samples, n_channels, height, width)
x_train = x_train.transpose((0, 3, 1, 2))
print(x_train.shape) # (84, 3, 66, 160)
最终图层的输出应为1而不是10.这意味着每个样本只预测一个值,而不是预测10个值的向量(使用layers.Tanh(1)
而不是layers.Softmax(10)
)
以下代码可以正常运行(无法正确训练,因为值是随机的):
import numpy
from neupy import algorithms, layers
x_train = numpy.random.random((84, 3, 66, 160))
x_test = numpy.random.random((15, 3, 66, 160))
y_train = numpy.random.random(84)
y_test = numpy.random.random(15)
cgnet = algorithms.Adadelta(
[
layers.Input((3, 66, 160)),
layers.Convolution((8, 3, 3)),
layers.Relu(),
layers.Convolution((8, 3, 3)),
layers.Relu(),
layers.MaxPooling((2, 2)),
layers.Reshape(),
layers.Linear(1024),
layers.Tanh(1),
],
error='mse',
step=1.0,
verbose=True,
shuffle_data=True,
reduction_freq=8,
addons=[algorithms.StepDecay],
)
cgnet.architecture()
cgnet.train(x_train, y_train, x_test, y_test, epochs=100)