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()
[tensorflow]第一天-简单神经网络预测
最新推荐文章于 2023-05-27 15:55:04 发布