说明
此系列文档为学习中国大学mooc,浙江大学开设的《深度学习应用开发-TensorFlow实践》随堂笔记。
问题说明
样本集下载
提取码:mjwz
开始
- 读取数据
%matplotlib notebook
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.utils import shuffle
#读取文件
df=pd.read_csv("D:/Program Files/Anaconda3/date/boston.csv",header=0)
#读取数据摘要
print(df.describe())
- 准备建模
-
考虑用的模型
用矩阵运算简化代码:X*W+b -
机器学习中的线性代数知识
shape
是numpy
里的概念- 有了
矩阵
的概念才有行向量
和列向量
- 用
np.array
转换成矩阵 - 矩阵乘法有两种: 1. 点乘(点积),规格需要相同.
*或者np.multiply()
。2.相乘(叉乘),A的列要和B的行数量相同.np.matmul
矩阵.T
就是它的转置。array.T
- 数据准备
- 数据处理
df = np.array(df)
#x_date不包括12,为0-11
x_date=df[:,:12]
#y_date为12
y_date=df[:,12]
- 定义训练数据占位符
x=tf.placeholder(tf.float32, [None,12],name='X')
x=tf.placeholder(tf.float32, [None,1],name='Y')
- 定义模型函数
#定义一个命名空间,节点打包一起
with tf.name_scope("Model"):
# w 初始化值是shape=(12,1)12行,1列的随机数
w=tf.Variable(tf.random_normal([12,1],stddev=0.01),name='W')
b=tf.Variable(1.0,name='b')
def model(x,w,b):
return tf.matmul(x,w)+b
pred=model(x,w,b)
- 训练模型
- 超参数
train_epochs= 50
learning_rate=0.01
- 定义损失函数
#损失函数
with tf.name_scope("LossFunction"):
loss_function = tf.reduce_mean(tf.pow(y-pred,2))
- 选择优化器
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
- 优化器中
Feed
数据必须和Placeholder
的shape
一致
- 开始训练
- 启动会话
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
- 开始训练
for epoch in range(train_epochs):
loss_sum=0
#每次喂1个样本,喂506次为一轮
for xs,ys in zip(x_date,y_date):
xs=xs.reshape(1,12)
ys=ys.reshape(1,1)
_,loss=sess.run([optimizer,loss_function],feed_dict={x:xs,y:ys})
loss_sum+=loss
#打乱数据顺序,防止学习的是顺序而不是特征
xvalues,yvalues=shuffle(x_date,y_date)
btemp=b.eval(session=sess)
wtemp=w.eval(session=sess)
loss_ave=loss_sum/len(y_date)
print("epoch=",epoch+1," loss=",loss_ave," b=",btemp," w=",wtemp)
- 结果为
可恶!!!!!!!!!!!!!
- 问题各个
w
的比例关系,影响与取值范围的关系, - 解决方法:
0-1归一化
#归一化,注意输出不要归一化
for i in range(12):
df[:,i]=df[:,i]/(df[:,i].max()-df[:,i].min())
- 验证
for i in range(20):
n=np.random.randint(506)
x_test=x_date[n].reshape(1,12)
predict=sess.run(pred,feed_dict={x:x_test})
print("第%d条: 预测值:%f 标签值: %f"%(n,predict,y_date[n]))
ps:但是实际上数据集不能全部用于训练
- 加上tensorboard 可视化代码
end
附完整代码
# coding: utf-8
# In[1]:
get_ipython().magic('matplotlib notebook')
import tensorflow as tf
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.utils import shuffle
logdir='D:/log'
#读取文件
df=pd.read_csv("D:/Program Files/Anaconda3/date/boston.csv",header=0)
#读取数据摘要
print(df.describe())
# In[2]:
df = np.array(df)
#归一化
for i in range(12):
df[:,i]=df[:,i]/(df[:,i].max()-df[:,i].min())
#x_date不包括12,为0-11
x_date=df[:,:12]
#y_date为12
y_date=df[:,12]
# In[3]:
x=tf.placeholder(tf.float32, [None,12],name='X')
y=tf.placeholder(tf.float32, [None,1],name='Y')
# In[4]:
#定义一个命名空间
with tf.name_scope("Model"):
# w 初始化值是shape=(12,1)的随机数
w=tf.Variable(tf.random_normal([12,1],stddev=0.01),name='W')
b=tf.Variable(1.0,name='b')
def model(x,w,b):
return tf.matmul(x,w)+b
pred=model(x,w,b)
# In[5]:
train_epochs= 50
learning_rate=0.01
# In[6]:
#损失函数
with tf.name_scope("LossFunction"):
loss_function = tf.reduce_mean(tf.pow(y-pred,2))
# In[7]:
optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function)
# In[8]:
#创建一个操作,用于记录损失值loss,后面再tensorboard中的scalars可见
sum_loss_op=tf.summary.scalar("loss",loss_function)
#把所有需要记录摘要日志文件的合并,方便一次写入
merged=tf.summary.merge_all()
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
#写入整个计算图
writer=tf.summary.FileWriter(logdir,sess.graph)
# In[9]:
for epoch in range(train_epochs):
loss_sum=0
#每次喂1个样本,喂506次为一轮
for xs,ys in zip(x_date,y_date):
xs=xs.reshape(1,12)
ys=ys.reshape(1,1)
_,summary_str,loss=sess.run([optimizer,sum_loss_op,loss_function],feed_dict={x:xs,y:ys})
writer.add_summary(summary_str,epoch)
loss_sum+=loss
#打乱数据顺序,防止学习的是顺序而不是特征
xvalues,yvalues=shuffle(x_date,y_date)
btemp=b.eval(session=sess)
wtemp=w.eval(session=sess)
loss_ave=loss_sum/len(y_date)
print("epoch=",epoch+1," loss=",loss_ave," b=",btemp," w=",wtemp)
writer.close()
# In[10]:
for i in range(20):
n=np.random.randint(506)
x_test=x_date[n].reshape(1,12)
predict=sess.run(pred,feed_dict={x:x_test})
print("第%d条: 预测值:%f 标签值: %f"%(n,predict,y_date[n]))
sess.close()