keras CNN 1-D - >为什么所有预测的类都返回相同?

时间:2018-02-15 19:22:05

标签: machine-learning neural-network keras output conv-neural-network

我编写了CNN 1-D,但是在执行model.predict_classes(X)命令时,所有返回的类都是相同的。返回示例位于以下屏幕中。为什么所有预测的类都返回相同?我已经将输入更改为不同的输入,结果保持不变。

model = ke.models.Sequential() 
nbfeatures=5
model.add(Conv1D(filters=2,kernel_size=2,input_shape=(nbfeatures, 1),activation = 'relu')) 
model.add(Conv1D(filters=2,kernel_size=2)) 
model.add( MaxPool1D(pool_size=2))
model.add( Flatten())
model.add(Dropout(0.4))
model.add( Dense(2))
model.add(Activation('softmax'))
sgd = optimizers.SGD(lr=0.01, nesterov=True, decay=1e-6, momentum=0.9)
model.compile(loss='sparse_categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

# get some data
#X = np.expand_dims(np.random.randn(1000, 5), axis=2)
X = np.expand_dims([[1,2,3,4,5],[1,1,1,1,1],[1,2,3,4,5],[1,2,3,4,5], [1,2,3,4,5],[1,1,1,1,1],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5],[1,2,3,4,5]], axis=2)
#y = [np.random.randint(0,2) for p in range(0,10)]
y=[[1],[0],[1],[1],[1],[0],[1],[1],[1],[1]]
y=np.array(y)
y = np.reshape(np.array(y), (y.shape[0],1))

# fit model
model.fit(X, y,batch_size=5, epochs=3, verbose=1)
predictions = model.predict(X)
Y_predict = model.predict_classes(X)

screen - output CNN

2 个答案:

答案 0 :(得分:1)

在对此进行试验之后,我认为这个问题是由于培训示例数量少以及每个类的所有示例都相同的事实。正如马蒂亚斯所说,培训班的不平衡也不是理想的。但是,实际上,我认为相同的例子会导致最多的问题,因为调整权重的学习途径对于每个类的所有示例都是相同的。

因此,由于培训示例很少,您需要增加迭代次数或增加过滤器数量(或两者)。学习率也可以在这里发挥作用,但要正确调整是比较棘手的。

我提出的,似乎可靠地运行,以下是我稍微增加了过滤器的数量和迭代次数。这不是一个很大的问题,因为训练数据非常小,而且仍然很快完成。由于每个类中信号的性质,内核大小为2的选择不应成为问题(一个类与1没有偏差,因此跨2个特征的卷积应该可以区分它们)。以下代码似乎对我有用(注意:我已经平衡了训练数据,虽然它没有太大的区别):

from keras.models import Sequential
from keras.layers import Conv1D, Dense, MaxPool1D, Flatten
import numpy as np

n_features = 5

model = Sequential()
model.add(
    Conv1D(
        filters=10,
        kernel_size=2,
        input_shape=(n_features, 1)
    )
)
model.add(MaxPool1D(pool_size=1))
model.add(Flatten())
model.add(Dense(1, activation='sigmoid'))

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

print(model.summary())

# get some data
X = np.array(
    [[1, 2, 3, 4, 5], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5],
     [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 2, 3, 4, 5], [1, 2, 3, 4, 5]],
    dtype=np.float32
)
X = np.expand_dims(X, axis=2)

y = np.array([1, 0, 0, 1, 1, 0, 0, 0, 1, 1])

# fit model
model.fit(X, y, epochs=1000)

predictions = model.predict(X)
Y_predict_classes = model.predict_classes(X)

我有兴趣听取其他人对此网络的其他优化和简化的意见。

答案 1 :(得分:0)

因为80%的标签是" 1"所以网络学会总是输出" 1"这很容易获得80%的准确率。您的标签应该平衡,以便学习顺利。