最近看一本书,《动手学习深度学习》,发现这本书挺好的正好用来复习深度学习的基本概念。但是书中的是以MXNET作为教学代码,我又不想去学,因此我把书上的例子都用Tensorflow实现一遍。
回归和拟合
回归从数学角度来讲就是,给定一个点集,能够用一条曲线去拟合,如果这个曲线是一条直线,就成为线性回归。
拟合的方法包括回归、插值、和逼近,它更为宽泛一些,是一种数据处理的方式。而回归是一种特定的数学方法,可以实现数据拟合。
模型、权重、偏置
误差函数
均方误差
数值解、解析解
当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。
随机梯度下降、学习率和超参数
线性回归
线性回归可以看做一个单层神经网络:
输入分别为 x1 和 x2 ,因此输入层的输入个数为2。输入个数也叫特征数或特征向量维度。输入层不计算,因此该网络一般被认为只有一层。输出层中的神经元和输入层中各个输入完全连接。因此,这里的输出层又叫全连接层(fully-connected layer)或稠密层(dense layer)。
向量化表示求解过程:
Tensorflow实现
模型有两个特征,训练数据获取如下:
import tensorflow as tf import numpy as np #目标函数y=X*w+b num_inputs = 2 num_examples = 1000 true_w = [2, -3.4] true_b = 4.2 #获得训练数据 features = np.random.normal(loc=0.,scale=1, size=(num_examples, num_inputs)) labels = true_w[0] * features[:,0] + true_w[1] * features[:,1] + true_b #加上噪声 labels += np.random.normal(scale=0.01,size=labels.shape)
绘制训练数据分布
%matplotlib inline import matplotlib.pyplot as plt y_hat0 = true_w[0] * features[:,0] + true_b y_hat1 = true_w[1] * features[:,1] + true_b plt.figure() plt.scatter(features[:,0],features[:,1],color='red',s=10) #散点图 红色,大小为10 plt.show() plt.figure() plt.scatter(features[:,0],labels,s=10) plt.plot(features[:,0],y_hat0) plt.show() plt.figure() plt.scatter(features[:,1],labels,s=10) plt.plot(features[:,1],y_hat1) plt.show()
绘制三维数据分布
from mpl_toolkits.mplot3d import Axes3D y_hat = true_w[0] * features[:,0] + true_w[1] * features[:,1] + true_b fig = plt.figure() ax = Axes3D(fig) ax.scatter(features[:,0],features[:,1], labels,s=5) ax.set_xlabel('features0') ax.set_ylabel('features1') ax.set_zlabel('y') plt.show()
定义并训练模型
%%time #初始化模型参数 w = tf.Variable(initial_value=tf.random_normal(shape=(num_inputs, 1),stddev=1.,mean=0.)) b = tf.Variable(initial_value=tf.random_normal(shape=(1,),stddev=1.,mean=0.)) #定义模型 x=tf.placeholder(tf.float32,shape=(None,2)) y_=tf.placeholder(tf.float32,shape=(None,1)) y=tf.matmul(x,w)+b #定义损失函数及反向传播方法 loss=tf.reduce_mean(tf.square(y_-y)) sgd=tf.train.GradientDescentOptimizer(0.001).minimize(loss) BATCH_SIZE=10 w_history=[] b_history=[] #生成对话,训练网络 with tf.Session() as sess: init_op=tf.global_variables_initializer() #初始化所有的Variable sess.run(init_op) STEPS=2000 for i in range(STEPS): index=np.random.randint(low=0, high=num_examples-1, size=BATCH_SIZE) data=features[index] label=labels[index].reshape(-1,1) sess.run(sgd,feed_dict={x:data,y_:label}) if(i%200==0): w_history.append(sess.run(w)) b_history.append(sess.run(b)) print(i,end=' ') print(sess.run(w)) print(sess.run(b))
显示训练过程
plt.figure(figsize=(10,10)) plt.scatter(features[:,0],labels,s=10) for W,B in zip(w_history,b_history): W0=W[0] y_hat0 = W0 * features[:,0] + B plt.plot(features[:,0],y_hat0,label =str(W0)) plt.legend()#显示图例 plt.show() plt.figure(figsize=(10,10)) plt.scatter(features[:,1],labels,s=10) for W,B in zip(w_history,b_history): W1=W[1] y_hat1 = W1 * features[:,1] + B plt.plot(features[:,1],y_hat1,label =str(W1)) plt.legend()#显示图例 plt.show()
参考文献
[1]阿斯顿·张(Aston Zhang) ,李沐(Mu Li),etc.动手学深度学习.http://zh.gluon.ai/chapter_deep-learning-basics/mlp.html
[2]yaoyao_CJ.回归与拟合、分类与回归.https://blog.csdn.net/yaoyao_cj/article/details/79460522.2018-03-06