Keras + LSTM 做回归demo
学习神经网络
想拿lstm 做回归, 网上找demo 基本三种: sin拟合cos 那个, 比特币价格预测(我用相同的代码和数据没有跑成功, 我太菜了)和keras 的一个例子
我基于keras 那个实现了一个, 这里贴一下我的代码.
import numpy as np
np.random.seed(1337)
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import keras
from keras.models import Sequential
from keras.layers import Activation
from keras.layers import LSTM
from keras.layers import Dropout
from keras.layers import Dense
# 数据的数量
datan = 400
X = np.linspace(-1, 2, datan)
np.random.shuffle(X)
# 构造y y=3*x + 2 并加上一个0-0.5 的随机数
Y = 3.3 * X + 2 + np.random.normal(0, 0.5, (datan, ))
# 展示一下数据
plt.scatter(X, Y)
plt.show()

# 训练集测试集划分 2:1
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33, random_state=42)
# 一些参数
neurons = 128
activation_function = 'tanh' # 激活函数
loss = 'mse' # 损失函数
optimizer="adam" # 优化函数
dropout = 0.01
model = Sequential() model.add(LSTM(neurons, return_sequences=True, input_shape=(1, 1), activation=activation_function))
model.add(Dropout(dropout))
model.add(LSTM(neurons, return_sequences=True, activation=activation_function))
model.add(Dropout(dropout))
model.add(LSTM(neurons, activation=activation_function))
model.add(Dropout(dropout))
model.add(Dense(output_dim=1, input_dim=1))
#
model.compile(loss=loss, optimizer=optimizer)
# training 训练
print('Training -----------')
epochs = 2001
for step in range(epochs):
cost = model.train_on_batch(X_train[:, np.newaxis, np.newaxis], Y_train)
if step % 30 == 0:
print(f'{step} train cost: ', cost)
# 测试
print('Testing ------------')
cost = model.evaluate(X_test[:, np.newaxis, np.newaxis], Y_test, batch_size=40)
print('test cost:', cost)

# 打印预测结果
Y_pred = model.predict(X_test[:, np.newaxis, np.newaxis])
plt.scatter(X_test, Y_test)
plt.plot(X_test, Y_pred, 'ro')
plt.show()

loss_history = {}
def run(X_train, Y_train, X_test, Y_test, epochs, activation_func='tanh', loss_func='mse', opt_func='sgd'):
"""
这里是对上面代码的封装, 我测试了一下各种优化函数的效率
可用的目标函数
mean_squared_error或mse
mean_absolute_error或mae
mean_absolute_percentage_error或mape
mean_squared_logarithmic_error或msle
squared_hinge
hinge
categorical_hinge
binary_crossentropy(亦称作对数损失,logloss)
logcosh
categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如(nb_samples, nb_classes)的二值序列
sparse_categorical_crossentrop:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度:np.expand_dims(y,-1)
kullback_leibler_divergence:从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异.
poisson:即(predictions - targets * log(predictions))的均值
cosine_proximity:即预测值与真实标签的余弦距离平均值的相反数
优化函数
sgd
RMSprop
Adagrad
Adadelta
Adam
Adamax
Nadam
"""
mdl = Sequential()
mdl.add(LSTM(neurons, return_sequences=True, input_shape=(1, 1), activation=activation_func))
mdl.add(Dropout(dropout))
mdl.add(LSTM(neurons, return_sequences=True, activation=activation_func))
mdl.add(Dropout(dropout))
mdl.add(LSTM(neurons, activation=activation_func))
mdl.add(Dropout(dropout))
mdl.add(Dense(output_dim=1, input_dim=1))
#
mdl.compile(optimizer=opt_func, loss=loss_func)
#
print('Training -----------')
loss_history[opt_func] = []
for step in range(epochs):
cost = mdl.train_on_batch(X_train[:, np.newaxis, np.newaxis], Y_train)
if step % 30 == 0:
print(f'{step} train cost: ', cost)
loss_history[opt_func].append(cost)
# test
print('Testing ------------')
cost = mdl.evaluate(X_test[:, np.newaxis, np.newaxis], Y_test, batch_size=40)
print('test cost:', cost)
#
Y_pred = mdl.predict(X_test[:, np.newaxis, np.newaxis])
plt.scatter(X_test, Y_test)
plt.plot(X_test, Y_pred, 'ro')
return plt
run(X_train, Y_train, X_test, Y_test, 2000)
run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Adagrad')
run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Nadam')
run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Adadelta')
run(X_train, Y_train, X_test, Y_test, 2000, opt_func='RMSprop')
run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Adam')
run(X_train, Y_train, X_test, Y_test, 2000, opt_func='Adamax') #
arr = [i*30 for i in range(len(loss_history['sgd']))]
plt.plot(arr, loss_history['sgd'], 'b--')
plt.plot(arr, loss_history['RMSprop'], 'r--')
plt.plot(arr, loss_history['Adagrad'], color='orange', linestyle='--')
plt.plot(arr, loss_history['Adadelta'], 'g--')
plt.plot(arr, loss_history['Adam'], color='coral', linestyle='--')
plt.plot(arr, loss_history['Adamax'], color='tomato', linestyle='--')
plt.plot(arr, loss_history['Nadam'], color='darkkhaki', linestyle='--')
plt
最快的是 adadelta, 最慢的sgd. 其他差不多.
Keras + LSTM 做回归demo的更多相关文章
- Keras + LSTM 做回归demo 2
接上回, 这次做了一个多元回归 这里贴一下代码 import numpy as np np.random.seed(1337) from sklearn.model_selection import ...
- 循环神经网络LSTM RNN回归:sin曲线预测
摘要:本篇文章将分享循环神经网络LSTM RNN如何实现回归预测. 本文分享自华为云社区<[Python人工智能] 十四.循环神经网络LSTM RNN回归案例之sin曲线预测 丨[百变AI秀]& ...
- 利用Caffe做回归(regression)
Caffe应该是目前深度学习领域应用最广泛的几大框架之一了,尤其是视觉领域.绝大多数用Caffe的人,应该用的都是基于分类的网络,但有的时候也许会有基于回归的视觉应用的需要,查了一下Caffe官网,还 ...
- [翻译]用神经网络做回归(Using Neural Networks With Regression)
本文英文原文出自这里, 这个博客里面的内容是Java开源, 分布式深度学习项目deeplearning4j的介绍学习文档. 简介: 一般来说, 神经网络常被用来做无监督学习, 分类, 以及回归. 也就 ...
- 单向LSTM笔记, LSTM做minist数据集分类
单向LSTM笔记, LSTM做minist数据集分类 先介绍下torch.nn.LSTM()这个API 1.input_size: 每一个时步(time_step)输入到lstm单元的维度.(实际输入 ...
- 使用LSTM做电影评论负面检测——使用朴素贝叶斯才51%,但是使用LSTM可以达到99%准确度
基本思路: 每个评论取前200个单词.然后生成词汇表,利用词汇index标注评论(对 每条评论的前200个单词编号而已),然后使用LSTM做正负评论检测. 代码解读见[[[评论]]]!embeddin ...
- python 做回归
1 一元线性回归 线性回归是一种简单的模型,但受到广泛应用,比如预测商品价格,成本评估等,都可以用一元线性模型.y = f(x) 叫做一元函数,回归意思就是根据已知数据复原某些值,线性回归(regre ...
- keras神经网络做简单的回归问题
咸鱼了半个多月了,要干点正经事了. 最近在帮老师用神经网络做多变量非线性的回归问题,没有什么心得,但是也要写个博文当个日记. 该回归问题是四个输入,一个输出.自己并不清楚这几个变量有什么关系,因为是跟 ...
- 用 LSTM 做时间序列预测的一个小例子(转自简书)
问题:航班乘客预测 数据:1949 到 1960 一共 12 年,每年 12 个月的数据,一共 144 个数据,单位是 1000 下载地址 目标:预测国际航班未来 1 个月的乘客数 import nu ...
随机推荐
- 白话skynet第三篇:通过队列解决多线程竞争资源
今天遇到一个问题,在大厅服务中,如果一个请求使用到了一个公共的变量,如何保证其一致性? 虽然请求是挨个运行的,但是skynet.call会阻塞. "同一个 skynet 服务中的一条消息处理 ...
- VS2017 + EF6连接MySql
VS2017 + EF6连接MySql 原地址:https://blog.csdn.net/mzhifa/article/details/80999105 VS2017 + EF6连接MySql ...
- 使用 AudioContext 播放音频 解决 谷歌禁止自动播放音频
window.AudioContext = window.AudioContext || window.webkitAudioContext || window.mozAudioContext || ...
- PeopleSoft translate value 排序
这个function 可以对record.field 的dropdownlist 排序,也可以把描述前边加个数字.但是有时候用户不接受.所以调用这个方法是比较好的选择. Function Order_ ...
- python下载及安装
1, 许多新学员不知道开始学Python需要安装什么,需要准备什么,特地写下这篇文档给一脸懵逼的新同学们作为指导文档. 2, 首先,学Python需要有一台电脑,这是必须的.老师的系统是windows ...
- C# Window Service安装、卸载、恢复选项操作
using System;using System.Diagnostics;using System.Linq;using System.ServiceProcess; namespace ScmWr ...
- 使用cocos creator的过程中碰到的问题记录
1>编辑器不能识别脚本里面@property类型,显示为null,脚本拖不上去 是@property的类循环引用导致的,可以改变组件类型到cc.Node解决 2> Cannot read ...
- Django框架详细介绍---认证系统
在web开发中通常设计网站的登录认证.注册等功能,Django恰好内置了功能完善的用户认证系统 1.auth模块 from django.contrib import auth 模块源码 import ...
- Java基础语法-Unicode、UTF-8、UTF-16
1.Unicode(统一码.万国码),从名字里可以看出,unicode码表囊括世界上各国语言文字. unidode中包含17个代码级别,第一个代码级别又称作基本的多语言级别(码点从U+0000到U+F ...
- POJ滑雪
滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 97172 Accepted: 36843 Description ...