TensorFlow编程入门(一)

写在最前

深度学习辣么火,感觉应该学习学习以免以后人家讲座什么的听不懂。因此想要从应用层面出发,学习学习,那就看看怎么用tensorflow(以下简称tf)做神经网络吧。这里看的是莫烦大大的视频,真心强烈安利:视频地址

Tensorflow 基础构架

本章主要讲解tensorflow主要的元素,其中包括会话session,变量variable,传入值placeholder,激励函数Activation Function。下面的代码是一个简单的tf程序的实例:

# coding:utf-8
import tensorflow as tf
import numpy as np

x_data = np.random.rand(100).astype(np.float32) # 生成100个随机数,类型是float32
y_data = x_data*0.1+0.3
Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0)) # tf.Variable是用来生成tf变量,这里就是生成一个[-1,1]数
biases = tf.Variable(tf.zeros([1])) # zeros可以生成一个0

y = Weights*x_data+biases # 针对每个x算出y值

loss = tf.reduce_mean(tf.square(y-y_data)) # 计算loss 平方求平均

optimizer = tf.train.GradientDescentOptimizer(0.5) # 找个训练方法就是什么梯度下降之类的
train = optimizer.minimize(loss) # 训练,让loss最小
init = tf.initialize_all_variables() # 初始化所有的变量
sess = tf.Session() # 会话,贼重要
sess.run(init) # 啥也得run才可以

print sess.run(Weights)

for step in range(201):
    sess.run(train)
    if step % 20 == 0:
        print step,sess.run(Weights),sess.run(biases)

会话Session

session是个执行命令的东西,用来执行tf图上的某个小的功能。就是啥也要用sess.run一下啦。这里演示一个简单的矩阵乘法:

# coding:utf-8
import tensorflow as tf

matrix1 = tf.constant([[3,3]])
matrix2 = tf.constant([[2],
                       [2]])
product = tf.matmul(matrix1,matrix2)  # matrix multiply np.dot(m1,m2)

这里定义了两个矩阵,而product是两个矩阵相乘的结果。但是,只是这样是无法得到结果的。因此需要session来运行,有两种方法: 方法一:

sess = tf.Session()
result = sess.run(product)
print result
sess.close()

方法二:

with tf.Session() as sess: # 自动关
    result2 = sess.run(product)
    print result2

变量Variable

下面有个例子能直观表现sess.run和变量的作用。

state = tf.Variable(0,name='counter')
one = tf.constant(1)
new_value = tf.add(state,one) # state+1的值赋给new_value
update = tf.assign(state,new_value) # 更新state的值

init = tf.initialize_all_variables() # 必须初始化

with tf.Session() as sess:
    sess.run(init)
    for _ in range(3): # 更新3次
        sess.run(update)
        print sess.run(state)

 这个方法输出1,2,3三个数。这可以看出,sess.run就是运行了一下update获得这个值。

placeholder

 placeholder的作用就是先给数据占个位置,在需要的时候再传入。

# coding:utf8
import tensorflow as tf
import numpy as np

input1 = tf.placeholder(tf.float32)
input2 = tf.placeholder(tf.float32)

output = tf.mul(input1,input2)

with tf.Session() as sess:
    print (sess.run(output,feed_dict={input1:[7.],input2:[2.]})) # placeholder和feed_dict是绑定的

显而易见,最后输出的值是14.

激励函数

 这个激励函数通常是sigmoid函数,当然还有很多,自己google吧~

建造神经网络

 最主要的函数就是add_layer()了,然后所有东西都在注释里了:

# coding:utf8
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

def add_layer(inputs,in_size,out_size,n_layer,activation_function=None):
    layer_name = 'layer%s'% n_layer
    with tf.name_scope(layer_name): # 意思是这个with里的元素被包括在scope里
        with tf.name_scope('weights'):
            Weights = tf.Variable(tf.random_normal([in_size,out_size]),name='W') # 就是建造一个数组,[行,列]
            tf.histogram_summary(layer_name+'/weights',Weights) # 让weights
        with tf.name_scope('biases'):
            biases = tf.Variable(tf.zeros([1,out_size]) + 0.1,name='b')
            tf.histogram_summary(layer_name+'/biases',biases)
        with tf.name_scope('Wx'):
            Wx_plus_b=tf.matmul(inputs,Weights) + biases # 计算一波
        if activation_function is None: # 如果不指定激励函数
            outputs = Wx_plus_b
        else:
            outputs = activation_function(Wx_plus_b) # 如果指定了激励函数
        tf.histogram_summary(layer_name+'/outputs',outputs)
        return outputs

x_data = np.linspace(-1,1,300)[:,np.newaxis] # 这个能生成300个数,后面中括号可以让它变成竖着的
noise = np.random.normal(0,0.05,x_data.shape) # 生成噪声点,这里是个正太分布,均值是0方差是0.05,和x_data一样的格式
y_data = np.square(x_data)-0.5+noise # 计算y

with tf.name_scope('inputs'):
    xs = tf.placeholder(tf.float32,[None,1],name='x_input')
    ys = tf.placeholder(tf.float32,[None,1],name='y_input')


l1 = add_layer(xs,1,10,n_layer=1,activation_function=tf.nn.relu) # 输入数据是xs,1个输入,10个输出,名字是1,激励函数是relu
predition = add_layer(l1,10,1,n_layer=2,activation_function=None) # 输入数据是l1的输出,10个输入,1个输出,名字是2,没激励函数
with tf.name_scope('loss'):
    loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-predition),reduction_indices=[1]))
    tf.scalar_summary('loss',loss)
with tf.name_scope('train'):
    train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

init = tf.initialize_all_variables()
sess = tf.Session()
merged = tf.merge_all_summaries()
writer = tf.train.SummaryWriter("logs/",sess.graph) # 将所有的图画到log里
sess.run(init)

fig = plt.figure() # 用这个画图
ax = fig.add_subplot(1,1,1) # 图片编号
ax.scatter(x_data,y_data) # 点的编号
plt.ion() # 不用停顿
plt.show() # 输出图片


for i in range(1000):
    sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
    if i%50 == 0:
        result = sess.run(merged,feed_dict={xs:x_data,ys:y_data})
        writer.add_summary(result,i) # 每i步输出一个结果
        try:
            ax.lines.remove(lines[0]) # 去除上次的线
        except Exception:
            pass
        #print sess.run(loss,feed_dict={xs:x_data,ys:y_data})
        predition_value = sess.run(predition,feed_dict={xs:x_data}) # 预测值
        lines = ax.plot(x_data,predition_value,'r-',lw=5) # 用红色,宽度为5的曲线的形式画出来预测曲线
        plt.pause(0.1)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏开心的学习之路

神经网络体系搭建(四)——快速上手TensorFlow

本篇是神经网络体系搭建的第四篇,解决体系搭建的TensorFlow相关问题,详见神经网络体系搭建(序) ? TensorFlow安装 建议用Anacond...

3425
来自专栏落影的专栏

Metal入门教程(六)边界检测

Metal入门教程(一)图片绘制 Metal入门教程(二)三维变换 Metal入门教程(三)摄像头采集渲染 Metal入门教程(四)灰度计算 Metal入门教程...

2999
来自专栏机器之心

教程 | 维度、广播操作与可视化:如何高效使用TensorFlow

选自GitHub 机器之心编译 参与:Nurhachu Null、李泽南 本文从 Tensorflow 基础、理解静态维度和动态维度、广播操作(Broading...

4725
来自专栏数据结构与算法

斯坦纳树小结

1630
来自专栏AILearning

【Scikit-Learn 中文文档】双聚类 - 无监督学习 - 用户指南 | ApacheCN

2.4. 双聚类 Biclustering 可以使用 sklearn.cluster.bicluster 模块。 Biclustering 算法对数据矩阵的...

3609
来自专栏月色的自留地

《连连看》算法c语言演示(自动连连看)

2869
来自专栏码云1024

游戏中的人物是如何寻路的?

2137
来自专栏小鹏的专栏

01 TensorFlow入门(1)

tensorflow_cookbook--第1章 TensorFlow入门         Google的TensorFlow引擎具有独特的解决问题的方法。 ...

27110
来自专栏人工智能LeadAI

人脸识别 | 卷积深度置信网络工具箱的使用

本文主要以ORL_64x64人脸数据库识别为例,介绍如何使用基于matlab的CDBN工具箱。至于卷积深度置信网络(CDBN,Convolutional Dee...

4275
来自专栏desperate633

LintCode 最小路径和题目分析代码

给定一个只含非负整数的m*n网格,找到一条从左上角到右下角的可以使数字和最小的路径。

642

扫码关注云+社区

领取腾讯云代金券