我开始学习卷积神经网络,并设计了著名的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进行张量流动。
任何帮助将不胜感激。
答案 0 :(得分:0)
我也为此稍作挣扎。我还没有在googlenet上尝试过,但是我在Alexnet上尝试过。在紧贴论文之后,我在猫与狗上成功取得了相对较好的结果(83%)。您可能想做的几件事:
我开始尝试并严格遵循其他项目 纸在这里: 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
正如您在原始问题的评论之一中所指出的, 我的最后一层也是具有S型函数的一维。
训练20个纪元后,我的准确率达到了83%。在原始论文中,它们包括数据扩充,但我没有在实现中包括它。
Keras有一个经过修改的googlenet示例。它是从Xecption架构修改而来的,我相信它是初始架构的派生之一。 https://keras.io/examples/vision/image_classification_from_scratch/
我尝试过,运行15个纪元后,准确率约为90%
希望这会有所帮助。