0

我是这个深度学习的新手。我通过阅读并尝试实现一个真实的网络来了解它如何/是否真的有效,从而学习了基础知识。我选择了 Tensorflow 数字和以下网络,因为它们给出了带有训练材料的确切架构。使用 DL 进行隐写分析 我通过查看数字现有网络和 Tensorflow 文档中的网络,为使用 DL 的隐写分析中的架构编写了以下代码。

    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

我尝试运行它,但准确性非常低。有人能告诉我我是不是完全错了,或者有什么问题,并告诉我如何正确编码?

更新:谢谢 Nessuno!通过您提到的修复,我想出了以下代码:

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% 用于验证)。我从这个链接下载了训练数据。但我只得到下图。我认为这是过度拟合。您对提高验证准确性有什么建议吗?

图形

4

1 回答 1

1

在 NVIDIA 数字中,classification_loss与 tensorflow 中tf.nn.softmax_cross_entropy_with_logits期望的输入是神经元的线性层完全一样。

相反,您作为 input 传递sm = tf.nn.softmax(fc3),因此您应用了 softmax 操作 2 次,这是您的低准确度的原因。

为了解决这个问题,只需将模型输出层改为

fc3 = slim.fully_connected(fc2, 2, activation_fn=None, scope='fc3')
return fc3
于 2018-04-24T11:46:01.830 回答