【问题标题】:Best configuration parameters for a CNN image classification model in CNTKCNTK 中 CNN 图像分类模型的最佳配置参数
【发布时间】:2018-10-11 23:55:22
【问题描述】:

我有一个由 2 个图像组成的数据集用于观察。这些图像具有形状(1、128、118),它们是灰度图像,有 11 个类可以针对这个问题进行分类。使用这样的数据的 CNN 最好的方法是什么?我怎样才能最佳地定义例如我的 CNN 的层数、填充与否、步幅形状、我应该使用多少个池化层?更好的最大池或平均池?

这是我的模型的实际配置:

def create_model(features):
    with C.layers.default_options(init=C.glorot_uniform(), activation=C.ops.relu, pad= True):
            h = features

            h = C.layers.Convolution2D(filter_shape = (5,5),
                                       num_filters=8, strides = (2,2),
                                       pad=True, name = 'first_conv')(h)

            h = C.layers.AveragePooling(filter_shape = (5,5), strides=(2,2))(h)

            h = C.layers.Convolution2D(filter_shape = (5,5), num_filters=16, pad = True)(h)

            h = C.layers.AveragePooling(filter_shape = (5,5), strides=(2,2))(h) 

            h = C.layers.Convolution2D(filter_shape = (5,5), num_filters=32, pad = True)(h)

            h = C.layers.AveragePooling(filter_shape = (5,5), strides=(2,2))(h) 

            h = C.layers.Dense(96)(h) 

            h = C.layers.Dropout(dropout_rate=0.5)(h)

            r = C.layers.Dense(num_output_classes, activation=  None, name='classify')(h)

            return r

z = create_model(x)
# Print the output shapes / parameters of different components
print("Output Shape of the first convolution layer:", z.first_conv.shape)
print("Bias value of the last dense layer:", z.classify.b.value)

我一直在试验和调整配置,更改参数值,添加和删除层,但我的 CNN 似乎没有从我的数据中学习,它在最好的情况下收敛到某个点,然后它撞墙,错误停止减少。

我发现learning_ratenum_minibatches_to_train 参数很重要。我实际上设置了learning_rate = 0.2num_minibatches_to_train = 128 我也使用sgd 作为学习者。这是我上次输出结果的示例:

Minibatch: 0, Loss: 2.4097, Error: 95.31%
Minibatch: 100, Loss: 2.3449, Error: 95.31%
Minibatch: 200, Loss: 2.3751, Error: 90.62%
Minibatch: 300, Loss: 2.2813, Error: 78.12%
Minibatch: 400, Loss: 2.3478, Error: 84.38%
Minibatch: 500, Loss: 2.3086, Error: 87.50%
Minibatch: 600, Loss: 2.2518, Error: 84.38%
Minibatch: 700, Loss: 2.2797, Error: 82.81%
Minibatch: 800, Loss: 2.3234, Error: 84.38%
Minibatch: 900, Loss: 2.2542, Error: 81.25%
Minibatch: 1000, Loss: 2.2579, Error: 85.94%
Minibatch: 1100, Loss: 2.3469, Error: 85.94%
Minibatch: 1200, Loss: 2.3334, Error: 84.38%
Minibatch: 1300, Loss: 2.3143, Error: 85.94%
Minibatch: 1400, Loss: 2.2934, Error: 92.19%
Minibatch: 1500, Loss: 2.3875, Error: 85.94%
Minibatch: 1600, Loss: 2.2926, Error: 90.62%
Minibatch: 1700, Loss: 2.3220, Error: 87.50%
Minibatch: 1800, Loss: 2.2693, Error: 87.50%
Minibatch: 1900, Loss: 2.2864, Error: 84.38%
Minibatch: 2000, Loss: 2.2678, Error: 79.69%
Minibatch: 2100, Loss: 2.3221, Error: 92.19%
Minibatch: 2200, Loss: 2.2033, Error: 87.50%
Minibatch: 2300, Loss: 2.2493, Error: 87.50%
Minibatch: 2400, Loss: 2.4446, Error: 87.50%
Minibatch: 2500, Loss: 2.2676, Error: 85.94%
Minibatch: 2600, Loss: 2.3562, Error: 85.94%
Minibatch: 2700, Loss: 2.3290, Error: 82.81%
Minibatch: 2800, Loss: 2.3767, Error: 87.50%
Minibatch: 2900, Loss: 2.2684, Error: 76.56%
Minibatch: 3000, Loss: 2.3365, Error: 90.62%
Minibatch: 3100, Loss: 2.3369, Error: 90.62%

有什么建议可以改善我的结果吗?我愿意接受任何提示/探索。

提前谢谢你

【问题讨论】:

标签: python-3.x machine-learning neural-network deep-learning cntk


【解决方案1】:

无论如何,要回答这个问题,通常在你刚开始的时候,我建议你的卷积层保持你的 filter_shape 为 (3, 3) 并且步幅应该是 1。

对于池化层,坚持使用 maxpooling,直到您在深度学习方面做得更好。对于 maxpooling 层,filter_shape=(2, 2) 和 stride=(2,2)

通常,您有 2-3 个 conv 层,然后是一个 maxpooling 层,重复此序列,直到您将尺寸减小到易于使用的程度。

对于学习者,您应该使用 adam。它需要最小的调整。您可以使用 1e-3 或 1e-4 的学习率作为开始。您可以将动量设置为 0.9。

对于 minibatch 大小,一开始就保持为 16 或 32。

此外,当您第一次尝试使模型收敛时,不要退出。辍学阻碍收敛。确定模型正常工作后,重新添加 dropout 以进行正则化。

【讨论】:

  • 0.01 是 1e-2,使用 1e-3 或 1e-4 或 1e-5 作为学习率。如果训练没有收敛,请将学习率降低一半或一个数量级。对于您的损失函数,您是否使用 cross_entropy_with_softmax?
  • 一开始会很快减少然后变平。像这些ibm.com/blogs/research/wp-content/uploads/2018/02/…
  • 训练损失很少会降到零,除非你过度拟合/记忆这是你不想做的事情。
  • 它是否具有良好的错误率实际上取决于您正在处理的特定数据集。当您使用 conv net 时,您使用的参数数量比仅使用 Dense 层要少得多。所以如果你考虑到你使用的参数数量,我相信你会发现卷积网络更高效。
  • 你可能想看看这个。 stackoverflow.com/questions/52840888/… 如果还是不能得到好的结果,可能需要重新安装cntk。 @Miguel2488
猜你喜欢
  • 2020-10-09
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
  • 2018-06-06
  • 2019-12-22
相关资源
最近更新 更多