CNN не тренируется и не проверяет должным образом - PullRequest
0 голосов
/ 09 июня 2018

Я пытаюсь решить задачу бинарной классификации. У меня есть матрица из 20 000 X 50 нулей и единиц, и 20 000 изображений каждая картинка представляет собой размерный вектор 4392, который во время процесса я изменит в 61 * 72 и пройдет через сеть.после того, как я пропущу изображения через сеть, я хочу получить для каждого изображения размерный вектор из 50 нулей и единиц, а затем сравнить предсказанные результаты с истинными значениями, которые я загрузил.у меня есть сверточная нейронная сеть, которую я построил, используя этот пример: https://pythonprogramming.net/cnn-tensorflow-convolutional-nerual-network-machine-learning-tutorial/?completed=/convolutional-neural-network-cnn-machine-learning-tutorial//У меня есть набор данных изображений, которые я делю для обучения и тестирования (обычно 80% для обучения и 20% для тестирования).но когда я запускаю код, моя точность обучения и потери не меняются, чтобы соответствовать и оставаться на одном уровне в течение всего процесса.я попытался изменить пару параметров в моем коде, включая размер данных, скорость обучения (0,001,0.1,0.01,0.0001), количество слоев (2,3,4,5), и пробовал несколько функций стоимости и вычисления точности,но это не помогает вообще.вот мой код:

 
    from <strong>future</strong> import absolute_import
    from <strong>future</strong> import division
    from <strong>future</strong> import print_function
    import csv 
    import time
    import os
    import urllib</p>

<code>import numpy as np
import tensorflow as tf
start_time = time.time()


data_in = np.transpose(np.loadtxt(open("20k_IMAGES.csv"), delimiter=","))
ones_zeros= np.loadtxt(open("activations20k.csv"), delimiter=",")
print("--- %s seconds ---" % (time.time() - start_time))

epochs=10
learning_rate=0.001
batch_size=200
n_classes=50
height=61
width=72
channels=1
n_inputs=height*width

train_X=data_in[0:16000,:]     #training set (images) (8000,4392)
test_X=data_in[16000:20000,:]   # test se (images)   (2000,4392)
train_Y=ones_zeros[0:16000,:]    #training set (labels) (8000,50)
test_Y=ones_zeros[16000:20000,:]  #test set (labels)    (2000,50)

n = train_X.shape[1] #4392
m = train_X.shape[0]
d = train_Y.shape[1] #50
k= train_Y.shape[0]
l = test_X.shape[0] #2000

x = tf.placeholder(tf.float32, shape=[None, n_inputs], name="X")

trainY = tf.placeholder(tf.float32, shape=[None,n_classes], name="trainY")
testY= tf.placeholder(tf.int32, shape=[l,d], name="testY")
testX= tf.placeholder(tf.int32, shape=[l,n], name="testX")

keep_rate = 0.8
keep_prob = tf.placeholder(tf.float32) #try to remove it


def conv2d(x, W):
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')

def maxpool2d(x):
    #                        size of window         movement of window
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')


def convolutional_neural_network(x):
    weights = {'W_conv1': tf.Variable(tf.random_normal([5, 5, 1, 32])),
               'W_conv2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
               'W_conv3': tf.Variable(tf.random_normal([5, 5, 64, 128])),
               'W_conv4': tf.Variable(tf.random_normal([5, 5, 128, 256])),
               'W_conv5': tf.Variable(tf.random_normal([5, 5, 256, 512])),
               'W_fc': tf.Variable(tf.random_normal([2 * 3 * 512, 1024])), #check if 15 or 16
               'out': tf.Variable(tf.random_normal([1024, n_classes]))}

    biases = {'b_conv1': tf.Variable(tf.random_normal([32])),
              'b_conv2': tf.Variable(tf.random_normal([64])),
              'b_conv3':tf.Variable(tf.random_normal([128])),
              'b_conv4': tf.Variable(tf.random_normal([256])),
              'b_conv5': tf.Variable(tf.random_normal([512])),
              'b_fc': tf.Variable(tf.random_normal([1024])),
              'out': tf.Variable(tf.random_normal([n_classes]))}

    x = tf.reshape(x, shape=[-1, 61, 72, 1])

    conv1 = tf.nn.relu(conv2d(x, weights['W_conv1']) + biases['b_conv1'])
    conv1 = maxpool2d(conv1)

    conv2 = tf.nn.relu(conv2d(conv1, weights['W_conv2']) + biases['b_conv2'])
    conv2 = maxpool2d(conv2)

    conv3 = tf.nn.relu(conv2d(conv2, weights['W_conv3']) + biases['b_conv3'])
    conv3 = maxpool2d(conv3)

    conv4 = tf.nn.relu(conv2d(conv3, weights['W_conv4']) + biases['b_conv4'])
    conv4 = maxpool2d(conv4)

    conv5 = tf.nn.relu(conv2d(conv4, weights['W_conv5']) + biases['b_conv5'])
    conv5 = maxpool2d(conv5)

    fc = tf.reshape(conv5, [-1, 2 * 3 * 512])
    fc = tf.nn.relu(tf.matmul(fc, weights['W_fc']) + biases['b_fc'])
    fc = tf.nn.dropout(fc, keep_rate)

    output = tf.matmul(fc, weights['out']) + biases['out']
    sig_output = tf.nn.sigmoid(output)

    return sig_output

def train_neural_network(x):
    prediction = convolutional_neural_network(x)

    #cost = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=prediction, labels=trainY))
    #cost= tf.reduce_mean(tf.losses.sigmoid_cross_entropy(multi_class_labels=trainY, logits=prediction))
    cost=tf.losses.absolute_difference(labels=trainY, predictions=prediction)
    #cost=tf.losses.log_loss(labels=trainY, predictions=prediction)
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
    #optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
    # Here you check whether the index of the maximum value of the predicted image is equal to the actual labelled image. and both will be a column vector.
    correct_prediction = tf.equal(tf.argmax(prediction, 1), tf.argmax(trainY, 1))
    # calculate accuracy across all the given images and average them out.
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for epoch in range(epochs):
            for iteration in range(len(train_X) // batch_size):

                X_batch = train_X[iteration * batch_size:iteration * batch_size + batch_size,:]
                y_batch = train_Y[iteration * batch_size:iteration * batch_size + batch_size,:]

                sess.run(optimizer, feed_dict={x: X_batch , trainY: y_batch})
                train_loss=sess.run(cost, feed_dict={x: X_batch , trainY: y_batch})
                train_acc=sess.run(accuracy, feed_dict={x: X_batch , trainY: y_batch})
                preds_train = sess.run(prediction, feed_dict={x: X_batch, trainY: y_batch})
                print("Batch:", '%04d' % (batch_size * iteration), "iteration:", '%04d' % iteration, "Epoch",
                      '%04d' % (epoch + 1), "loss=","{:.6f}".format(train_loss), ",training accuracy=", "{:.6f}".format(train_acc))  # ,"probabilities:",predictions)
                #print("train predictions:", preds_train)
        print("Optimization Finished!")


        valid_loss = sess.run([cost], feed_dict={x: test_X, trainY: test_Y}) #change trainY to y in test and training
        print("validation loss:", valid_loss)
        test_acc = sess.run([accuracy], feed_dict={x: test_X, trainY: test_Y})#change trainY to y in test and training
        print("Testing Accuracy:",test_acc)
        preds_test=sess.run(prediction, feed_dict={x: test_X, trainY: test_Y})
        print("test predictions:", preds_test)
        #pred = open('predictions.csv', 'w')
        np.savetxt("prediction4k_of20k.csv", preds_test, delimiter=",")
        np.savetxt("test_Y4k_of_20k.csv", test_Y, delimiter=",")

    train_neural_network(x)


    print("--- %s seconds ---" % (time.time() - start_time))
</code>

Что еще я могу сделать, чтобы улучшить свой код, чтобы он мог работать правильно?починить это?спасибо за помощь !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...