Python 精度保持在50%Keras

Python 精度保持在50%Keras,python,machine-learning,keras,conv-neural-network,pre-trained-model,Python,Machine Learning,Keras,Conv Neural Network,Pre Trained Model,代码 我使用keras(使用VGG16网络传输学习)在猫和狗数据集()上实现了一个图像分类器。代码运行时没有错误,但在大约一半的历元中,精度保持在0.0%,而在半历元后,精度将增加到50%。我用氢原子 我真的不认为我对VGG16这样的数据集有偏见的问题(尽管我对这个领域比较陌生) 将输出层的激活更改为sigmoid 从 到 将最后一个激活层的大小从1更改为2。非常感谢它的工作。我认为softmax在二进制分类方面与sigmoid相同。()你能帮我解释一下为什么softmax不工作吗?2D s

代码

我使用keras(使用VGG16网络传输学习)在猫和狗数据集()上实现了一个图像分类器。代码运行时没有错误,但在大约一半的历元中,精度保持在0.0%,而在半历元后,精度将增加到50%。我用氢原子


我真的不认为我对VGG16这样的数据集有偏见的问题(尽管我对这个领域比较陌生)

将输出层的激活更改为sigmoid


将最后一个激活层的大小从1更改为2。非常感谢它的工作。我认为softmax在二进制分类方面与sigmoid相同。()你能帮我解释一下为什么softmax不工作吗?2D soft max相当于1D sigmoid。如果您想使用softmax,您需要使用Dense(2),这样softmax实际上可以区分两个类。在n个logits上运行softmax会给出n个和为1的数字。所以,如果你在一个logit上运行它,你总是得到一个1。@janbernlöhr是的,这就是我上面提供的解决方案。使用softmax对于二元分类任务来说是一种过分的方法。我完全同意使用sigmoid进行二元分类-它在计算上要求较少,并且在数值上应该更稳定。我的评论只是为了回答尼提亚的回答。谢谢@janbernlöhr,我尝试了两种解决方案,而乙状结肠的准确度实际上更高,直到三个时代之后,两者都有点饱和。
import numpy as np
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential,Model
from keras.layers import Dropout, Flatten, Dense,Input
from keras import applications
from keras.preprocessing import image
from keras import backend as K
K.set_image_dim_ordering('tf')


# dimensions of our images.
img_width, img_height = 150,150

top_model_weights_path = 'bottleneck_fc_model.h5'
train_data_dir = 'Cats and Dogs Dataset/train'
validation_data_dir = 'Cats and Dogs Dataset/validation'
nb_train_samples = 20000
nb_validation_samples = 5000
epochs = 50
batch_size = 16
input_tensor = Input(shape=(150,150,3))

base_model=applications.VGG16(include_top=False, weights='imagenet',input_tensor=input_tensor)
for layer in base_model.layers:
    layer.trainable = False

top_model=Sequential()
top_model.add(Flatten(input_shape=base_model.output_shape[1:]))
top_model.add(Dense(256,activation="relu"))
top_model.add(Dropout(0.5))
top_model.add(Dense(1,activation='softmax'))
top_model.load_weights(top_model_weights_path)
model = Model(inputs=base_model.input,outputs=top_model(base_model.output))


datagen = ImageDataGenerator(rescale=1. / 255)

train_data = datagen.flow_from_directory(train_data_dir,target_size=(img_width, img_height),batch_size=batch_size,classes=['dogs', 'cats'],class_mode="binary",shuffle=False)


validation_data = datagen.flow_from_directory(validation_data_dir,target_size=(img_width, img_height),classes=['dogs', 'cats'], batch_size=batch_size,class_mode="binary",shuffle=False)


model.compile(optimizer='adam',loss='binary_crossentropy', metrics=['accuracy'])

model.fit_generator(train_data, steps_per_epoch=nb_train_samples//batch_size, epochs=epochs,validation_data=validation_data, shuffle=False,verbose=
top_model.add(Dense(1,activation='softmax')) 
top_model.add(Dense(1,activation='sigmoid'))