【发布时间】: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