【问题标题】:Tensorflow neural network doesn’t learnTensorFlow 神经网络不学习
【发布时间】:2020-10-29 23:13:17
【问题描述】:

我为一个大学项目构建了一个神经网络。目标是找出传感器数据(温度、湿度和光线)是否可以预测日出是否发生在给定的时间范围内。所以,它是一个二元分类。 问题是网络不学习。精度收敛到大约 0.8,并且在大约 5 个 epoch 后没有变化。与损失相同,在几个时期后约为 0.4921。我尝试了几种方法,例如更改激活函数或隐藏层的数量,但没有任何效果。

我还创建了一个包含等量“日出 = 1”和“日出 = 0”数据点的数据集。准确度最终恰好为 0,5。因此我认为网络设置本身有问题。

你知道哪里出了问题吗?

这是我的代码:

def build_network():
input = keras.Input(shape=(4,25), name="input")
hidden = layers.Dense(1000, activation="sigmoid", name="dense1")(input)
hidden = layers.Dense(1000, activation="sigmoid", name="dense2")(hidden)
hidden = layers.Flatten()(hidden)
hidden = layers.Dense(500, activation="sigmoid", name="dense3")(hidden)
hidden = layers.Dense(500, activation="sigmoid", name="dense4")(hidden)
hidden = layers.Dense(10, activation="sigmoid", name="dense5")(hidden)
output = layers.Dense(1, activation="sigmoid", name="output")(hidden)
model = keras.Model(inputs=input, outputs=output, name="sunrise_model")
return model

 def train_model():
training_files = r'data/training'
test_files = r'data/test'

print('reding files...')
train_x, train_y = load_data(training_files)
test_x, test_y = load_data(test_files)

print("training network")

# compile model
model = build_network()
model.compile(
    loss=keras.losses.BinaryCrossentropy(from_logits=False),
    optimizer=keras.optimizers.RMSprop(),
    metrics=["accuracy"],
)

# Train / fit
model.fit(train_x, train_y, batch_size=100, epochs=200)

# evaluate
test_scores = model.evaluate(test_x, test_y, verbose=2)
print("Test loss:", test_scores[0])
print("Test accuracy:", test_scores[1])

这是输出:损失:0.4921 - 准确度:0.8225

测试损失:0.4921109309196472, 测试精度:0.8225

以下是数据示例:https://hastebin.com/hazipagija.json

【问题讨论】:

  • 你是如何初始化你的参数的?看起来所有参数都为零,所以反向传播不起作用。
  • 我认为 model.fit 初始化它。所以我认为这就是问题所在。感谢您的快速答复。我会初始化参数,然后看看它是否可以工作
  • Keras 负责参数初始化,这不是问题。我更怀疑在所有隐藏层中使用 sigmoid 激活,这会产生消失的梯度,为什么不在隐藏层中使用 ReLU?
  • 我在layers中也使用了relu,但问题是一样的。我刚刚尝试了一些激活函数 - 也混合了 sigmoid 和 relu

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


【解决方案1】:

我会使用 RELU 而不是 sigmoid 作为激活函数。你使用的学习率是多少?尝试较小的学习率。实际上,我发现使用可变学习率可以获得最佳结果。 Keras 回调 ReduceLROnPlateau 使这很容易做到。文档是 here. 我还建议您使用 Keras 回调 ModelCheckpoint 来保存具有最低验证损失的模型,然后使用该模型对测试集进行预测。文档是here.我也认为你的模型有很多参数并且会过拟合。向模型添加 dropout 层以帮助减少此问题。我会尝试降低模型复杂性作为一个很好的选择。取出具有 1000 个节点的层和具有 500 个节点的层之一,看看你得到了什么结果。我也更喜欢使用 Adamax 优化器。文档是here.。使用默认值。

【讨论】:

  • 好的,谢谢您的建议!我会试试看。我的学习率为 0.001,因为这是 Adam 优化器的默认值。但我会尝试使用可变学习率和您提到的其他内容
猜你喜欢
  • 2016-07-11
  • 1970-01-01
  • 2019-03-15
  • 2011-08-17
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 2013-04-22
  • 2018-10-05
相关资源
最近更新 更多