声明:本文为博主原创文章,转载请附上博文链接!
原文链接: 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()