【问题标题】:Keras Always Output a Constant ValueKeras 总是输出一个常数值
【发布时间】:2018-11-26 12:59:44
【问题描述】:

我一直在使用 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

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

【问题讨论】:

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


    【解决方案1】:

    如果您想让数据居中以使均值为零,只需从每个样本中减去样本均值即可。

    例如,如果您有 features 数据并希望将其居中以使均值为零,则可以使用 numpy's mean function 执行此操作,如下所示。

    features = features - np.mean(features)
    

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

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

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      您正在使用'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')
      ])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-12
        • 1970-01-01
        • 2020-03-08
        • 2018-12-18
        • 1970-01-01
        相关资源
        最近更新 更多