深度学习主要有下面几个步骤:
1、获取数据
2、搭建模型
3、模型训练
4、使用模型解决实际问题
tensorflow是现在最火的深度学习框架,值得学习
简单的用tensorflow拟合二维数据
1、获取数据
这里面找一个一次函数y约等于3x
- import numpy as np
- import matplotlib.pyplot as plt
- train_x = np.linspace(-1,1,100)#-1到1 之间生成100个随机数
- train_y = 3*train_x+np.random.randn(100)*0.1#np.random.randn(100)表示生成100个符合正态分布的随机数
- plt.plot(train_x,train_y,'yo',label='Original data')
- plt.legend()
- plt.show()
代码解读:导入两个包,numpy是生成数据相关的包,更多的用于矩阵运算,matplotlib主要用于可视化画图
plt.plot里面‘yo’ 代表黄色yellow形状为o,后面为图形命名,可以自己改动里面参数
上面这个图形是y约等于2*x,'yo' 替换为'ro'
2、搭建模型
思想:构建模型z = w*x+b, 这里面就是用z来逼近拟合上面y,不断逼近的过程中,主要调整的是参数w和b, 这两个变量也是在过程当中不断更新的亮,直到两个模型拟合程度比较好
正向搭建模型
开始用tensorflow 搭建模型
- x = tf.placeholder('float')
- y = tf.placeholder('float')
- w = tf.Variable(tf.random_normal([1]),name='weight')
- b = tf.Variable(tf.zeros([1]),name='bias')
- z = tf.multiply(x,w)+b
代码解读:x,y称为占位符,说白了就是先把位置占上,一会就来人把这个位置用上啦,简单的理解图书馆给小伙伴占座~~~
w表示变量,里面两个参数分别为1维的[-1,1] 之间的随机数,后面那个是代表命名,这个随意啦
b也表示变量,初始化是1维的0向量,后面参数也是命名
z代表w*x+b,multiply代表矩阵想乘
反向调整:
刚才说过正向生成的数值z与实际的值(真实值)之间的误差,反向调整参数变量w和b
大体流程:正向生成一个值反向调整一下参数循环下去,直到参数调整到合适值为止
- cost = tf.reduce_mean(tf.square(y-z))
- learning_rate = 0.01
- optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
代码解读:1、算出误差 2、定义学习率参数 3、优化器利用梯度下降方法使得误差最小(还可以使用其它方法替代梯度下降法)
3、训练模型
- # 初始化变量
- init = tf.global_variables_initializer()
- # 训练参数
- training_epochs = 20
- display_step = 2
- # 启动session
- with tf.Session() as sess:
- sess.run(init)
- # Fit all training data
- for epoch in range(training_epochs):
- for (x, y) in zip(train_X, train_Y):
- sess.run(optimizer, feed_dict={X: x, Y: y})
- #显示训练中的详细信息
- if epoch % display_step == 0:
- loss = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
- print ("Epoch:", epoch+1, "cost=", loss,"W=", sess.run(W), "b=", sess.run(b))
- if not (loss == "NA" ):
- plotdata["batchsize"].append(epoch)
- plotdata["loss"].append(loss)
- print (" Finished!")
- print ("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
拟合图形展示:
可视化展示误差随训练步骤的变化
4、使用模型给一个学x值会得到一个 z 值
全部代码:
- #encoding=utf-8
- import tensorflow as tf
- import numpy as np
- import matplotlib.pyplot as plt
- plotdata = { "batchsize":[], "loss":[] }
- #生成模拟数据
- train_X = np.linspace(-1, 1, 100)
- train_Y = 2 * train_X + np.random.randn(*train_X.shape) * 0.3 # y=2x,但是加入了噪声
- #显示模拟数据点
- plt.plot(train_X, train_Y, 'ro', label='Original data')
- plt.legend()
- plt.show()
- # 创建模型
- # 占位符
- X = tf.placeholder("float")
- Y = tf.placeholder("float")
- # 模型参数
- W = tf.Variable(tf.random_normal([1]), name="weight")
- b = tf.Variable(tf.zeros([1]), name="bias")
- # 前向结构
- z = tf.multiply(X, W)+ b
- #反向优化
- cost =tf.reduce_mean( tf.square(Y - z))
- learning_rate = 0.01
- optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost) #Gradient descent
- # 初始化变量
- init = tf.global_variables_initializer()
- # 训练参数
- training_epochs = 20
- display_step = 2
- # 启动session
- with tf.Session() as sess:
- sess.run(init)
- # Fit all training data
- for epoch in range(training_epochs):
- for (x, y) in zip(train_X, train_Y):
- sess.run(optimizer, feed_dict={X: x, Y: y})
- #显示训练中的详细信息
- if epoch % display_step == 0:
- loss = sess.run(cost, feed_dict={X: train_X, Y:train_Y})
- print ("Epoch:", epoch+1, "cost=", loss,"W=", sess.run(W), "b=", sess.run(b))
- if not (loss == "NA" ):
- plotdata["batchsize"].append(epoch)
- plotdata["loss"].append(loss)
- print (" Finished!")
- print ("cost=", sess.run(cost, feed_dict={X: train_X, Y: train_Y}), "W=", sess.run(W), "b=", sess.run(b))
- #图形显示
- plt.plot(train_X, train_Y, 'ro', label='Original data')
- plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')
- plt.legend()
- plt.show()
- print(plotdata['loss'])
- print(plotdata['batchsize'])
- plt.figure(1)
- plt.subplot(211)
- plt.plot(plotdata["batchsize"], plotdata["loss"], 'b--')
- plt.xlabel('Minibatch number')
- plt.ylabel('Loss')
- plt.title('Minibatch run vs. Training loss')
- plt.show()
- print ("x=0.2,z=", sess.run(z, feed_dict={X: 0.2}))