Нулевая точность Tensorflow CNN?

У меня есть набор данных из 25000 цветных изображений 100 * 100 (* 3), и я пытаюсь построить простую нейронную сеть с одним сверточным слоем. Это изображения клеток, зараженных или не зараженных малярией, поэтому мой вывод равен 2. Но для каждой партии я получаю точность 0%. Мои партии имеют размер 1, но я пробовал с другим размером, но точность по-прежнему равна 0%.

Мой CNN:

def simple_nn(X_training, Y_training, X_test, Y_test):
    input = 100*100*3
    h1 = 100
    batch_size = 1
    learning_rate = 0.000001
    dropout = 0.2

    X = tf.placeholder(tf.float32, [batch_size, 100, 100, 3], name = "is_train")
    Y_ = tf.placeholder(tf.float32, [None, 2])

    #Layers
    conv1 = tf.layers.conv2d(X, filters=64, kernel_size=4,
                         strides=2, padding='SAME',
                         activation=tf.nn.relu, name = "conv1")
    conv1 = tf.layers.batch_normalization(conv1)
    conv1 = tf.layers.max_pooling2d(conv1, 2, 2)

    conv2 = tf.layers.conv2d(conv1, filters=128, kernel_size=3,
                         strides=2, padding='SAME',
                         activation=tf.nn.relu, name = "conv2")
    conv2 = tf.layers.dropout(conv2, rate=dropout)

    conv3 = tf.layers.conv2d(conv2, filters=256, kernel_size=3,
                     strides=2, padding='SAME',
                     activation=tf.nn.relu, name = "conv3")
    conv3 = tf.layers.dropout(conv3, rate=dropout)

    conv4 = tf.layers.conv2d(conv3, filters=64, kernel_size=3,
                     strides=2, padding='SAME',
                     activation=tf.nn.relu, name = "conv4")
    conv4 = tf.layers.max_pooling2d(conv4, 2, 2)

    conv5 = tf.layers.conv2d(conv4, filters=32, kernel_size=3,
                         strides=2, padding='SAME',
                         activation=tf.nn.relu, name = "conv5")
    Y = tf.reshape(conv5, [batch_size,-1])
    logits = tf.layers.dense(Y, units=2, activation=tf.nn.relu)

    # loss function
    cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y_, logits=logits)
    loss = tf.reduce_mean(tf.cast(cross_entropy, tf.float32))

    # % of correct answers found in batch
    is_correct = tf.equal(tf.argmax(Y,1), tf.argmax(Y_,1))
    accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))


    optimizer = tf.train.GradientDescentOptimizer(learning_rate)
    train_step = optimizer.minimize(cross_entropy)

    init = tf.global_variables_initializer()

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

    for i in range(math.floor(len(X_training)/batch_size)):
        st = batch_size * i
        end = st + batch_size

        if end >= math.floor(len(X_training)) - batch_size:
            break
        batch_X, batch_Y = X_training[st:end], Y_training[st:end]
        train_data = {X: batch_X, Y_: batch_Y}

        sess.run(train_step, feed_dict=train_data)

        #Get the accuracy and loss
        a, l = sess.run([accuracy, cross_entropy], feed_dict=train_data)
        print("acc : "+str(a)+" , loss : "+str(l))

Мой вывод:

acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.69436306]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931662]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6925567]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.69259375]
acc : 0.0 , loss : [0.6912933]
acc : 0.0 , loss : [0.6957785]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6990725]
acc : 0.0 , loss : [0.69037354]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6991633]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.6931472]
acc : 0.0 , loss : [0.700589]
acc : 0.0 , loss : [0.6931472]

Я получал 65% (имеется в виду acc=0.65) с простым не сверточным слоем, но так как я переключился на конв, acc=0.0. Сначала я прошел через это, по какой-то причине точность была возвращена в мою переменную loss при использовании сверточных слоев, но сейчас я так не думаю, я думаю, что что-то не так в моей функции потерь. И даже если я уменьшу свою модель до одного слоя, происходит то же самое, и мой loss все еще рядом 0.69.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 932
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны минимизировать по сокращенному вектору. Изменить эту строку

train_step = optimizer.minimize(cross_entropy)

к этому:

train_step = optimizer.minimize(loss)

Кроме того, вы не включаете слой logits в расчет точности. Сделай это:

is_correct = tf.equal(tf.argmax(logits,1), tf.argmax(Y_,1))
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))

Кроме того, вы применяете две активации к слою logits. Сначала у вас есть tf.nn.relu, а затем вы используете softmaxtf.nn.softmax_cross_entropy_with_logits_v2()). Не уверен, что вы делаете это намеренно.

Я все еще получаю тот же результат, когда я меняю эту строку, все еще точность 0,0

Zul Huky 06.04.2019 15:38

@ZulHuky, есть еще одна вероятная проблема. Обновил только что.

Vlad 06.04.2019 16:01

Спасибо, теперь у меня больше нет 0% точности! Но у меня точность около 50%, это еще одна проблема (моя функция потерь по-прежнему дает мне значение около 0,69 для каждой партии)

Zul Huky 06.04.2019 16:27

@ZulHuky, рад помочь. Удачи с этим!

Vlad 06.04.2019 16:29

Другие вопросы по теме