【神经网络chapter1】初探Tensorflow & 打造简单的神经网络

使用 TensorFlow, 你必须明白 TensorFlow:(真的很重要,多看几遍!!)

  • 使用图 (graph) 来表示计算任务.
  • 在会话 (Session) 的上下文 (context) 中执行图.
  • 使用 tensor 表示数据.
  • 通过 变量 (Variable) 维护状态.
  • 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.

为了在Python中进行高效的数值计算,我们通常会使用像NumPy一类的库,将一些诸如矩阵乘法的耗时操作在Python环境的外部来计算,这些计算通常会通过其它语言并用更为高效的代码来实现。但遗憾的是,每一个操作切换回Python环境时仍需要不小的开销。如果你想在GPU或者分布式环境中计算时,这一开销更加可怖,这一开销主要可能是用来进行数据迁移。

TensorFlow也是在Python外部完成其主要工作,但是进行了改进以避免这种开销。其并没有采用在Python外部独立运行某个耗时操作的方式,而是先让我们描述一个交互操作图,然后完全将其运行在Python外部。这与Theano或Torch的做法类似。

图中的节点被称之为 op (operation)。一个 TensorFlow 图描述了计算的过程. 为了进行计算, 图必须在会话里被启动。会话将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法. 这些方法执行后, 将产生的 tensor 返回. 在 Python 中, 返回的 tensor 是 numpy ndarray 对象;
TensorFlow 程序通常被组织成一个构建阶段和一个执行阶段
在构建阶段, op 的执行步骤 被描述成一个图. 在执行阶段, 使用会话执行执行图中的 op.
例如, 通常在构建阶段创建一个图来表示和训练神经网络, 然后在执行阶段反复执行图中的训练op.

先导入各种需要的包

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

先来一个栗子

看不懂没关系,感受一下 [捂脸]

#create data
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data*0.5+0.3

#create tensorflow structure
weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
biases = tf.Variable(tf.zeros([1]))

y = weights*x_data+biases
loss = tf.reduce_mean(tf.square(y-y_data))
optimizer = tf.train.GradientDescentOptimizer(0.5)#步长 一般<1
train = optimizer.minimize(loss)

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for step in range(401):
        sess.run(train)
        if step%20==0:
            print(step,sess.run(weights),sess.run(biases))
            # weight 是tensor 无法直接输出,只能用sess.run输出

结果:
0 [0.33718207] [0.534774]
20 [0.4442017] [0.329881]
40 [0.4861154] [0.30743548]
60 [0.49654502] [0.30185023]
80 [0.4991403] [0.3004604]
100 [0.4997861] [0.30011457]
120 [0.49994674] [0.30002853]
140 [0.49998677] [0.3000071]
160 [0.49999675] [0.30000177]
180 [0.4999992] [0.30000043]
200 [0.4999998] [0.30000013]
220 [0.4999998] [0.30000013]
240 [0.4999998] [0.30000013]
260 [0.4999998] [0.30000013]
280 [0.4999998] [0.30000013]
300 [0.4999998] [0.30000013]
320 [0.4999998] [0.30000013]
340 [0.4999998] [0.30000013]
360 [0.4999998] [0.30000013]
380 [0.4999998] [0.30000013]
400 [0.4999998] [0.30000013]

Session会话控制

为了真正进行运算, 并获取结果, 你必须在会话里启动这个图.

matrix1 = tf.constant([[3,3]])
matrix2 = tf.constant([[2],[2]])

#matmul = matrix multiply
product = tf.matmul(matrix1,matrix2)

#method1
sess = tf.Session()
result = sess.run(product)
# product代表了矩阵乘法 op 的输出, 传入它是向方法表明, 我们希望取回矩阵乘法 op 的输出.
print(result)
sess.close()

#method2  推荐
with tf.Session() as sess:
    result = sess.run(product)
    print(result)

输出:
[[12]]

Variable

如果定义了变量,一定要初始化并激活,sess.run(init)后才激活成功。

state = tf.Variable(0,name = 'counter')
print(state.name)

one = tf.constant(1)

new_value = tf.add(state , one)
update = tf.assign(state,new_value)
# assign()和add()操作是图所描绘的表达式的一部分,
# 所以在调用run()执行表达式之前, 它并不会真正执行赋值操作.

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    for _ in range(3):
        sess.run(update)
        print(sess.run(state))  # print(state)没用,要先把run指针放到state上去。

输出:
counter_6:0
1
2
3

为了取回 op 的输出内容, 可以在使用 Session 对象的 run() 调用 执行图时, 传入一些 tensor, 这些 tensor 会帮助你取回结果. 在之前的例子里, 我们只取回了单个节点 state, 但是你也可以取回多个 tensor。

input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.multiply(input1, intermed)

with tf.Session() as sess:
  result = sess.run([mul, intermed])
  print(result)
输出:
[21.0, 7.0]

Feed

  • run()的时候用feed_dict传进去
  • 每一次用不同的值代替它

TensorFlow 还提供了 feed 机制, 该机制可以临时替代图中的任意操作中的 tensor,可以对图中任何操作提交补丁, 直接插入一个 tensor。
feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 "feed" 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.

input1 =tf.placeholder(tf.float32)
input2 =tf.placeholder(tf.float32)
output = tf.multiply(input1,input2)
with tf.Session() as sess:
    print(sess.run(output,feed_dict={input1:[7.],input2:[2.]}))

输出:
[14.]

activate function 把输入掰弯

eg:relu sigmoid tanh
cnn中推荐relu,rnn中推荐relu,tanh

题外话:np.newaxis的作用
# np.newaxis分别是在行或列上增加维度,原来是(5,)的数组,
# 在行上增加维度变成(1,5)的二维数组,在列上增加维度变为(5,1)的二维数组

a=np.array([1,2,3,4,5])
b=a[np.newaxis,:]
c=a[:,np.newaxis]
print(a.shape,b.shape,c.shape)
print(a)
print(b)
print(c)

输出:
(5,) (1, 5) (5, 1)
[1 2 3 4 5]
[[1 2 3 4 5]]
[[1]
 [2]
 [3]
 [4]
 [5]]

打造第一个神经网络

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==None:
        outputs = Wx_plus_b
    else:outputs = activation_function(Wx_plus_b)
    return outputs

#create data
x_data = np.linspace(-1,1,300)[:,np.newaxis]
noise = np.random.normal(0,0.05,x_data.shape)
y_data = np.square(x_data)-0.5 +noise

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

# create graph
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
prediction = add_layer(l1,10,1,activation_function=None)

loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(loss)

init = tf.global_variables_initializer()

fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.scatter(x_data,y_data)
plt.ion()
#plt.show()#静态的

with tf.Session() as sess:
    sess.run(init)
    for i in range(1001):
        sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
        ##可以是一部分的x_data,y_data,mini-batch
        if i%50==0:
            print(sess.run(loss,feed_dict={xs:x_data,ys:y_data}))
            '''
            predict_value = sess.run(prediction,feed_dict={xs:x_data})
            try:ax.lines.remove(lines[0])
            except Exception:pass
            lines = ax.plot(x_data,predict_value,'r-',lw=5)#红色线宽=5
            plt.pause(0.1)
            '''
    predict_value = sess.run(prediction,feed_dict={xs:x_data})
    ax.plot(x_data,predict_value,'r-',lw=5)#红色线宽=5

输出:
6.1317863
0.056988537
0.008828914
0.004499426
0.0036805507
0.003411163
0.0032926842
0.003222807
0.003188555
0.0031720304
0.003157696
0.0031499555
0.0031452782
0.0031413904
0.003138115
0.0031350984
0.0031322953
0.003129168
0.0031263472
0.003123648
0.0031211614

参考:
官方API手册
莫烦大佬的b站视频

菜鸟一只,如有错误,恳请指正。

看了一天tensorflow,脑阔疼~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335