Python Keras CNN-总是在一个平衡的数据集中预测同一类,但准确率很高-为什么?

Python Keras CNN-总是在一个平衡的数据集中预测同一类,但准确率很高-为什么?,python,keras,Python,Keras,我面临以下问题,首先我想给你代码,然后详细解释: #Just try to implement the modular from keras.models import Sequential from keras.layers import Convolution1D, MaxPooling1D from keras.layers import Dense, Dropout, Activation, Flatten, BatchNormalization from keras.optimizer

我面临以下问题,首先我想给你代码,然后详细解释:

#Just try to implement the modular
from keras.models import Sequential
from keras.layers import Convolution1D, MaxPooling1D
from keras.layers import Dense, Dropout, Activation, Flatten, BatchNormalization
from keras.optimizers import SGD
import numpy
from numpy import newaxis

dataset = numpy.loadtxt("example.csv", delimiter = ",")
X = dataset[:, 0:200]
Y = dataset[:, 200]
s1 = X.shape[0]
s2 = X.shape[1]
newshape = (s1, s2, 1)
X = numpy.reshape(X, newshape)
#print(X.shape[2])
model = Sequential()
model.add(Convolution1D(16, 3, border_mode = "same", input_shape = (200, 1)))
#model.add(Dense(12, input_dim=200, init='uniform', activation='relu'))
model.add(Activation('relu'))
model.add(BatchNormalization())
model.add(MaxPooling1D(pool_length = 2))
model.add(Convolution1D(32, 3, border_mode = "same"))
model.add(Convolution1D(32, 3, border_mode = "same"))
model.add(Activation('relu'))
model.add(MaxPooling1D(pool_length = 2))
model.add(Convolution1D(32, 3, border_mode = "same", activation = 'tanh'))
model.add(Convolution1D(32, 3, border_mode = "same", activation = 'tanh'))
model.add(Flatten())
model.add(BatchNormalization())
model.add(Dense(100, activation = 'tanh'))
model.add(Dropout(0.2))
model.add(Dense(50, activation = 'tanh'))
model.add(Dropout(0.2))
model.add(Dense(20, activation = 'tanh'))
model.add(Dropout(0.2))
model.add(Dense(1))
model.add(Activation('sigmoid'))
print("here1")

sgd = SGD(lr=0.1, decay=0.001, momentum=0.9, nesterov=True)
model.compile(loss = "binary_crossentropy", optimizer = sgd, metrics = ['accuracy'] )
print('here2')
model.fit(X, Y, batch_size = 64, nb_epoch = 1)
#print("here3")
#scores = model.evaluate(X, Y)
score = model.evaluate(X, Y, verbose = 0)
print(score)
output = model.predict(X, batch_size = 20,  verbose = 0)
print(output[0:100])
#print("%s: %.2f%%" % (model.metrics_names[1], score[1]*100))
#scores = model.evaluate(X, Y)
我所做的是:作为输入(X),我输入网络DNA代码(编码为数字),标签(Y)是二进制的(0或1)。我想预测Y。当我运行模型时,它的行为非常奇怪,至少在某种程度上我无法理解:

现在来看图片,我的问题是:关于预测标签输出(行的结果 打印(输出[0:100]) ) 模型总是预测0。然而,如上所述,精确度似乎非常高。为什么呢?请注意,数据集是平衡的,这意味着一半的观察值标记为1,一半标记为0。因此,用0预测所有值的准确率应为0.5

编辑:

当我被要求提供数据时,这里有一个截图。每行的最后一个数字是标签


可能您的数据没有正确缩放。作为调试步骤,您可以在最后一层上使用线性激活功能并查看结果

也许您解析的输入数据有问题,只需将数据添加到您的问题中即可?好的,我添加了数据的摘录。我相信这可能是输入_形状的问题,因为实际上我不太明白放在那里的内容,只是试着让它工作。谢谢!一般来说,最好将数据添加为文本,而不是图像,以便人们可以复制和粘贴它。如果您的数据是DNA,即4个不同的碱基,则最好使用4个二进制输入而不是1个线性输入。没有理由认为A应该是1和T4或任何其他任意数字。最明显的答案是,由于某些错误,所有Y输入都是零。作为一种健全性检查,您可以尝试打印Y(您正在培训的输入值)吗?理想情况下,打印Y中1和0的数量