二、Tensorflow线性回归、分类
二、Tensorflow线性回归、分类
关于np.random的一些属性介绍,
可参考:https://www.jianshu.com/p/c05b873846b8
np.random.rand(d0,d1,d2,,,dn)根据d0‐dn创建随机数数组,浮点数, [0,1),均匀分布
np.random.randn(d0,d1,d2,,,dn)根据d0‐dn创建随机数数组,标准正态分布
np.random.randint(a,b,size=c)
numpy.random_normal(loc=0,scale=1e-2,size=shape),三个参数分别为平均数、标准差、生成的矩阵形状
np.linspace(a,b,c) 表示在[a,b]中产生c个数据,后边加[:np.newaxis]表示列数为1,共有c行;[np.newaxis,:]表示有1行,c列、
range(start, stop[, step]),这里的range不包括stop的值,如range(5)表示[0,1,2,3,4]
plt.figure()作用是新建绘画窗口,独立显示绘画的图片
plt.subplot()作用是在一个窗口里,画出多个图片,其中有三个参数:r -表示行数,c -表示列行,n -表示第几个
1.线性回归:(一元二次方程)
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
# 程序目的是找出输入数据的回归线
# 确定输入和输出数据
input_data=np.linspace(-0.5,0.5,200).reshape(1,200)
noise=np.random.normal(0,0.03,input_data.shape)
y_data=np.square(input_data)+noise
tf.reset_default_graph()
#建立输出数据
x=tf.placeholder(tf.float64,[1,200])
y=tf.placeholder(tf.float64,[1,200])
# 建立隐藏层
weight_L1=tf.Variable(tf.random_normal([10,1],dtype=tf.float64))
b_l1=tf.Variable(tf.zeros([10,1],dtype=tf.float64))
pre_L1=tf.matmul(weight_L1,x)+b_l1
L1=tf.nn.tanh(pre_L1)
# 建立输出层
weight_L2=tf.Variable(tf.random_normal([1,10],dtype=tf.float64))
b_l2=tf.Variable(tf.zeros([1,1],dtype=tf.float64))
pre_L2=tf.matmul(weight_L2,L1)+b_l2
predict_y=tf.nn.tanh(pre_L2)
# 建立优化模型
loss=tf.reduce_mean(tf.square(y_data-predict_y))
train=tf.train.GradientDescentOptimizer(0.2).minimize(loss)
ini=tf.global_variables_initializer()
# 建立会话
with tf.Session() as sess:
sess.run(ini)
for i in range(2001):
sess.run(train,feed_dict={x:input_data})
predict_value=sess.run(predict_y,feed_dict={x:input_data})
# print(type(input_data),type(predict_value))
# 画出示意图
plt.figure()
plt.scatter(input_data,y_data)
plt.plot(input_data,predict_value,'bs',lw=5)
plt.show()
其中遇到的问题是,设置画出线的形状时,出现了‘-’和‘--’无法显示的情况,换了种显示线形状即可。
2.对于softmax函数而言
3.实现Mnist数据集的分类
import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data
# 实现mnist数据集的分类
# 输入数据,确定batch
mnist=input_data.read_data_sets('/home/zyy/桌面/mnist',one_hot=True)
batch_size=100
n_batch=mnist.train.num_examples//batch_size
# 建立占位符
x=tf.placeholder(tf.float32,[784,None])
y=tf.placeholder(tf.float32,[10,None])
# 建立5个神经元的隐藏层和一个输出层
# weight_L1=tf.Variable(tf.zeros((5,784)))
# b_L1=tf.Variable(tf.zeros((5,1)))
# pre_L1=tf.nn.tanh(tf.matmul(weight_L1,x)+b_L1)
weight=tf.Variable(tf.zeros((10,784)))
b=tf.Variable(tf.zeros((10,1)))
pred_y=tf.nn.softmax(tf.matmul(weight,x)+b)
# 确定loss和优化器
loss=tf.reduce_mean(tf.square(y-pred_y))
train=tf.train.GradientDescentOptimizer(0.3).minimize(loss)
# 计算准确率
corrance=tf.equal(tf.arg_max(y,0),tf.arg_max(pred_y,0))
accurcy=tf.reduce_mean(tf.cast(corrance,tf.float32))
# 初始化变量
ini=tf.global_variables_initializer()
# 启动Session
with tf.Session() as sess:
sess.run(ini)
for echo in range(300):
for step in range(n_batch):
batch_img,batch_labels=mnist.train.next_batch(batch_size)
sess.run(train,feed_dict={x:np.transpose(batch_img),y:np.transpose(batch_labels)})
acc=sess.run(accurcy,feed_dict={x:np.transpose(mnist.test.images),y:np.transpose(mnist.test.labels)})
print("Iteration"+str(echo) +",Testing accuracy:"+str(acc))
最终优化可达到88%