python - Keras 批量训练在线预测不学习
问题描述
我一直在做一个副项目,试图自己用 Keras 学习机器学习,我想我被困在这里了。
我的目的是预测拥有 31 个站点的公共共享系统的自行车可用性。现在我只训练我的模型来预测一个站点的可用性。我想通过批量训练进行在线预测。我想开始给它一些自行车,例如,00:00
N 给定的时间步长加上一年中的某一天和工作日。
输入数据是这样的:
- 一年中的哪一天,编码为整数,1-JAN 为 0,2-JAN 为 1...
- 以 5' 间隔编码为整数的时间与以前相同,00:00 为 0,00:05 为 1...
- 工作日,再次编码为 int
然后将这 3 列归一化,然后我添加引用自行车的列,它们是一个热编码,如果车站有 20 辆自行车,编码数组的长度将为 21。然后数据或多或少地转换为监督问题按照本教程。
现在我将我的数据集分为训练(65%)和测试(35%)样本。然后将神经网络定义为:
model = Sequential()
model.add(LSTM(lstm_neurons, batch_input_shape=(1000, 5, 24), stateful=False))
model.add(Dense(max_cases, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy', 'mse', 'mae'])
适合模型
for i in range(epochs):
model.fit(train_x, train_y, epochs=1, batch_size=new_batch_size, verbose=2, shuffle=False)
model.reset_states()
w = model.get_weights()
准确的情节看起来不错,但损失的情节很奇怪。
训练完成后,我预测值,从无状态更改为有状态并修改批量大小
model = Sequential()
model.add(LSTM(lstm_neurons, batch_input_shape=(1, 5, 24), stateful=True))
model.add(Dense(max_cases, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics = ['accuracy', 'mse', 'mae'])
model.set_weights(w)
我现在使用之前得到的测试值进行预测
for i in range(0, len(test_x)):
auxx = test_x[i].reshape((batch_size, test_x[i].shape[0], test_x[i].shape[1])) # (...,n_in,4)
yhat = model.predict(auxx, batch_size = batch_size)
这就是结果,我将其放大一点以更仔细地观察而不是拥挤的情节。它看起来一点也不差,它有一些错误,但总体而言,预测看起来足够好。
在此之后,我创建了一组数据来进行在线预测和预测
for i in range(0,290):
# ...
predicted_bikes = model.predict(data_to_feed, batch_size = 1)
# ...
结果就是这个,一条连续的线。
正如我在上图中看到的那样,预测值像一个间隔一样移动到实际值,这让我认为神经网络已经学会重复以前的值。这就是为什么我在这里得到一条直线。
解决方案
推荐阅读
- assembly - nasm:在运行时从 rip(指令指针)获取重定位二进制文件的偏移量
- python - 2 种布局中橡皮筋的小部件选择问题
- google-apps-script - 如何检查单元格中的日期 + 5 = 今天?(Google Apps 脚本 + Google 表格)
- c# - 数据表的动态分组和排序
- sql - 根据第一行中两列的数学有条件地显示下一行?
- discord.js - 如何检测用户何时收到角色?
- python - 如何将 HTML 表单中的变量连接到设置电阻值的参数?
- google-chrome - css/js 的 Chrome 客户端证书失败
- reactjs - 更新 React Hookstate 中的数组元素
- wordpress - 我的网站图标显示在我的浏览器中,但不在谷歌上