Tensorflow总是返回相同的结果

时间:2017-04-11 08:32:08

标签: python tensorflow

我用tensorflow编写代码来训练和测试卷积神经网络。 我使用自己的jpeg图像输入。 图像文件由我自己的代码input_batch.py​​称为批处理格式。 在被调用之后,使用convpool.py进行卷积。 但现在,我在测试数据中的结果返回相同的值。 同样在训练中,一些批处理数据的卷积结果返回相同。

我也看过这个问题,Tensorflow predicts always the same result 但是这个问题的解决方案无法应用于我的代码中。

我的结果总是这样返回:

步骤0,训练准确度0.2

result: [[  5.76441448e-18   1.00000000e+00]
 [  5.76441448e-18   1.00000000e+00]
 [  5.76441448e-18   1.00000000e+00]
 [  5.76441448e-18   1.00000000e+00]
 [  5.76441448e-18   1.00000000e+00]
 [  5.76441448e-18   1.00000000e+00]
 [  5.76434913e-18   1.00000000e+00]
 [  5.85150709e-18   1.00000000e+00]
 [  2.83430459e-17   1.00000000e+00]
 [  0.00000000e+00   1.00000000e+00]]

test result:[[ 0.  1.]]actual result:[ 1.  0.]
test result:[[ 0.  1.]]actual result:[ 1.  0.]
test result:[[ 0.  1.]]actual result:[ 0.  1.]
test result:[[ 0.  1.]]actual result:[ 0.  1.]
test result:[[ 0.  1.]]actual result:[ 0.  1.]
test result:[[ 0.  1.]]actual result:[ 1.  0.]
test result:[[ 0.  1.]]actual result:[ 1.  0.]
test result:[[ 0.  1.]]actual result:[ 0.  1.]
test result:[[ 0.  1.]]actual result:[ 1.  0.]
test result:[[ 0.  1.]]actual result:[ 1.  0.]

这是我的代码:

import tensorflow as tf
import input_batch
import input
import convpool
import matplotlib.pyplot as plt
import numpy as np

FLAGS = tf.app.flags.FLAGS
sess = tf.Session()

x_image = tf.placeholder("float", shape=[None,FLAGS.width,FLAGS.height,FLAGS.depth])
y_ = tf.placeholder("float", shape=[None,FLAGS.num_class])

# x_image=tf.reshape(x,[-1,FLAGS.width,FLAGS.height,FLAGS.depth])


def weight_variable(shape):
    initial=tf.truncated_normal(shape,stddev=0.1)
    return tf.Variable(initial)

def bias_variable(shape):
    initial=tf.constant(0.1,shape=shape)
    return tf.Variable(initial)

def spp_layer(x,n_bin,output_depth):
    (a,b,c,d) = x.get_shape()
    h = int(b+(n_bin-1))/n_bin
    w = int(c+(n_bin-1))/n_bin
    return tf.reshape(tf.nn.max_pool(x,ksize=[1, h, w, 1], strides=[1, h, w, 1], padding='SAME'),[-1, n_bin * n_bin , output_depth])

W_conv1 = weight_variable([11, 11, 3 , 96])
b_conv1 = bias_variable([96])

W_conv2 = weight_variable([5, 5, 96, 256])
b_conv2 = bias_variable([256])

W_fc1 = weight_variable([14*14* 256, 4096])
b_fc1 = bias_variable([4096])

W_fc2 = weight_variable([4096, 2])
b_fc2 = bias_variable([2])

keep_prob = tf.placeholder("float")
y_conv_train = convpool.train(x_image,W_conv1,b_conv1,W_conv2,b_conv2,W_fc1,b_fc1,W_fc2,b_fc2,keep_prob)

cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y_conv_train,1e-10,1.0)))
train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
correct_prediction = tf.equal(tf.argmax(y_conv_train,1),tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))


sess = tf.Session()
sess.run(tf.initialize_all_variables())

for i in range(50):
    batch = input_batch.get_data_jpeg(sess,'train',10)

    if i%1==0:
        train_accuracy = sess.run(accuracy,feed_dict={x_image:batch[0], y_:batch[1], keep_prob:1.0})
        train_result = sess.run(y_conv_train, feed_dict={x_image: batch[0], y_: batch[1], keep_prob: 1.0})
        # print('result : ', sess.run(W_fc2))
        print("step %d, training accuracy %g" %(i,train_accuracy))
        print('result:', train_result)
    sess.run(train_step, feed_dict={x_image:batch[0], y_:batch[1], keep_prob:0.5})


# ############################test###################################

for i in range (10):
    input.initialization()
    testinput = input.get_data_jpeg(sess,'eval')

    test_img = testinput.x_data
    (i_x,i_y,i_z) = testinput.x_size

    testimg = tf.reshape(test_img, [-1,i_x,i_y,i_z])
    testresult=convpool.train(testimg,W_conv1,b_conv1,W_conv2,b_conv2,W_fc1,b_fc1,W_fc2,b_fc2,1.0)


    result = sess.run(testresult)



print("test result:"+str(result)+ "actual result:"+ str(testinput.y_data))


#convpool.py

import tensorflow as tf
FLAGS = tf.app.flags.FLAGS


def train(input,W_conv1,b_conv1,W_conv2,b_conv2,W_fc1,b_fc1,W_fc2,b_fc2,keep_prob):

    h_conv1 = tf.nn.relu(tf.nn.conv2d(input, W_conv1, strides=[1, 4, 4, 1], padding='SAME') + b_conv1)
    h_pool1 = tf.nn.max_pool(h_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

    h_conv2 = tf.nn.relu(tf.nn.conv2d(h_pool1, W_conv2, strides=[1, 1, 1, 1], padding='SAME') + b_conv2)
    h_pool2 = tf.nn.max_pool(h_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

    # print(h_pool2)

    h_pool2_flat = tf.reshape(h_pool2, [-1, 14*14 * 256])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)

    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)

    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
    return y_conv

#input_batch.py

import os
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import random

FLAGS = tf.app.flags.FLAGS

tf.app.flags.DEFINE_string('data_dir', 'C://Users/sh/PycharmProjects/test2/data',
                           """Directory where to write event logs """
                           """and checkpoint.""")
FLAGS.width = 224
FLAGS.height = 224
FLAGS.depth = 3
FLAGS.num_class = 2
batch_index = 0
filenames = []
FLAGS.imsize =  FLAGS.height * FLAGS.width * FLAGS.depth

def get_filenames(data_set):
    global filenames
    labels = [ ]

    with open(FLAGS.data_dir + '/labels.txt') as f:
        for line in f:
            inner_list = [elt.strip() for elt in line.split(',')]
            labels += inner_list

    for i, label in enumerate(labels): 
        list = os.listdir(FLAGS.data_dir + '/' + data_set + '/' +label)
        for filename in list:
            filenames.append([label + '/' + filename, i])

    random.shuffle(filenames)

def get_data_jpeg(sess, data_set, batch_size): 
    global batch_index, filenames


    if len(filenames) == 0:
        get_filenames(data_set)
    max = len(filenames)

    begin = batch_index
    end = batch_index + batch_size

    if end >= max: 
        end = max
        batch_index = 0

    x_data = np.array([]) 
    y_data = np.zeros((batch_size, FLAGS.num_class))     
    index = 0

    for i in range(begin, end) :
                    with tf.gfile.FastGFile(FLAGS.data_dir + '/' + data_set + '/' + filenames[i][0], 'rb') as f :
            image_data = f.read()

        decode_image = tf.image.decode_jpeg(image_data, channels=FLAGS.depth)

        resized_image = tf.image.resize_images(decode_image, [FLAGS.height, FLAGS.width],method=1)
        image = sess.run(resized_image)



        x_data = np.append(x_data, np.asarray(image.data, dtype='float32'))/255
        y_data[index][filenames[i][1]] = 1         batch_index += batch_size

    try:
        x_data = x_data.reshape(batch_size, FLAGS.height, FLAGS.width, FLAGS.depth)
    except:
        return None, None

    return  x_data, y_data

0 个答案:

没有答案