因此,上周我一直在学习一些机器学习,并且一直在搞自己的CNN回归,输入彩色图像128x128,输出等级。尽管我的数据集很小,总共有400多个结果,但是我得到了不错的结果,但有一点过拟合(训练的均值_绝对误差为0.5,训练用1-10的均值误差为0.9),模型如下所示:

model = keras.Sequential([
    keras.layers.Conv2D(32, kernel_size=(5, 5), strides=(1, 1), activation='relu', input_shape=(128, 128, 3)),
    keras.layers.Dropout(0.15),
    keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2)),
    keras.layers.Conv2D(64, kernel_size=(5, 5), activation='relu'),
    keras.layers.Dropout(0.15),
    keras.layers.MaxPooling2D(pool_size=(2, 2)),
    keras.layers.Flatten(),
    keras.layers.Dense(1000, activation='relu'),
    keras.layers.Dropout(0.4),
    keras.layers.Dense(1)
])


但是,由于对结果不满意,我想尝试经过尝试的真实模型。所以我用了AlexNet:

model = keras.Sequential([
    keras.layers.Conv2D(filters=96, kernel_size=(11, 11), strides=(4, 4), activation='relu', input_shape=(128, 128, 3), padding='same'),
    keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
    keras.layers.Conv2D(filters=256, kernel_size=(11, 11), strides=(1, 1), activation='relu', padding='same'),
    keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
    keras.layers.Conv2D(filters=384, kernel_size=(3, 3), strides=(1, 1), activation='relu', padding='same'),
    keras.layers.Conv2D(filters=384, kernel_size=(3, 3), strides=(1, 1), activation='relu', padding='same'),
    keras.layers.Conv2D(filters=256, kernel_size=(3, 3), strides=(1, 1), activation='relu', padding='same'),
    keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2), padding='same'),
    keras.layers.Flatten(),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dropout(0.4),
    keras.layers.Dense(4096, activation='relu'),
    keras.layers.Dropout(0.4),
    keras.layers.Dense(1000, activation='relu'),
    keras.layers.Dropout(0.4),
    keras.layers.Dense(1)
])


但是,它的收敛速度慢得多,在火车的MAE为1.2,测试的MAE为0.9的时候,收敛了很多。尽管这确实显示出不太适合,但我认为仍然得到相同的测试结果很奇怪。我对AlexNet的实现是否有缺陷,或者这不是AlexNet的正确应用程序。我了解它通常用于分类,但我认为进行回归分析可能值得尝试。任何信息/建议/批评都会有所帮助,谢谢!

最佳答案

我没有发现您的AlexNet实施有任何明显的错误。但我只想指出几件事。

第一个模型中使用的辍学方式

在卷积输出之后像这样应用Dropout不是标准的事情。当您以这种方式应用Dropout时,Convolution输出中的输出将随机关闭。但是与完全连接的层不同,卷积输出具有“空间”结构。我要说的是,与关闭随机神经元相比,切换全通道更有意义。我认为插图会有所帮助。想一想一个通道输出对应于一个完全连接层的单个神经元(不是最好的类比,但它有助于理解我的建议)。

tensorflow - 如何为不同用途定制AlexNet-LMLPHP

或另一个选择是在卷积输出之后删除Dropout,而在完全连接的层之后仅包含Dropout

融合AlexNet所需的时间

AlexNet比模型1大得多,这意味着比第一个模型更多的参数。因此,有必要花费更长的时间进行收敛。

为什么精度低?

我能想到的一件事是Flatten()层之前的输出大小。在模型1中,它是32x32,而在Alexnet中是4x4,这非常小。因此,完全连接的层几乎没有来自卷积层的信息。这可能导致AlexNet表现不佳(仅是一种推测)。

关于tensorflow - 如何为不同用途定制AlexNet,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57280261/

10-11 03:24