模型不会训练(损失不移动)

时间:2017-06-19 18:41:09

标签: tensorflow conv-neural-network

TL; DR :使用Tensorflow优化器训练极小的神经网络时,我找不到我的错误。损失要么不移动要么一旦被卡住就会移动(看起来真的像0.633147那样是ln(2)......)。

问题和代码:我正在尝试在Tensorflow中实现Li等人(here)中的级联分类器的12-net部分。这是一个非常简单的网络,但我尝试的任何东西似乎都没有进行培训。

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个树),只是交替地将它们提供给优化器(显然不是最好的训练练习,但我只是想让它起作用):

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}))

我已经尝试了optimizer.run(...)和注释掉的sess.run([optimizer, loss]...)。第一个sess.run(loss...)似乎吐出了正确的东西,但在那之后,损失就会卡住而且再也不会移动了。显然,我在这里做错了,任何帮助都会受到赞赏!

0 个答案:

没有答案