Tensorflow搭建神经网络

ps: 此专题为AI领域经典算法书籍及论文解析与代码复现,AI算法讲解。欢迎关注知乎专栏《致敬图灵》
https://www.zhihu.com/people/li-zhi-hao-32-6/columns
微信公众号:‘致敬图灵’。

1.Tensorflow基本操作说明

1.1.矩阵相乘

import tensorflow as tf
matrix_1=tf.constant([[3,3]])#定义常量,二维矩阵,因此应该由两个中括号
matrix_2=tf.constant([[4],[4]])
output=tf.matmul(matrix_1,matrix_2)#矩阵相乘
sess=tf.Session()#Session是tf中的管理节点,操作与变量必须进行sess.run才能执行
out=sess.run(output)
print(out)

1.2.变量基本操作

import tensorflow as tf
var=tf.Variable(0,name='va')#定义变量的初始值以及变量的名字
one = tf.constant(1)#常量值为1
op=tf.add(var,one)#进行加操作,op指向加运算后得到的值
new=tf.assign(var,op)#assign用于变量的赋值,即将op的值赋给var
init=tf.initialize_all_variables()
#建立session对其进行管理
sess=tf.Session()
sess.run(init)#对变量进行初始化
#对变量和操作进行run操作
for i in range(3):
    print(sess.run(new))#new中的assign中有op操作,因此不必再对op进行run
    print(sess.run(var))
for i in range(3):
    print(sess.run(op))#只run op 不对new进行run,会导致不会对assign赋值操作进行执行。
    print(sess.run(var))

1.3.placeholder

import tensorflow as tf
var_1=tf.placeholder(tf.float32)#若需要输入数值,则用placeholder,括号内可以指定维度和数值类型
var_2=tf.placeholder(tf.float32)#若需要输入数值,则用placeholder,括号内可以指定维度和数值类型
output=tf.multiply(var_1,var_2)
sess=tf.Session()
print(sess.run(output,feed_dict={var_1:[5.0], var_2:[2.0]}))#placeholder在run的时候进行赋值

2.搭建神经网络

2.1添加层函数

import tensorflow as tf
def add_layer(inputs,in_size,out_size,activation_function=None):
    Weights=tf.Variable(tf.random_normal([in_size,out_size]))#权重最好为随机的
    biases=tf.Variable(tf.zeros[1,out_size]+0.1)#偏差最好不为零
    Wx_plus_b=tf.matmul(inputs,Weights)+biases
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs
    

2.2开始建造

通过制造数据,来建立神经网络,并通过可视化的方式对模型的效果进行了检验

#1.写add_layer函数 1.1 输入参数确定有输入、输入size、输出size(与权重有关,权重的维度维输入size*输出size)、激活函数。1.2初始化权重、偏置、输出表达式。1.3根据激活函数reture最后的输出
#2.构建从输入层到中间层1的网络,通过add_action,构建从中间层1到2.。。。。,构建从中间层n到y的输出层
#init所有变量,并run一下init
#构建损失函数,通过reduce_mean、reduce_sum、square求得loss
#构建训练器:从train中选择一种优化方式进行最小化损失函数的优化。
#run train,若输入输出为placeholder,则通过feed_dict进行输入。
import numpy as np
import tensorflow as tf
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]))#权重最好为随机的
    biases=tf.Variable(tf.zeros([1,out_size])+0.1)#偏差最好不为零
    Wx_plus_b=tf.matmul(inputs,Weights)+biases
    if activation_function is None:
        outputs = Wx_plus_b
    else:
        outputs = activation_function(Wx_plus_b)
    return outputs

xs = tf.placeholder(tf.float32, [None, 1])
ys = tf.placeholder(tf.float32, [None, 1])

#构建数据
x_data = np.linspace(-1,1,300, dtype=np.float32)[:, np.newaxis]# linspace表示在指定间隔内返回均匀间隔的数字
#[:, np.newaxis]具有增加维度的作用,在列的位置则表示列为1列,在行的位置则表示有一行,本例中,表示有300行,1列 ## https://blog.csdn.net/lanchunhui/article/details/49725065 newaxis
noise = np.random.normal(0, 0.05, x_data.shape).astype(np.float32)
y_data = np.square(x_data) - 0.5 + noise  #x^2-0.5

fig=plt.figure()#创建画布
ax=fig.add_subplot(1,1,1)#将图片分为1行1列,且图像在第1个图片的位置
s=ax.scatter(x_data,y_data)#散点图
plt.ion()
plt.show()

#构建神经网络
l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu) #从输入层到中间层1,输入为xs,输出为l1,激活函数为activation_function,输入维度为1,输出维度为10
prediction = add_layer(l1, 10, 1, activation_function=None)#l1为从中间层1到输出层,输入为l1,输出为prediction.
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1])) ##reduction_indices=[1]表示将数据降维为1维,是对平方差求平均
train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)#训练,学习率0.1
init = tf.global_variables_initializer()  # 初始化所有
sess = tf.Session()
sess.run(init)
for i in range(1000):
    # training
    sess.run(train_step, feed_dict={xs: x_data, ys: y_data})
    if i % 50 == 0:
        #print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))
        #通过图像形式表现
        try:
            ax.lines.remove(line[0]) #抹除前一条曲线,用try是因为若第一次的话不会有line
        except:
            pass
        prediction_value=sess.run(prediction,feed_dict={xs: x_data})
        line=ax.plot(x_data,prediction_value)#画连线图
        plt.pause(0.2)#暂停0.2秒

你可能感兴趣的:(深度学习)