我的模型运行良好吗?
Is my model working well?
我研究CNN有一段时间了,还不是很了解。所以我插入了我认为重要的内容。
我有一个包含 1400 张图像的手势数据集,其中 10 张 类。我正在 spyder IDE 中的 keras 中构建 CNN 模型。顺序如下。
model = Sequential()
model.add(Convolution2D(32, 3,3,border_mode='same', input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop',metrics=["accuracy"])
我用 30 个 epoch 训练它并获得:
Test Loss: 0.260991449015
Test accuracy: 0.928571430274
precision recall f1-score support
class 0 1.00 0.93 0.96 28
class 1 0.96 0.96 0.96 26
class 2 0.92 1.00 0.96 24
class 3 0.72 0.87 0.79 30
class 4 0.97 0.97 0.97 35
class 5 0.90 0.93 0.92 29
class 6 0.93 1.00 0.97 28
class 7 1.00 0.97 0.98 33
class 8 1.00 0.95 0.97 19
class 9 0.95 0.71 0.82 28
avg / total 0.93 0.93 0.93 280
Confusion matrix, without normalization
[[26 0 0 0 1 0 1 0 0 0]
[ 0 25 1 0 0 0 0 0 0 0]
[ 0 0 24 0 0 0 0 0 0 0]
[ 0 0 1 26 0 3 0 0 0 0]
[ 0 1 0 0 34 0 0 0 0 0]
[ 0 0 0 1 0 27 1 0 0 0]
[ 0 0 0 0 0 0 28 0 0 0]
[ 0 0 0 0 0 0 0 32 0 1]
[ 0 0 0 1 0 0 0 0 18 0]
[ 0 0 0 8 0 0 0 0 0 20]]
accuracy,
loss
Q1:这个模型做的好吗?
Q2:我是不是过拟合了?
Q3:如何用最好的方式对 CNN 建模?
感谢您的宝贵时间
考虑到您的测试数据集的混淆矩阵在矩阵的对角线部分具有非常高的数字,而在其他地方几乎为零,这表明您的模型已正确拟合(除了在您输入的情况下) 8 在你的混淆矩阵中)。
但是查看您提到的数据集,它仅包含 1400 张图像和 10 class 个图像,平均每个 class 140 张图像。 140 个示例对于神经网络的泛化来说并不是一个很好的数字。我不确定,您的数据集中有多少多样性,以及您希望如何在生产中部署您的网络。
例如,假设您的数据集包含所有具有绿色背景的图像,并且直接只存在手部图像。如果在测试时,您可以以某种方式模拟这种行为,即绿色背景和只有手部图像,那么您的网络可能在生产中表现良好。但是想象一下,如果这种类型的条件没有得到模拟并且您将模型部署到生产环境中,那么您的模型很可能表现不佳。
要在您的数据集中增加多样性,您可以利用 ImageDataGenerator 并模拟各种类型的失真,以便您的网络学习更多所需的功能。
我研究CNN有一段时间了,还不是很了解。所以我插入了我认为重要的内容。
我有一个包含 1400 张图像的手势数据集,其中 10 张 类。我正在 spyder IDE 中的 keras 中构建 CNN 模型。顺序如下。
model = Sequential()
model.add(Convolution2D(32, 3,3,border_mode='same', input_shape=input_shape))
model.add(Activation('relu'))
model.add(Convolution2D(32, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(Convolution2D(64, 3, 3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='rmsprop',metrics=["accuracy"])
我用 30 个 epoch 训练它并获得:
Test Loss: 0.260991449015
Test accuracy: 0.928571430274
precision recall f1-score support
class 0 1.00 0.93 0.96 28
class 1 0.96 0.96 0.96 26
class 2 0.92 1.00 0.96 24
class 3 0.72 0.87 0.79 30
class 4 0.97 0.97 0.97 35
class 5 0.90 0.93 0.92 29
class 6 0.93 1.00 0.97 28
class 7 1.00 0.97 0.98 33
class 8 1.00 0.95 0.97 19
class 9 0.95 0.71 0.82 28
avg / total 0.93 0.93 0.93 280
Confusion matrix, without normalization
[[26 0 0 0 1 0 1 0 0 0]
[ 0 25 1 0 0 0 0 0 0 0]
[ 0 0 24 0 0 0 0 0 0 0]
[ 0 0 1 26 0 3 0 0 0 0]
[ 0 1 0 0 34 0 0 0 0 0]
[ 0 0 0 1 0 27 1 0 0 0]
[ 0 0 0 0 0 0 28 0 0 0]
[ 0 0 0 0 0 0 0 32 0 1]
[ 0 0 0 1 0 0 0 0 18 0]
[ 0 0 0 8 0 0 0 0 0 20]]
accuracy, loss
Q1:这个模型做的好吗? Q2:我是不是过拟合了? Q3:如何用最好的方式对 CNN 建模?
感谢您的宝贵时间
考虑到您的测试数据集的混淆矩阵在矩阵的对角线部分具有非常高的数字,而在其他地方几乎为零,这表明您的模型已正确拟合(除了在您输入的情况下) 8 在你的混淆矩阵中)。
但是查看您提到的数据集,它仅包含 1400 张图像和 10 class 个图像,平均每个 class 140 张图像。 140 个示例对于神经网络的泛化来说并不是一个很好的数字。我不确定,您的数据集中有多少多样性,以及您希望如何在生产中部署您的网络。 例如,假设您的数据集包含所有具有绿色背景的图像,并且直接只存在手部图像。如果在测试时,您可以以某种方式模拟这种行为,即绿色背景和只有手部图像,那么您的网络可能在生产中表现良好。但是想象一下,如果这种类型的条件没有得到模拟并且您将模型部署到生产环境中,那么您的模型很可能表现不佳。
要在您的数据集中增加多样性,您可以利用 ImageDataGenerator 并模拟各种类型的失真,以便您的网络学习更多所需的功能。