方法有多种,可以在Navigator中安装;也可以到prompt中用conda install 或者pip install 安装具体安装并测试代码,大家可以自行搜寻。CSDN上有很多,这里仅给出一个随便查找的windows环境下tensorflow安装过程详解。我本人也是历尽千辛万苦才安装成功,成功了之后又进行了多次更迭都很顺利。简单总结几点我的建议:
1、版本要匹配,使用navigator下载可以帮助你匹配版本问题,并能够看到版本匹配要求,再进行确定下载
2、最新的tensorflow2.1.0可以支持python3.7.1
3、能装Tf的GPU版本还是装一下,在你进行卷积神经网络或者网络深度比较大的时候速度提升非常之恐怖。
4、关于anaconda支持多个python的环境的问题,经过我的测试。确实可以支持多个环境,可以在不同的环境安装不同的python版本,从而安装不同版本的tensorflow,大家都知道tensorflow1.和tensorflow2.差别还是很大。但有一个问题是,anaconda似乎不能支持安装三个spyder,因为我的anaconda有三个环境:base, tf, py35,后两个分别安装了tf2和tf1,导致我在装第三个环境spyder的时候死活装不上,在terminal中pip装上了,却只能打开base环境的spyder,可能anaconda的优化还没做好吧。
我前期学tensorflow遇到的学习资源全是基于1.0的代码,导致复现难度很高。所以有条件的还是两个都装。如果想学tensorflow2.0的推荐一个资源人工智能实践:Tensorflow笔记,B站同步有资源。
使用tushare模块下载任意股票的历史数据,你可以修改其中股票的代码即可下载。
import tushare as ts
import matplotlib.pyplot as plt
df1 = ts.get_k_data('600406', ktype='D', start='2010-04-26', end='2020-08-09')
datapath1 = "./SH600406.csv"
df1.to_csv(datapath1)
RNN是一种循环神经网络,类似于卷积神经网络在空间上共享参数,提取空间信息;循环神经网络在时间上共享参数,提取时间信息。循环核和卷积核类似,但不是方形的,而是圆柱体的,其迭代公式如图所示。
RNN, LSTM 和 GRU是3个非常常用的循环神经网络,这三个东西里面的内部结构又是什么样的呢。因为后面会对比三个网络的预测效果,所以这里简单介绍一下。
动画图解RNN, LSTM 和 GRU,没有比这个更直观的了!
动图理解一下三者区别,后两个尤其难理解
本例是用连续的60天股价预测第61天的
import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import Dropout, Dense, SimpleRNN
import matplotlib.pyplot as plt
import os
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error, mean_absolute_error
import math
maotai = pd.read_csv('./SH600406.csv') # 读取股票文件
training_set = maotai.iloc[0:2426 - 300, 2:3].values # 前(2426-300=2126)天的开盘价作为训练集,表格从0开始计数,2:3 是提取[2:3)列,前闭后开,故提取出C列开盘价
test_set = maotai.iloc[2426 - 300:, 2:3].values # 后300天的开盘价作为测试集
# 归一化
sc = MinMaxScaler(feature_range=(0, 1)) # 定义归一化:归一化到(0,1)之间
training_set_scaled = sc.fit_transform(training_set) # 求得训练集的最大值,最小值这些训练集固有的属性,并在训练集上进行归一化
test_set = sc.transform(test_set) # 利用训练集的属性对测试集进行归一化
x_train = []
y_train = []
x_test = []
y_test = []
# 测试集:csv表格中前2426-300=2126天数据
# 利用for循环,遍历整个训练集,提取训练集中连续60天的开盘价作为输入特征x_train,第61天的数据作为标签,for循环共构建2426-300-60=2066组数据。
for i in range(60, len(training_set_scaled)):
x_train.append(training_set_scaled[i - 60:i, 0])
y_train.append(training_set_scaled[i, 0])
# 对训练集进行打乱
np.random.seed(7)
np.random.shuffle(x_train)
np.random.seed(7)
np.random.shuffle(y_train)
tf.random.set_seed(7)
# 将训练集由list格式变为array格式
x_train, y_train = np.array(x_train), np.array(y_train)
# 使x_train符合RNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]。
# 此处整个数据集送入,送入样本数为x_train.shape[0]即2066组数据;输入60个开盘价,预测出第61天的开盘价,循环核时间展开步数为60; 每个时间步送入的特征是某一天的开盘价,只有1个数据,故每个时间步输入特征个数为1
x_train = np.reshape(x_train, (x_train.shape[0], 60, 1))
# 测试集:csv表格中后300天数据
# 利用for循环,遍历整个测试集,提取测试集中连续60天的开盘价作为输入特征x_train,第61天的数据作为标签,for循环共构建300-60=240组数据。
for i in range(60, len(test_set)):
x_test.append(test_set[i - 60:i, 0])
y_test.append(test_set[i, 0])
# 测试集变array并reshape为符合RNN输入要求:[送入样本数, 循环核时间展开步数, 每个时间步输入特征个数]
x_test, y_test = np.array(x_test), np.array(y_test)
x_test = np.reshape(x_test, (x_test.shape[0], 60, 1))
model = tf.keras.Sequential([
SimpleRNN(80, return_sequences=True),
Dropout(0.2),
SimpleRNN(100),
Dropout(0.2),
Dense(1)
])
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss='mean_squared_error') # 损失函数用均方误差
# 该应用只观测loss数值,不观测准确率,所以删去metrics选项,一会在每个epoch迭代显示时只显示loss值
checkpoint_save_path = "./checkpoint/rnn_stock.ckpt"
if os.path.exists(checkpoint_save_path + '.index'):
print('-------------load the model-----------------')
model.load_weights(checkpoint_save_path)
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path,
save_weights_only=True,
save_best_only=True,
monitor='val_loss')
history = model.fit(x_train, y_train, batch_size=64, epochs=50, validation_data=(x_test, y_test), validation_freq=1,
callbacks=[cp_callback])
model.summary()
file = open('./weights.txt', 'w') # 参数提取
for v in model.trainable_variables:
file.write(str(v.name) + '\n')
file.write(str(v.shape) + '\n')
file.write(str(v.numpy()) + '\n')
file.close()
loss = history.history['loss']
val_loss = history.history['val_loss']
plt.plot(loss, label='Training Loss')
plt.plot(val_loss, label='Validation Loss')
plt.title('Training and Validation Loss')
plt.legend()
plt.show()
################## predict ######################
# 测试集输入模型进行预测
predicted_stock_price = model.predict(x_test)
# 对预测数据还原---从(0,1)反归一化到原始范围
predicted_stock_price = sc.inverse_transform(predicted_stock_price)
# 对真实数据还原---从(0,1)反归一化到原始范围
real_stock_price = sc.inverse_transform(test_set[60:])
# 画出真实数据和预测数据的对比曲线
plt.plot(real_stock_price, color='red', label='MaoTai Stock Price')
plt.plot(predicted_stock_price, color='blue', label='Predicted MaoTai Stock Price')
plt.title('MaoTai Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('MaoTai Stock Price')
plt.legend()
plt.show()
##########evaluate##############
# calculate MSE 均方误差 ---> E[(预测值-真实值)^2] (预测值减真实值求平方后求均值)
mse = mean_squared_error(predicted_stock_price, real_stock_price)
# calculate RMSE 均方根误差--->sqrt[MSE] (对均方误差开方)
rmse = math.sqrt(mean_squared_error(predicted_stock_price, real_stock_price))
# calculate MAE 平均绝对误差----->E[|预测值-真实值|](预测值减真实值求绝对值后求均值)
mae = mean_absolute_error(predicted_stock_price, real_stock_price)
print('均方误差: %.6f' % mse)
print('均方根误差: %.6f' % rmse)
print('平均绝对误差: %.6f' % mae)
1、国电南瑞测试效果
LSTM测试
均方误差: 0.466954
均方根误差: 0.683340
平均绝对误差: 0.521077
GRU测试
均方误差: 0.341953
均方根误差: 0.584767
平均绝对误差: 0.401353
RNN测试
均方误差: 0.381057
均方根误差: 0.617298
平均绝对误差: 0.432409