Keras始终输出恒定值

时间:2018-11-26 12:59:45

标签: python tensorflow machine-learning keras neural-network

我一直在使用Keras训练简单的人工神经网络

model = Sequential([
    Dense(32, input_shape=(32,), activation = 'relu'),
    Dense(20, activation='relu'),
    Dense(65, input_shape=(65,), activation='softmax')
])

model.summary()
model.compile(Adam(lr=.001), loss='binary_crossentropy', metrics=['accuracy'])
model.fit(train_samples, train_labels, batch_size=1000, epochs=10000,shuffle = True, verbose=2)

训练后,我测试模型,并且它始终输出恒定值。我该怎么办?

https://github.com/keras-team/keras/issues/1727

上面的链接告诉我,我必须将数据居中以使其均值为零。我不知道要这么做。

2 个答案:

答案 0 :(得分:1)

如果要将数据的平均值设为零,请从每个样本中减去样本平均值。

例如,如果您拥有features数据,并且希望将其平均值设为零均值,则可以使用numpy's mean function进行以下操作。

features = features - np.mean(features)

您可能还需要使用标准偏差进行归一化。这可以通过如下使用numpy来实现。

normalized_features = (features - np.mean(features))/ np.std(features)

我希望这会有所帮助。

答案 1 :(得分:1)

您正在使用'relu'激活,而不必关心它全为零。

当输入为负时,Relu具有一个“零区域”,并且该区域自然没有梯度,因此不可能在训练过程中改变它。

如果一层中的所有神经元都归零,则模型将永远冻结。

您可以做的一件事是将'relu'替换为'sigmoid''tanh'
另一件事是在其之前使用BatchNormalization层。

BatchNormalization可以为您进行居中,除了可以提高训练速度和一些正则化之外。

model = Sequential([

    #optional BatchNormalization(input_shape(32,))

    Dense(32, input_shape=(32,)),
    BatchNormalization(),
    Activation('relu')
    Dense(20),
    BatchNormalization(),
    Activation('relu'),
    Dense(65, input_shape=(65,), activation='softmax')
])