Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow tf.nn.l2_规格化使精确度降低_Tensorflow_Conv Neural Network_Normalize - Fatal编程技术网

Tensorflow tf.nn.l2_规格化使精确度降低

Tensorflow tf.nn.l2_规格化使精确度降低,tensorflow,conv-neural-network,normalize,Tensorflow,Conv Neural Network,Normalize,我正在尝试训练一个类似于Facenet和Openface的卷积神经网络。 我的模型的灵感来自VGG-16(发布在下面) 问题是,当我在返回输出之前使用output=tf.nn.l2_normalize(output,0)时,精度会显著下降我在不使用l2_规格化的情况下获得了接近98%的准确率,但是,所描述的openface模型使用它 以下是我使用output=tf.nn.l2\u normalize(output,0)得到的结果: 编辑-这些是我的结果,没有tf.nn.l2\u规范化(输出,0)

我正在尝试训练一个类似于Facenet和Openface的卷积神经网络。 我的模型的灵感来自VGG-16(发布在下面)

问题是,当我在返回输出之前使用
output=tf.nn.l2_normalize(output,0)
时,精度会显著下降我在不使用l2_规格化的情况下获得了接近98%的准确率,但是,所描述的openface模型使用它

以下是我使用
output=tf.nn.l2\u normalize(output,0)
得到的结果:

编辑-这些是我的结果,没有
tf.nn.l2\u规范化(输出,0)

为什么会发生这种情况?作为损失函数,我正在使用(我只考虑损失大于零的三元组)

以后编辑

在发送到卷积神经网络之前,我已经对图像进行了标准化,那么为什么需要对输出进行标准化呢

但是,我使用输出将包含人脸的图像编码为128个值。然后,我将原始图像与其他人的图像进行比较,并使用每个图像的128个特征之间的欧几里德距离来确定原始图像中的人物。因此,我认为规范化输出有助于进行这些比较(计算网络为每个图像生成的特征之间的欧几里德距离)

因此,考虑到这一点,我应该使用
tf.nn.l2_规范化

def get_opencv_image_casia(self, file): #unde file e calea catre poza

        img_helper_1 = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
        img_helper_1 = cv2.resize(img_helper_1, (160, 160))

        img1 = np.reshape(img_helper_1, (25600))

        img1 = np.array(img1, dtype=np.uint8)
        img1 = img1.astype('float32')

        img1_pos = (img1 - img1.mean()) / (img1.std() + 1e-8)

        return (img1_pos, file)

通常,添加L2正则化会降低训练精度并提高泛化(测试集)精度。您是否同时计算这两者?标准化(例如通过特征缩放)通常应用于输入数据,以便您的特征以类似的方式变化。我认为将输出标准化是没有意义的。(正则化是一种降低模型复杂性以防止过度拟合的方法,通常会导致某些权重基本为零。它通常只是在训练期间添加到损失函数中的一个术语。)链接中的代码是Lua,因此我不清楚他们对
nn.Normalize
的调用是什么。当您在代码中调用
tf.nn.l2_normalize
时,您希望它做什么?@DavidParks以TEST开头的行显示我的测试集的准确性。它远低于不使用nn.l2_归一化的网络计算的测试集精度。我还添加了一个编辑,我实际上是在将输入图像发送到网络之前对其进行规范化。那么nn.l2_规范化有必要吗?@Stephen我的想法正是如此。我正在规范化输入图像,那么为什么需要规范化输出呢?但是,我使用输出对一个带有128个值的面的图像进行编码。然后将图像与其他人进行比较,并利用128个特征之间的欧几里德距离确定原始图像中的人。因此,我认为在使用欧几里德距离时,规范化输出会有所帮助。虽然有点晚,但我认为正确的代码应该是
tf.nn.l2_normalize(output,axis=1)
,因为您希望每个输出都有l2范数1,所以需要跨轴1进行规范化。如果跨轴0(批处理维度)进行规格化,则会得到不同的结果。通常,添加L2正则化会降低训练精度并提高泛化(测试集)精度。您是否同时计算这两者?标准化(例如通过特征缩放)通常应用于输入数据,以便您的特征以类似的方式变化。我认为将输出标准化是没有意义的。(正则化是一种降低模型复杂性以防止过度拟合的方法,通常会导致某些权重基本为零。它通常只是在训练期间添加到损失函数中的一个术语。)链接中的代码是Lua,因此我不清楚他们对
nn.Normalize
的调用是什么。当您在代码中调用
tf.nn.l2_normalize
时,您希望它做什么?@DavidParks以TEST开头的行显示我的测试集的准确性。它远低于不使用nn.l2_归一化的网络计算的测试集精度。我还添加了一个编辑,我实际上是在将输入图像发送到网络之前对其进行规范化。那么nn.l2_规范化有必要吗?@Stephen我的想法正是如此。我正在规范化输入图像,那么为什么需要规范化输出呢?但是,我使用输出对一个带有128个值的面的图像进行编码。然后将图像与其他人进行比较,并利用128个特征之间的欧几里德距离确定原始图像中的人。因此,我认为在使用欧几里德距离时,规范化输出会有所帮助。虽然有点晚,但我认为正确的代码应该是
tf.nn.l2_normalize(output,axis=1)
,因为您希望每个输出都有l2范数1,所以需要跨轴1进行规范化。如果跨轴0(批次维度)进行规格化,将得到不同的结果。
epoch 0  loss 0.20137 acc 56.56 
nr_test_examples 6400
total_batch_test 100
TEST epoch 0  loss 0.15097 acc 73.44 
epoch 1  loss 0.20044 acc 57.64 
nr_test_examples 6400
total_batch_test 100
TEST epoch 1  loss 0.10509 acc 82.81 
epoch 2  loss 0.19985 acc 58.14 
nr_test_examples 6400
total_batch_test 100
TEST epoch 2  loss 0.09480 acc 78.12 
epoch 3  loss 0.19978 acc 58.89 
nr_test_examples 6400
total_batch_test 100
TEST epoch 3  loss 0.07886 acc 82.81 
epoch 4  loss 0.20060 acc 59.12 
nr_test_examples 6400
total_batch_test 100
TEST epoch 4  loss 0.05395 acc 85.94 
epoch 5  loss 0.19938 acc 59.39 
nr_test_examples 6400
total_batch_test 100
TEST epoch 5  loss 0.07320 acc 87.50 
epoch 6  loss 0.20056 acc 59.14 
nr_test_examples 6400
total_batch_test 100
def siamese_convnet(x):

    w_conv1_1 = tf.get_variable(name='w_conv1_1', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 1, 64])
    w_conv1_2 = tf.get_variable(name='w_conv1_2', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 64, 64])

    w_conv2_1 = tf.get_variable(name='w_conv2_1', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 64, 128])
    w_conv2_2 = tf.get_variable(name='w_conv2_2', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 128, 128])

    w_conv3_1 = tf.get_variable(name='w_conv3_1', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 128, 256])
    w_conv3_2 = tf.get_variable(name='w_conv3_2', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 256, 256])
    w_conv3_3 = tf.get_variable(name='w_conv3_3', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 256, 256])

    w_conv4_1 = tf.get_variable(name='w_conv4_1', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 256, 512])
    w_conv4_2 = tf.get_variable(name='w_conv4_2', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 512, 512])
    w_conv4_3 = tf.get_variable(name='w_conv4_3', initializer=tf.contrib.layers.xavier_initializer(), shape=[1, 1, 512, 512])

    w_conv5_1 = tf.get_variable(name='w_conv5_1', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 512, 512])
    w_conv5_2 = tf.get_variable(name='w_conv5_2', initializer=tf.contrib.layers.xavier_initializer(), shape=[3, 3, 512, 512])
    w_conv5_3 = tf.get_variable(name='w_conv5_3', initializer=tf.contrib.layers.xavier_initializer(), shape=[1, 1, 512, 512])

    w_fc_1 = tf.get_variable(name='w_fc_1', initializer=tf.contrib.layers.xavier_initializer(), shape=[5*5*512, 2048])
    w_fc_2 = tf.get_variable(name='w_fc_2', initializer=tf.contrib.layers.xavier_initializer(), shape=[2048, 1024])

    w_out = tf.get_variable(name='w_out', initializer=tf.contrib.layers.xavier_initializer(), shape=[1024, 128])

    bias_conv1_1 = tf.get_variable(name='bias_conv1_1', initializer=tf.constant(0.01, shape=[64]))
    bias_conv1_2 = tf.get_variable(name='bias_conv1_2', initializer=tf.constant(0.01, shape=[64]))

    bias_conv2_1 = tf.get_variable(name='bias_conv2_1', initializer=tf.constant(0.01, shape=[128]))
    bias_conv2_2 = tf.get_variable(name='bias_conv2_2', initializer=tf.constant(0.01, shape=[128]))

    bias_conv3_1 = tf.get_variable(name='bias_conv3_1', initializer=tf.constant(0.01, shape=[256]))
    bias_conv3_2 = tf.get_variable(name='bias_conv3_2', initializer=tf.constant(0.01, shape=[256]))
    bias_conv3_3 = tf.get_variable(name='bias_conv3_3', initializer=tf.constant(0.01, shape=[256]))

    bias_conv4_1 = tf.get_variable(name='bias_conv4_1', initializer=tf.constant(0.01, shape=[512]))
    bias_conv4_2 = tf.get_variable(name='bias_conv4_2', initializer=tf.constant(0.01, shape=[512]))
    bias_conv4_3 = tf.get_variable(name='bias_conv4_3', initializer=tf.constant(0.01, shape=[512]))

    bias_conv5_1 = tf.get_variable(name='bias_conv5_1', initializer=tf.constant(0.01, shape=[512]))
    bias_conv5_2 = tf.get_variable(name='bias_conv5_2', initializer=tf.constant(0.01, shape=[512]))
    bias_conv5_3 = tf.get_variable(name='bias_conv5_3', initializer=tf.constant(0.01, shape=[512]))

    bias_fc_1 = tf.get_variable(name='bias_fc_1', initializer=tf.constant(0.01, shape=[2048]))
    bias_fc_2 = tf.get_variable(name='bias_fc_2', initializer=tf.constant(0.01, shape=[1024]))

    out = tf.get_variable(name='out', initializer=tf.constant(0.01, shape=[128]))

    x = tf.reshape(x , [-1, 160, 160, 1]);

    conv1_1 = tf.nn.relu(conv2d(x, w_conv1_1) + bias_conv1_1);
    conv1_2= tf.nn.relu(conv2d(conv1_1, w_conv1_2) + bias_conv1_2);

    max_pool1 = max_pool(conv1_2);

    conv2_1 = tf.nn.relu( conv2d(max_pool1, w_conv2_1) + bias_conv2_1 );
    conv2_2 = tf.nn.relu( conv2d(conv2_1, w_conv2_2) + bias_conv2_2 );

    max_pool2 = max_pool(conv2_2)

    conv3_1 = tf.nn.relu( conv2d(max_pool2, w_conv3_1) + bias_conv3_1 );
    conv3_2 = tf.nn.relu( conv2d(conv3_1, w_conv3_2) + bias_conv3_2 );
    conv3_3 = tf.nn.relu( conv2d(conv3_2, w_conv3_3) + bias_conv3_3 );

    max_pool3 = max_pool(conv3_3)

    conv4_1 = tf.nn.relu( conv2d(max_pool3, w_conv4_1) + bias_conv4_1 );
    conv4_2 = tf.nn.relu( conv2d(conv4_1, w_conv4_2) + bias_conv4_2 );
    conv4_3 = tf.nn.relu( conv2d(conv4_2, w_conv4_3) + bias_conv4_3 );

    max_pool4 = max_pool(conv4_3)

    conv5_1 = tf.nn.relu( conv2d(max_pool4, w_conv5_1) + bias_conv5_1 );
    conv5_2 = tf.nn.relu( conv2d(conv5_1, w_conv5_2) + bias_conv5_2 );
    conv5_3 = tf.nn.relu( conv2d(conv5_2, w_conv5_3) + bias_conv5_3 );

    max_pool5 = max_pool(conv5_3)

    fc_helper = tf.reshape(max_pool5, [-1, 5*5*512]);
    fc_1 = tf.nn.relu( tf.matmul(fc_helper, w_fc_1) + bias_fc_1 );

    fc_2 = tf.nn.relu( tf.matmul(fc_1, w_fc_2) + bias_fc_2 );

    output = tf.matmul(fc_2, w_out) + out
    output = tf.nn.l2_normalize(output, 0)

    return output
def get_opencv_image_casia(self, file): #unde file e calea catre poza

        img_helper_1 = cv2.imread(file, cv2.IMREAD_GRAYSCALE)
        img_helper_1 = cv2.resize(img_helper_1, (160, 160))

        img1 = np.reshape(img_helper_1, (25600))

        img1 = np.array(img1, dtype=np.uint8)
        img1 = img1.astype('float32')

        img1_pos = (img1 - img1.mean()) / (img1.std() + 1e-8)

        return (img1_pos, file)