使用Googlenet和Alexnet模型无法在Cat vs Dog数据集中提供准确性

时间:2019-07-14 11:21:21

标签: tensorflow machine-learning keras neural-network computer-vision

我开始学习卷积神经网络,并设计了著名的MNIST和fashion-MNIST模型并获得了良好的准确性。 但是后来我转到了Kaggle的另一个琐碎数据集,即cat vs. Dog数据集,但是在应用了所有概念之后,我从斯坦福大学的讲座和Andrew ng的讲座中学到了,我只能获得80%的准确性。因此,我决定尝试使用GoogleNet和Alexnet,但是这些模型无法在6个周期内使我达到50%以上的准确性。

我想知道GoogleNet和ImageNet是否针对1000个类别的输出而设计,并且不适用于2个类别的输出?

在制作自己的模型时,我获得了80%的准确性。我希望著名的GoogleNet模型可以使我具有更高的准确性,但事实并非如此。

下面是我正在使用的GoogleNet模型:

data=[]
labels=[]
for i in range(0,12499):
    img=cv2.imread("train/cat."+str(i)+".jpg")
    res = cv2.resize(img, dsize=(224, 224), interpolation=cv2.INTER_CUBIC)
    data.append(res)
    labels.append(0);
    img2=cv2.imread("train/dog."+str(i)+".jpg")
    res2 = cv2.resize(img2, dsize=(224,224),interpolation=cv2.INTER_CUBIC)
    data.append(res2)
    labels.append(1);
train_data, test_data,train_labels, test_labels = train_test_split(data,
                                                labels,
                                                test_size=0.2,
                                                random_state=42)
model=tf.keras.Sequential()
model.add(layers.Conv2D(64,kernel_size=3,activation='relu', input_shape= 
(224,224,3)))
model.add(layers.Conv2D(64,kernel_size=3,activation='relu'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(layers.Conv2D(128,kernel_size=3,activation='relu'))
model.add(layers.Conv2D(128,kernel_size=3,activation='relu'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(layers.Conv2D(256,kernel_size=3,activation='relu'))
model.add(layers.Conv2D(256,kernel_size=3,activation='relu'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(layers.Conv2D(512,kernel_size=3,activation='relu'))
model.add(layers.Conv2D(512,kernel_size=3,activation='relu'))
model.add(layers.Conv2D(512,kernel_size=3,activation='relu'))
model.add(MaxPooling2D(pool_size=(3,3),strides=(2,2)))
model.add(layers.Conv2D(512,kernel_size=3,activation='relu'))
model.add(layers.Conv2D(512,kernel_size=3,activation='relu'))
model.add(layers.Conv2D(512,kernel_size=3,activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dense(4096,activation='relu'))
model.add(Dense(4096,activation='relu'))
model.add(Dense(2,activation='softmax'))

model.compile(optimizer=tf.train.AdamOptimizer(0.001), 
loss='sparse_categorical_c rossentropy',metrics=['accuracy'])
model.fit(x=train_data,y=train_labels,batch_size=32,epochs=10,
validation_data=(test_data,test_labels))

上述google模型的预期准确性应超过50%,但在6个时期后,准确性在50%至51%之间。

p.s我将最后一个致密层更改为2而不是1000,并且我使用Keras API进行张量流动。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我也为此稍作挣扎。我还没有在googlenet上尝试过,但是我在Alexnet上尝试过。在紧贴论文之后,我在猫与狗上成功取得了相对较好的结果(83%)。您可能想做的几件事:

  1. 如果您参考Fei Fei Li的CS231n注释 http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture9.pdf 在幻灯片10上,您会注意到输入层应改为227 x 227。他们还提供了数学依据 为什么会这样。
  2. 我开始尝试并严格遵循其他项目 纸在这里: https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf 其中包括:

    • 如论文第3.3节所述,在前两个最大池化层的末尾添加标准化层。 Keras不再支持LRN,但我添加了批处理规范化,并且可以正常工作。 (我在没有批处理归一化的情况下进行了模型实验。准确性差异为82%对62%

    • 如论文第4.2节所述,我在两个完全连接的层的末尾添加了两个退出层(0.5)。

    • 与论文第5部分一样,我将批次更改为128,SGD动量为0.9,重量衰减为0.0005

  3. 正如您在原始问题的评论之一中所指出的, 我的最后一层也是具有S型函数的一维。

训练20个纪元后,我的准确率达到了83%。在原始论文中,它们包括数据扩充,但我没有在实现中包括它。

Keras有一个经过修改的googlenet示例。它是从Xecption架构修改而来的,我相信它是初始架构的派生之一。 https://keras.io/examples/vision/image_classification_from_scratch/

我尝试过,运行15个纪元后,准确率约为90%

希望这会有所帮助。