莫烦python(tensorflow)总结——神经网络搭建(简易版)

import tensorflow as tf 
import numpy as np
import matplotlib.pyplot as plt

def add_layer(inputs,in_size,out_size,activation_function=None):  #定义一个层概念,用于在网络中添加层时引用  (输入,输入单元数量,输出单元数量,激活函数(无代表线性))
	Weights = tf.Variable(tf.random_normal([in_size,out_size]))   #定义一个变量——Weights,生成一个大小为[in_size,out_size]的权重矩阵
	biases = tf.Variable(tf.zeros([1,out_size])+0.1)			  #定义一个变量——biases,生成一个大小为[1,out_size]的偏差矩阵,元素值都为0.1
	Wx_plus_b=tf.matmul(inputs,Weights)+biases					  #定义线性公式,Wx_plus_b= ax+b, 激活函数作用在这个值上,实现非线性变换
	if activation_function is None:
		outputs = Wx_plus_b
	else:
		outputs = activation_function(Wx_plus_b)
	return outputs												  # 层定义结束

	
##数据集整理部分	
x_data = np.linspace(-1,1,300)[:,np.newaxis]					  #在-1和1之间,生成300个等间隔的数字,x_data的形式由[:,np.newaxis]来控制:[1,300],即1行300列。
noise = np.random.normal(0,0.05,x_data.shape)					  #随机产生一个概率分布均值为0,标准差为0.05的噪声数据,数据的尺寸大小和x_data一致(因为要加在x_data上)
y_data = np.square(x_data)-0.5+noise							  #目标函数y_data:(x_data)^2-0.5 + noise

  # placeholder()函数是在神经网络构建graph的时候在模型中的占位,此时并没有把要输入的数据传入模型,它只会分配必要的内存。等建立session,在会话中,运行模型的时候通过feed_dict()函数向占位符喂入数据。  
xs = tf.placeholder(tf.float32,[None,1])                          #行待定的1列数据占位xs
ys = tf.placeholder(tf.float32,[None,1])						  #行待定的1列数据占位ys


#添加隐层和输出层
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)			  #隐层输入xs,隐层有1个输入单元,10个输出单元,激活函数为relu.
prediction = add_layer(l1,10,1,activation_function=None)		  #输出层输入l1,10个输入单元,1个输出单元,激活函数None(默认为线性)

#损失函数
loss =tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))  #reduction_indices表示将生成的矩阵横向压扁 //不理解可以暂时忽略
train_step=tf.train.GradientDescentOptimizer(0.1).minimize(loss)                     #使用GDO对loss进行最小化优化

#初始化所有参数值,在run之前,这一步必须要执行,非常重要
init =tf.initialize_all_variables()

#定义sess,用于执行网络每个阶段所需要执行的内容
sess =tf.Session()
#运行参数初始化
sess.run(init)

# 可视化的一部分,可暂时忽略
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion()
plt.show()

#开始训练,训练1000次
for i in range(1000):
	sess.run(train_step,feed_dict={xs:x_data,ys:y_data})   		  #运行训练,原占位喂入x_data和y_data
	if i%50==0:                                                   #每50步执行一次下面的操作
		# print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))   #每50步打印出loss值
		try:													  #去除掉lines的第一条线,如果没有线的话,就什么都不做(忽略掉删除第一条线的过程)
			ax.lines.remove(lines[0])							  
		except Exception:										
			pass
		prediction_value = sess.run(prediction,feed_dict={xs:x_data}) #运行输出预测值
		lines = ax.plot(x_data,prediction_value,'r-',lw=5)        #红色,宽度为5的x_datahe和预测值之间的关系图
		plt.pause(0.1)											  #暂停0.1s再继续

你可能感兴趣的:(莫烦)