[tensorflow]第一天-简单神经网络预测

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

#生成一个数组,从1~9,样本数为9----------------------------------
#numpy.linspace(start, stop, num=50, endpoint=True, retstep=False,dtype=None)
#--------------------------------------------------------------------------------

date=np.linspace(1,9,9) # print(date)得到[1,2,3,4,5,6,7,8,9]
beginPrice=np.array([2443,2458,2480,2500,2510,2496,2493,2511,2503])
endPrice=np.array([2461,2473,2501,2522,2500,2499,2511,2500,2522])    

#生成绘制区域---------------------------------------------------------------
#figure(num=None, figsize=None, dpi=None, facecolor=None,edgecolor=None, frameon=True)
#num:图像编号或名称,数字为编号 ,字符串为名称
#figsize:指定figure的宽和高,单位为英寸;dpi参数指定绘图对象的分辨率,即每英寸多少个像素,缺省值为80      1英寸等于2.5cm,A4纸是21*30cm的纸张 
#facecolor:背景颜色
#edgecolor:边框颜色
#--------------------------------------------------------------------------------------

plt.figure()

for i in range(0,8):
    dateN=np.zeros([2])#定义一个数组[0,0],等同于1行2列全为0的矩阵/np.ones([2])全为1
    dateN[0]=i
    dateN[1]=i
    price=np.zeros([2])
    price[0]=beginPrice[i]
    price[1]=endPrice[i]
    if beginPrice[i]<endPrice[i]:
        plt.plot(dateN,price,'red',lw=7)
    else:
        plt.plot(dateN,price,'green',lw=7)

#plt.plot(x,y,format_string,**kwargs) x轴数据,y轴数据,format_string控制曲线的格式字串format_string 由颜色字符,风格字符,和标记字符e.g.plt.plot([1,2,3,6],[4,5,8,1],’g-s’)

dateNor=np.zeros([9,1])
priceNor=np.zeros([9,1])

#将数据归一化
for i in range(0,9):
    dateNor[i,0]=date[i]/9.0
    priceNor[i,0]=endPrice[i]/3000.0    

x=tf.placeholder(tf.float32,[None,1])#placeholder,占位。float32型,N行1列的矩阵
y=tf.placeholder(tf.float32,[None,1])

#简单tensorflow三层结构---------------------------------------------------
#|			| 			|			|
#|	[输入矩阵X]	|	[中间矩阵B]	|	[输出矩阵Y]	|
#|		┗|[矩阵w1]+[偏移矩阵b1]┛┗[矩阵w2]+[偏移矩阵b2]┛		|
#|	layer1		|calcLayer		|layer2			|
#数学实现:X*w1+b1=B,B*w2+b2=Y,最终目标是得到一组w1,b1,w2,b2,可以使得X---(w1,b1,w2,b2)---->Y
#程序实现:
#layer1
w1=tf.Variable(tf.random_uniform([1,10],0,1))#初始化w1,一个1行10列的矩阵,填充为0-1的随机数
b1=tf.Variable(tf.zeros([1,10]))#初始化b1,一个全为0的1行10列矩阵
wb1=tf.matmul(x,w1)+b1#矩阵B=矩阵X*w1+b1
layer1=tf.nn.relu(wb1)#正向纠偏,函数功能是将矩阵内小于0的数全置0,大于0的不变
#layer2
w2=tf.Variable(tf.random_uniform([10,1],0,1))
b2=tf.Variable(tf.zeros([9,1]))#矩阵X(9行1列)--(乘以w1<1行10列>-->9行10列-->+b1)-->矩阵B(9行10列)--(乘以w2<10行1列>-->9行1列-->+b2)-->9行1列
wb2=tf.matmul(layer1,w2)+b2
layer2=tf.nn.relu(wb2)
loss=tf.reduce_mean(tf.square(y-layer2))#将差值矩阵[Y-layer2]降维至loss

#tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。---
#第一个参数input_tensor: 输入的待降维的tensor;
#第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
#第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设置为False,输出结果会降低维度;
#第四个参数name: 操作的名称;
#---------------------------------------------------------------------

trainStep=tf.train.GradientDescentOptimizer(0.1).minimize(loss)

#设置训练器trainStep,使用tf.train.GradientDescentOptimizer,以0.1的步长,使loss尽可能小

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())#前面定义variable(变量)后要初始化后才可使用
    for i in range(1,10000):#通过for循环执行训练器trainStep,10000次
        sess.run(trainStep,feed_dict={x:dateNor,y:priceNor})#feed_dic={x:dateNor,y:priceNor},可以理解为投喂器,将字典型赋值给trainStep。执行10000次后得到1个转换器M【(__*w1+b1)*w2+b2】,输入矩阵X后可得到结果矩阵Y,即X---(M)--->Y,y=tf.nn.relu(tf.matmul(tf.nn.relu(tf.matmul(x,w1)+b1),w2)+b2)
    pred=sess.run(layer2,feed_dict={x:dateNor})#y=pred=layer2=f1(f2(f3(f4(x))))
    predPrice=np.zeros([9,1])
    for i in range(0,9):
        predPrice[i,0]=pred[i,0]*3000
    #将归一化计算后的结果转换回原值## 标题
    plt.plot(date,predPrice,'b',lw=1)
    plt.show()
### 如何构建用于前馈预测神经网络框架 #### 数据准备与预处理 为了使前馈神经网络能够应用于时间序列预测,需采用滞后输入法或窗口法将时间序列历史数据转换成独立特征。这意味着要创建一个滑动窗口,在该窗口内收集连续的时间点作为输入样本的一部分[^1]。 例如,如果有一个每日股票价格的时间序列,并希望基于过去三天的价格来预测第四天的价格,则可以构造如下形式的数据集: | Day t-1 | Target (Day t) | |--| | Price_1 | Price_2 | Price_3 | Price_4 | 这种做法使得原本具有顺序特性的数据被转化为静态模式识别问题,从而适合用FNN解决。 #### 定义模型架构 定义一个多层感知器(MLP),即一种典型的前馈神经网络,其由多个全连接层组成。每层中的节点数量以及激活函数的选择都是超参数优化过程中需要考虑的因素之一。对于回归类的任务来说,通常最后一层只有一个单元且不带任何非线性变换;而对于分类任务则可能需要Softmax等其他类型的输出层[^2]。 以下是Python代码片段展示了一个简单的Keras实现方式: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense model = Sequential() # 添加第一个隐藏层并指定输入维度 model.add(Dense(units=50, activation='relu', input_dim=time_steps * features)) # 可选地添加更多隐藏层... model.add(Dense(units=hidden_units, activation='relu')) # 输出层配置取决于具体应用场景 if is_regression: model.add(Dense(1)) # 对于回归问题 else: model.add(Dense(num_classes, activation='softmax')) # 对于分类问题 ``` 在此基础上还可以进一步探索不同层数、宽度以及其他设计选项的影响效果。 #### 训练过程设置 完成上述准备工作之后就可以编译模型并开始训练流程了。这涉及到损失函数的选择(均方误差MSE常用于回归)、优化算法设定(Adam是一个流行的选择)等方面的内容。此外还需要划分训练集和验证集以便监控泛化性能,防止过拟合现象的发生。 ```python model.compile(optimizer='adam', loss='mean_squared_error' if is_regression else 'categorical_crossentropy', metrics=['accuracy'] if not is_regression else None) history = model.fit(X_train, y_train, epochs=num_epochs, batch_size=batch_size, validation_split=validation_ratio) ``` 通过这种方式便能建立起一套完整的前馈神经网络框架来进行各种类型的预测分析工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值