tensorflow google实战 (一)

tensorflow google实战 (一):入门

本文的目的重点在于填那些使用老版(新版的教程电子版找不到…)的教程和新版环境的坑。
教程:tensorflow google实战第一版
环境:win7+anaconda3+python3.5

代码我会选取部分贴出来,毕竟一些一看就明白的就不用敲一遍了,大冬天了手也冻得很…

#计算的定义

import tensorflow as tf
a = tf.constant([1,2,3])
b = tf.constant([3,4,5])
g = tf.Graph()
with g.device('/gpu:0'):
    result = a+b

#张量
张量可以简单的理解为多维数组,它并没有真正保存数字,它保存的是如何得到这些数字的计算过程。

print(result)

输出结果:Tensor(“add_1:0”, shape=(3,), dtype=int32)

#获取计算结果
Session登场,想要得到计算的结果,必须显示调用Session. Session有两种模式:
第一种需要明确调用会话(Session)生成函数和关闭会话函数:

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

为了更清楚的看到运行结果,我加了个print.这种模式如果忘记调用sess.close()容易出现内存泄漏问题。
第二种模式,无需显示调用sess.close()函数(放在with块里面就阔以了):

with tf.Session() as sess:
    sess.run(result)
    print(result.eval())

#tensorflow实现神经网络
不懂神经网络的自行科普…
1、给变量指定初始值

weights = tf.Variable(tf.random_normal([2,3],stddev=2)) #初始化为均值=0,方差=2的随机数
biases = tf.Variable(tf.zeros([3]) #初始化为0

ps:其他初始化方法可参考pdf或API

2、简单的前向传播例子

w1 = tf.Variable(tf.random_normal([2,3],stddev=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1))

x = tf.constant([[0.7,0.9]])
a = tf.matmul(x,w1) #矩阵相乘必须用matmul
y = tf.matmul(a,w2)
sess = tf.Session()
sees.run(w1.initializer) #初始化计算必须显示调用
sees.run(w2.initializer)
print(sess.run(y))
sess.close()

变量一个一个初始化是不是太麻烦了…一个函数搞定

init_op = tf.global_variables_initializer() #pdf中用的initialize_all_variables()新版本已经不用了
sess.run(init_op)

#placeholder
我理解的是相当于定义函数的形式参数,指定类型即可。

w1 = tf.Variable(tf.random_normal([2,3],stddev=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1))

x = tf.placeholder(tf.float32,shape=(3,2),name = 'input') #占位
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)

sess = tf.Session()
init_op = tf.global_variables_initializer() #一起初始化了
sess.run(init_op)
#print(sess.run(y))  这句会报错
print(sess.run(y,feed_dict={x:[[0.7,0.9],[0.1,0.2],[0.3,0.4]]})) #必须指定输入的值,要不然怎么算结果...feed_dict是字典,不懂字典的,自行脑补
sess.close()

#损失函数

cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0))) #y_*log(y)就是交叉熵计算公式..reduce_mean()是计算均值,clip_by_value()就是把y的值截断在设置范围内
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy) #这句话顾名知义就是使用了Adam优化方法,括号里的0.001就是学习率啦...当然也可以指定为GD等等

#以一个例子作为本文的ending

 import tensorflow as tf
 from numpy.random import RandomState
       
batch_size = 8
w1 = tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
w2 = tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))

x = tf.placeholder(tf.float32,shape=(None,2),name='x-input')
y_ = tf.placeholder(tf.float32,shape=(None,1),name='y-input')

a = tf.matmul(x,w1)
y = tf.matmul(a,w2)

# define loss function
cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

# produce a dataset
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size,2)  
Y = [[int(x1+x2 < 1)] for (x1,x2) in X]
# create a session
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()
    sess.run(init_op)
    print(sess.run(w1))
    print(sess.run(w2))
    
    STEPS = 5000
    for i in range(STEPS):
        start = (i * batch_size) % dataset_size
        end = min(start + batch_size,dataset_size)
        sess.run(train_step,feed_dict={x:X[start:end],y_:Y[start:end]})
        
        if i%1000 == 0:
            total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})
            print('after %d training step(s), cross entropy on all data is %g' % (i,total_cross_entropy))
            
    print(sess.run(w1))
    print(sess.run(w2))

运行结果(仅供参考,由于指定了随机种子,结果几乎一致才对):
[[-0.8113182 1.4845988 0.06532937]
[-2.4427042 0.0992484 0.5912243 ]]
[[-0.8113182 ]
[ 1.4845988 ]
[ 0.06532937]]
after 0 training step(s), cross entropy on all data is 0.0674925
after 1000 training step(s), cross entropy on all data is 0.0163385
after 2000 training step(s), cross entropy on all data is 0.00907547
after 3000 training step(s), cross entropy on all data is 0.00714436
after 4000 training step(s), cross entropy on all data is 0.00578471
[[-1.9618274 2.582354 1.6820378]
[-3.4681718 1.0698233 2.11789 ]]
[[-1.8247149]
[ 2.6854665]
[ 1.4181951]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值