Tensorflow 模型赢得';t列车(损失不移动)

Tensorflow 模型赢得';t列车(损失不移动),tensorflow,conv-neural-network,Tensorflow,Conv Neural Network,TL;DR:在使用Tensorflow优化器训练极小的神经网络时,我找不到我的错误。损失要么不移动,要么移动一次,然后卡住(看起来真的很像值0.693147,即ln(2)…) 问题和代码:我试图在Tensorflow中的Li等人()中实现级联分类器的12个净部分。这是一个非常简单的网,但我尝试的任何东西似乎都无法让它得到训练 import tensorflow as tf import tensorflow.contrib.slim as slim import cv2 import numpy

TL;DR:在使用Tensorflow优化器训练极小的神经网络时,我找不到我的错误。损失要么不移动,要么移动一次,然后卡住(看起来真的很像值0.693147,即ln(2)…)

问题和代码:我试图在Tensorflow中的Li等人()中实现级联分类器的12个净部分。这是一个非常简单的网,但我尝试的任何东西似乎都无法让它得到训练

import tensorflow as tf
import tensorflow.contrib.slim as slim
import cv2
import numpy as np


input_tensor = tf.placeholder(tf.float32, shape=[1, 12, 12, 3])
input_label = tf.placeholder(tf.float16, shape=[1, 2])
conv_1 = slim.conv2d(input_tensor, 16, (3, 3), scope='conv1')
pool_1 = slim.max_pool2d(conv_1, (3, 3), 2, scope='pool1')
flatten = slim.flatten(pool_1)
fully_con = slim.fully_connected(flatten, 16, scope='full_con')
fully_con_2 = slim.fully_connected(fully_con, 2, scope='output')
probs = tf.nn.softmax(fully_con_2)
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=input_label, logits=fully_con_2))
optimizer = tf.train.GradientDescentOptimizer(learning_rate=.001).minimize(loss)
这定义了网络。它接收(目前为单个)12x12图像和标签,使用步长1和16个过滤器进行单个3x3卷积,使用步长2进行3x3最大池,然后完全连接到16个特征,最后进行二值分类。我能够执行代码的前向传递,因此我认为问题不在这里。这是我的训练循环-我有3张12x12的图像(2张脸,1棵树),只是交替地将它们提供给优化器(显然不是最佳训练实践,但我只是想让它发挥作用):


我尝试了
optimizer.run(…)
和注释掉的
sess.run([optimizer,loss]…)
。第一次
sess.run(loss…
似乎吐出了一些正确的东西,但是在那之后,loss被卡住了,再也不会移动了。显然,我在这里做错了什么,任何帮助都将不胜感激

由于激活次数太少,我猜他们都被卡住了。尝试在所有层上设置
activation\u fn=None
(即使其线性化)。默认情况下,层添加RELU。即使你完成了调试,其中一些看起来应该是线性的。Allen,我尝试了你的解决方案,同样的问题也发生了-我还尝试将激活函数更改为PReLU和添加dropout,这两种方法似乎都不起作用。我还试着制作成批的图像,但在第一次迭代后仍然并没有任何移动。还有其他想法吗?不确定这是主要问题,但图像馈送逻辑有点不正确。如果i%3==0:,
elif i%3==1:
elif i%3==2:
,则它应该是
if __name__ == '__main__':
    im = cv2.imread('resized.jpg').reshape(1, 12, 12, 3).astype('float16')
    im2 = cv2.imread('resized2.jpg').reshape(1, 12, 12, 3).astype('float16')
    im3 = cv2.imread('resize3.jpg').reshape(1, 12, 12, 3).astype('float16')
    im_lab_1 = np.array([[0, 1]], dtype='float16')
    im_lab_2 = np.array([[0, 1]], dtype='float16')
    im_lab_3 = np.array([[1, 0]], dtype='float16')

    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        print(sess.run(loss, feed_dict={input_tensor: im3, input_label: im_lab_3}))
        for i in range(50000):
            if i % 3 == 0:
                # _, l = sess.run([optimizer, loss], feed_dict=feed1)
                # print(l)
                optimizer.run(feed_dict={input_tensor: im, input_label: im_lab_1})
            elif i % 4 == 0:
                # _, l = sess.run([optimizer, loss], feed_dict=feed2)
                # print(l)
                optimizer.run(feed_dict={input_tensor: im2, input_label: im_lab_2})
            elif i % 5 == 0:
                optimizer.run(feed_dict={input_tensor: im3, input_label: im_lab_3})
        print(sess.run(loss, feed_dict={input_tensor: im3, input_label: im_lab_3}))