【问题标题】:Using Googlenet and Alexnet Model is not giving accuracy on the Cat vs Dog dataset使用 Googlenet 和 Alexnet 模型并不能提供 Cat vs Dog 数据集的准确性
【发布时间】:2019-11-23 09:37:18
【问题描述】:

我开始学习卷积神经网络,设计了著名的 MNIST 和 fashion-MNIST 模型,并获得了很好的准确性。 但后来我转移到另一个琐碎的数据集,即来自 Kaggle 的 cat vs. Dog 数据集,但在应用了我所有的概念之后,我从斯坦福讲座和 Andrew ng 讲座中学到,我只能获得 80% 的准确率。因此,我决定尝试 GoogleNet 和 Alexnet,但这些模型无法在 6 个 epoch 上为我提供超过 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))

上述谷歌模型的预期准确率应该在 50% 以上,但在 6 个 epoch 之后,它的范围在 50% 到 51% 之间。

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

任何帮助将不胜感激。

【问题讨论】:

  • 你能分享剩下的代码吗?共享的部分看起来不错,可能问题出在其他地方。
  • 嗨,我已经编辑了答案,现在它包含了完整的代码。
  • 您在哪里对标签进行编码?您有 2 维的 softmax 输出,但您的 Y 列只有 1 维。
  • 顺便说一句,您正在从头开始训练这个架构。在这种情况下,您要做的是让预训练网络为您的数据集应用迁移学习。
  • @SıddıkAçıl 标签在代码的最开始进行编码。此外,迁移学习用处不大,因为 OP 解决了相当基本的问题:网络不学习。下一步:用“sparse_categorical_accuracy”替换“accuracy”并将学习率更改为例如0.1。此外,假设第一个建议不起作用,请告诉我们您报告的准确度(训练/测试)以及损失如何变化。

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


【解决方案1】:

我之前也遇到了一些困难。我还没有在 googlenet 上尝试过,但我在 Alexnet 上尝试过。在 Alexnet 上,在密切关注论文之后,我设法获得了猫与狗的相对较好的结果 (83%)。您可能想做的几件事:

  1. 如果参考李飞飞的 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 节一样,我在两个全连接层的末尾添加了两个 dropout 层 (0.5)。

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

  3. 正如您在原始问题中的一个 cmets 中指出的那样, 我的最后一层也是具有 sigmoid 函数的单一维度。

20 个 epoch 的训练给了我 83% 的准确率。在原始论文中,它们包含了数据增强,但我没有将其包含在我的实现中。

Keras 有一个修改后的 googlenet 示例。它是从 Xecption 架构修改而来的,相信是 inception 架构的衍生产品之一。 https://keras.io/examples/vision/image_classification_from_scratch/

我试过了,运行了 15 个 epoch 后,准确率在 90% 左右

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-16
    • 2018-09-11
    • 2010-09-29
    • 1970-01-01
    • 2018-07-14
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多