Написание следующего CNN в тензорном потоке

Я новичок в этом углубленном изучении. Я изучил основы, читая и пытаясь реализовать настоящую сеть, чтобы увидеть, как / если она действительно будет работать. Я выбрал Tensorflow в цифрах и в следующей сети, потому что они выдают точную архитектуру с обучающей техникой. Steganalysis с DL Я написал следующий код для архитектуры в Steganalysis с DL, рассматривая существующие сети в цифрах и документацию Tensorflow.

    from model import Tower
from utils import model_property
import tensorflow as tf
import tensorflow.contrib.slim as slim
import utils as digits

class UserModel(Tower):

    @model_property
    def inference(self):
        x = tf.reshape(self.x, shape=[-1, self.input_shape[0], self.input_shape[1], self.input_shape[2]])
        with slim.arg_scope([slim.conv2d, slim.fully_connected],
                            weights_initializer=tf.contrib.layers.xavier_initializer(),
                            weights_regularizer=slim.l2_regularizer(0.0001)):
            conv1 = tf.layers.conv2d(inputs=x, filters=64, kernel_size=7, padding='same', strides=2, activation=tf.nn.relu)
            rnorm1 = tf.nn.local_response_normalization(input=conv1)
            conv2 = tf.layers.conv2d(inputs=rnorm1, filters=16, kernel_size=5, padding='same', strides=1, activation=tf.nn.relu)
            rnorm2 = tf.nn.local_response_normalization(input=conv2) 
            flatten = tf.contrib.layers.flatten(rnorm2)
            fc1 = tf.contrib.layers.fully_connected(inputs=flatten, num_outputs=1000, activation_fn=tf.nn.relu)
            fc2 = tf.contrib.layers.fully_connected(inputs=fc1, num_outputs=1000, activation_fn=tf.nn.relu)
            fc3 = tf.contrib.layers.fully_connected(inputs=fc2, num_outputs=2)
            sm = tf.nn.softmax(fc3)
            return fc3

    @model_property
    def loss(self):
        model = self.inference
        loss = digits.classification_loss(model, self.y)
        accuracy = digits.classification_accuracy(model, self.y)
        self.summaries.append(tf.summary.scalar(accuracy.op.name, accuracy))
        return loss

Я пытался запустить его, но точность довольно низкая. Может кто-нибудь сказать мне, если я сделал это полностью неправильно или что-то не так с этим, и подскажите, как правильно его кодировать?

ОБНОВЛЕНИЕ: Спасибо, Нессуно! С исправлением, которое вы упомянули, я придумал этот код:

from model import Tower
from utils import model_property
import tensorflow as tf
import tensorflow.contrib.slim as slim
import utils as digits

class UserModel(Tower):

    @model_property
    def inference(self):
        x = tf.reshape(self.x, shape=[-1, self.input_shape[0], self.input_shape[1], self.input_shape[2]])
        with slim.arg_scope([slim.conv2d, slim.fully_connected],
                            weights_initializer=tf.contrib.layers.xavier_initializer(),
                            weights_regularizer=slim.l2_regularizer(0.00001)):
            conv1 = tf.layers.conv2d(inputs=x, filters=64, kernel_size=7, padding='Valid', strides=2, activation=tf.nn.relu)
            rnorm1 = tf.nn.local_response_normalization(input=conv1)
            conv2 = tf.layers.conv2d(inputs=rnorm1, filters=16, kernel_size=5, padding='Valid', strides=1, activation=tf.nn.relu)
            rnorm2 = tf.nn.local_response_normalization(input=conv2) 
            flatten = tf.contrib.layers.flatten(rnorm2)
            fc1 = tf.contrib.layers.fully_connected(inputs=flatten, num_outputs=1000, activation_fn=tf.nn.relu)
            fc2 = tf.contrib.layers.fully_connected(inputs=fc1, num_outputs=1000, activation_fn=tf.nn.relu)
            fc3 = tf.contrib.layers.fully_connected(inputs=fc2, num_outputs=2, activation_fn=None)
            return fc3

    @model_property
    def loss(self):
        model = self.inference
        loss = digits.classification_loss(model, self.y)
        accuracy = digits.classification_accuracy(model, self.y)
        self.summaries.append(tf.summary.scalar(accuracy.op.name, accuracy))
        return loss

Тип решателя - SGD. Скорость обучения составляет 0,001. Я перетасовываю тренировочные данные. Я увеличил тренировочные данные до 6000 (3000 на категорию, 20% от этой суммы зарезервировано для проверки). Я скачал данные тренировок по этой ссылке. Но я получаю только следующий график. Я думаю, что это переоснащение. Есть ли у вас какие-либо предложения по повышению точности проверки?

график

1 ответ

Решение

В цифрах NVIDIA, classification_loss точно так же как в тензорном потоке tf.nn.softmax_cross_entropy_with_logits ожидает на входе линейный слой нейрона.

Вместо этого вы передаете в качестве ввода sm = tf.nn.softmax(fc3) следовательно, вы применяете операцию softmax 2 раза, и это является причиной вашей низкой точности.

Чтобы решить эту проблему, просто измените выходной слой модели на

fc3 = slim.fully_connected(fc2, 2, activation_fn=None, scope='fc3')
return fc3
Другие вопросы по тегам