我一直在使用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
上面的链接告诉我,我必须将数据居中以使其均值为零。我不知道要这么做。
答案 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')
])