Tensorflow神经网络无法学习

时间:2020-07-09 11:07:33

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

我为一个大学项目构建了一个神经网络。目的是找出传感器数据(温度,湿度和光线)是否可以预测日出是否在给定时间范围内发生。因此,它是一个二进制分类。 问题是网络无法学习。精度收敛到大约0.8,并且在大约5个纪元后保持不变。与损失相同,经过几个时期后,损失约为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

1 个答案:

答案 0 :(得分:1)

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