【发布时间】: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
【问题讨论】:
-
你是如何初始化你的参数的?看起来所有参数都为零,所以反向传播不起作用。
-
我认为 model.fit 初始化它。所以我认为这就是问题所在。感谢您的快速答复。我会初始化参数,然后看看它是否可以工作
-
Keras 负责参数初始化,这不是问题。我更怀疑在所有隐藏层中使用 sigmoid 激活,这会产生消失的梯度,为什么不在隐藏层中使用 ReLU?
-
我在layers中也使用了relu,但问题是一样的。我刚刚尝试了一些激活函数 - 也混合了 sigmoid 和 relu
标签: python tensorflow machine-learning keras neural-network