调试要点及学习
-
报错:You must feed a value for placeholder tensor ‘Placeholder’ with dtype float
首先要排查基本问题:
(1)上面的placeholder占位符(理解为声明)没有被赋值(成为变量),为找具体的placeholder最好给它命名(定义的时候)
(2)查看的输入的placeholder的shape和dtype是否正确
(3)当输入的placeholder的shape和dtype正确时,那么注意在计算图中是否有对该placeholder(成为变量了)进行运算或重新赋值
基本问题(1)(2)是可以显而易见的排查;
重点是对(3)的排查花了一些心思:
*检查了每层输出output数据的张量大小,以全连接层fc1为例
```with tf.Session() as sess: initial_opt=tf.global_variables_initializer() sess.run(initial_opt) batch_size=40 for i in range (2) : xdata=train_faces[i*batch_size:(i+1)*batch_size] ydata=train_labels[i*batch_size:(i+1)*batch_size] fc11=sess.run(fc1,feed_dict={x_img:xdata,yreal:ydata}) print(fc11.shape)
*问题多容易出现在卷积层进入连接层这一步,卷积层输出一般是张量,需要将其拉成2D向量后进入全连接层
函数:**tf.contrib.layers.flatten(P)**对于输入的P,将每一个example展开为1-D的Tensor, 但是依然保留batch-size。它返回一个[batch_size, k]的Tensor。通常在CNN的最后一步连接到Fully Connected 的网络之前会将其展开,例如CNN的conv层输出的tensor的shape为[batch_size, height, width, channel], 刚展开会就是[batch_size, height * width * channel]。
但我在实际使用中出现调用问题,因此使用
tf.reshape(使用时要知道conv2_output的张量大小)input_flat=tf.reshape(conv2_output,[-1,15*12*64])
-
运行无报错,但是输出cost为nan
解决:排查喂入的数据是否有nan,结果发现labels有问题
初始化labels时使用np.empty会出现这个问题,具体原因还没研究,将初始化改为np.zeros即可 -
运行无报错,可以输出cost,但是发现几轮(一般两三轮后)cost数值就保持不变了,怀疑进入了线性区或者饱和区,对应去看cost_func,果然多了一次softmax运算
-
运行无报错,可以输出cost,但是逐步增大,说明并没有收敛,直观推测两方面原因:
(1)学习步长多大
(2)喂入输入有问题
果然,还是labels有问题。。
程序代码稍后会上传github,直接贴进来时发现经常死掉。。
参数简单粗暴的调了一下,对比如下
| 梯度下降
( tf.train.GradientDescentOptimizer)| |
|-batchsize-|–|
| learning rate | 0.01 |0.05|0.01|0.02
| epoch number| 20 | 20 |40|40
| loss_result | 26.47|30|3.2|0.35