olivttifaces人脸识别CNN+Tensorflow(调试及学习)

调试要点及学习

  • 报错: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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值