tensorflow总结(用tensorflow写一个完整的神经网络)

声明:本文为博主原创文章,转载请附上博文链接!
原文链接: https://blog.csdn.net/hutao1030813002/article/details/109565543
以下只是初学tensorflow的总结和遇到的问题

基于TensorFlow在模拟数据集上训练一个神经网络

以下是代码和我的一些标注:

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)

y = tf.sigmoid(y)
#定义损失函数
cross_entropy = -tf.reduce_mean(
    y_*tf.log(tf.clip_by_value(y, 1e-10, 1.0))
    +(1-y)*tf.log(tf.clip_by_value(1-y, 1e-10, 1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)

#通过随机数生成一个模拟数据集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)

Y = [[int(x1+x2 < 1)] for (x1, x2) in X]
#创建一个会话来运行 TensorFlow 程序。
with tf.Session() as sess:
    init_op = tf.global_variables_initializer()#初始化所有参数
    sess.run(init_op)

    print(sess.run(w1))
    print(sess.run(w2))

    #设定训练的轮数。
    EPOCH = 5000
    for i in range(EPOCH):
        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))

tf.placeholder

1》TensorFlow 提供了 placeholder 机制用于提供输入数据。
2》placeholder 当于定义了 个位置,这个位 中的数据在程序运行时再指定。这样在程序中就不需要生成大量常量来提供输入数据,而只需要将数据通过placeholder传入TensorFlow 计算图 。
3》在 placeholder 定义时,这个位置上的数据类型是需要指定的。和其他张量一样,placeholder 类型也是不可以改变的。 placeholder 中数据的维度信息可以根据提供的数据推导得出,所以不一定要给出。

tf.reduce_mean

tf.reduce_mean 函数用于计算张量tensor沿着指定的数轴(tensor的某一维度)上的的平均值,主要用作降维或者计算tensor(图像)的平均值。

reduce_mean(input_tensor,
                axis=None,                
                keep_dims=False,                
                name=None,               
                reduction_indices=None)

第一个参数input_tensor: 输入的待降维的tensor;
第二个参数axis: 指定的轴,如果不指定,则计算所有元素的均值;
第三个参数keep_dims:是否降维度,设置为True,输出的结果保持输入tensor的形状,设 置为False,输出结果会降低维度;
第四个参数name: 操作的名称;
第五个参数 reduction_indices:在以前版本中用来指定轴,已弃用;

Y = [[int(x1+x2 < 1)] for (x1, x2) in X]

这段半天也没看懂,百度也没百度到,请教了一个大佬才知道,是python的一个列表for循环的一个列表推导式。这种用法很少见,主要是为了简洁代码。我给改为一般形式就能看懂了

Y=[]
for (x1,x2) in X:
    Y.append([int(x1+x2<1)])

管理会话


#创建 个会话,并通过 Python 中的上下文管理器来管理这个会话。
with tf. Session() as sess: 
#使用创建好的会话来计算关心的结果。
sess. run ( ... ) 
#不需要再调用“ Session.close ()”函数来关闭会话,
#当上下文退出时会话关闭和资源释放也自动完成了。

练习中遇到的问题

问题一

Traceback (most recent call last):
  File "E:/tensorflow-study/study.py", line 20, in <module>
    train_step = tf.train.AdamOptimizer(0.001).minimizer(cross_entropy)
AttributeError: 'AdamOptimizer' object has no attribute 'minimizer'

这个问题是由于minimizer多加了一个r造成的,把r去掉应该就能解决这个bug

问题二

RuntimeError: Attempted to use a closed Session.

运行结果会出现Attempted to use a closed Session报错提示,原因是因为‘EPOCH=5000’这步出现了问题。如果“EPOCH=5000”与“with tf.Session() as sess1:”对齐就会有这样的提示。

解决办法:把with tf. Session() as sess:后面的代码都要空出一个tab格子这样它才能在运行结束时自动的sess.close()

以上即是我初学TensorFlow的总结和遇到的问题,如果能够对大家有所帮助,请给我点个赞。也欢迎大家和我交流学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值