主要是按照视频代码贴一下,出现的错误可以展示并给出解决方案。
1 #coding:utf-8
2 #导入模块,生成模拟数据集
3 import tensorflow as tf
4 import numpy as np
5 BATCH_SIZE=8
6 seed=23455
7 #seed(n)这样生成的随机数每次是一样的
8 #基于seed()产生随机数
9 rng=np.random.RandomState(seed)
10 #随机数返回32行2列的矩阵,表示32组体积和数量,作为数据集
11 X=rng.rand(32,2)
12 #从X这个矩阵中,取出一行,判断如果和小鱼1,给Y复制1,否则0.
13 #作为输入数据的标签(正确答案)
14 Y=[[int(x0+x1<1)] for (x0,x1) in X]
15 print "X:\n",X
16 print "Y:\n",Y
17
18 #1定义神经网络的输入、参数和输出,定义前向传播过程。
19 x=tf.placeholder(tf.float32,shape=(None,2))
20 y_=tf.placeholder(tf.float32,shape=(None,1))
21
22 w1=tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
23 w2=tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
24 a=tf.matmul(x,w1)
25 y=tf.matmul(a,w2)
26
27
28 #2定义损失函数和反向传播方向
29 loss=tf.reduce_mean(tf.square(y-y_))
30 train_step=tf.train.GradientDescentOptimizer(0.001).minimize(loss)
31 #train_step=tf.train.MomentumOptimizer(0.001).minimize(loss)
32
33
34 #3生成回话,训练STEPS轮
35 with tf.Session() as sess:
36 Init_op=tf. global_variables_initializer()
37 sess.run(Init_op)
38 #输出目前未经训练的参数取值
39 print "w1:\n",sess.run(w1)
40 print "w2:\n",sess.run(w2)
41 print "\n"
42
43
44 #训练模型
45 STEPS=3000
46 for i in range(STEPS):
47 start=(i*BATCH_SIZE)%32
48 end=start+BATCH_SIZE
49 print(X[start:end])
50 # x=X[start:end]
51 # y_=Y[start:end]
52 #sess.run(train_step,x,y_)
53 sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]})
54 if i %500 ==0:
55 total_loss=sess.run(loss,feed_dict={x: X,y_: Y})
56 print("AFTER %d training steps,loss on all data is %s" %(i,total_loss))
57 #输出训练后参数
58 print "\n"
59 print "w1:\n",sess.run(w1)
60 print "w2:\n",sess.run(w2)
主要结果如下
w1:
[[-0.7000663 0.9136318 0.08953571]
[-2.3402493 -0.14641267 0.58823055]]
w2:
[[-0.06024267]
[ 0.91956186]
[-0.0682071 ]]
二.遇到的一些问题
2.1 报错:
File "/home/zengjun/.local/lib/python2.7/site-packages/tensorflow/python/client/session.py", line 1047, in _run
raise RuntimeError('Attempted to use a closed Session.')
RuntimeError: Attempted to use a closed Session
原因:实际上是with机制帮你关闭了文件f,这样可以避免有些人读写文件后忘记关闭文件。所以with代码块里的内容运行完了,你的sess就自动由with机制帮你关闭了,因此再次使用sess就会报错。
解决办法就是把代码块向后缩进,实际上就是指,所有与sess相关的操作都必须放在with代码块下,如果需要在外面再次使用,那你就需要重新开启一个sess --------------------- 本文来自 happyangel_nan 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/weixin_39390732/article/details/76474294?utm_source=copy
具体而言就是把这部分不要与 with 平齐
57 #输出训练后参数
58 print "\n"
59 print "w1:\n",sess.run(w1)
60 print "w2:\n",sess.run(w2)
而是与with下面的一句话平齐
57 #输出训练后参数
58 print "\n"
59 print "w1:\n",sess.run(w1)
60 print "w2:\n",sess.run(w2)
这样sess.run还能继续用,不然如果与with平齐,with Session就会关闭掉。