0

我正在嘗試實現卷積神經網絡來識別臉部。問題是我想要在10節課上進行訓練,並且能夠在測試時間預測10節以上的課程(例如20節課)。預測臉部識別中的未知臉部

我怎麼能這樣做,而不影響舊文件識別的測試準確率?因爲我得到的測試精度很低,有時爲0.


這是我的代碼。

batch_size = 16 
patch_size = 5 
depth = 16 
num_hidden = 128 
num_labels = 12 
num_channels = 1 

def reformat(dataset, labels): 
    dataset = dataset.reshape(
    (-1, IMAGE_SIZE_H, IMAGE_SIZE_W, num_channels)).astype(np.float32) 


    labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32) 

def accuracy(predictions, labels): 

    return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1)) 
     /predictions.shape[0]) 


graph = tf.Graph() 

with graph.as_default(): 

    # Input data. 

    tf_train_dataset = tf.placeholder(
    tf.float32, shape=(batch_size, IMAGE_SIZE_H, IMAGE_SIZE_W, num_channels)) 
    print("tf_train_dataset",tf_train_dataset) 
    tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels)) 
    tf_valid_dataset = tf.constant(valid_dataset) 
    tf_test_dataset = tf.constant(test_dataset) 

    layer1_weights = tf.Variable(tf.truncated_normal(
     [patch_size, patch_size, num_channels, depth], stddev=0.1)) 
    layer1_biases = tf.Variable(tf.zeros([depth])) 

    layer2_weights = tf.Variable(tf.truncated_normal(
     [patch_size, patch_size, depth, depth], stddev=0.1)) 
    layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth])) 

    layer3_weights = tf.Variable(tf.truncated_normal(
     [IMAGE_SIZE_H // 16 * IMAGE_SIZE_W // 16 * depth, num_hidden], stddev=0.1)) 
    layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden])) 

    layer4_weights = tf.Variable(tf.truncated_normal(
     [num_hidden, num_labels], stddev=0.1)) 

    layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels])) 

    conv_1 = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME') 
    hidden_1 = tf.nn.relu(conv_1 + layer1_biases) 
    pool_1 = tf.nn.max_pool(hidden_1,ksize = [1,2,2,1], strides= [1,2,2,1],padding ='SAME') 
    conv_2 = tf.nn.conv2d(pool_1, layer2_weights, [1, 2, 2, 1], padding='SAME') 
    hidden_2 = tf.nn.relu(conv_2 + layer2_biases) 
    pool_2 = tf.nn.max_pool(hidden_2,ksize = [1,2,2,1], strides= [1,2,2,1],padding ='SAME') 

    shape = pool_2.get_shape().as_list() 
    reshape = tf.reshape(pool_2, [shape[0], shape[1] * shape[2] * shape[3]]) 
    hidden_3 = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases) 
    return tf.matmul(hidden_3, layer4_weights) + layer4_biases 

    # Training computation. 

logits = model(tf_train_dataset) 
loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits,tf_train_labels)) 


    # Optimizer. 

optimizer = tf.train.GradientDescentOptimizer(0.001).minimize(loss) 

    # Predictions for the training, validation, and test data. 

train_prediction = tf.nn.softmax(logits) 
valid_prediction = tf.nn.softmax(model(tf_valid_dataset)) 
test_prediction = tf.nn.softmax(model(tf_test_dataset)) 

num_steps = 201 

with tf.Session(graph=graph) as session: 

    tf.initialize_all_variables().run() 
    print('Initialized') 
    for step in range(num_steps): 
     offset = (step * batch_size) % (train_labels.shape[0] - batch_size) 
     batch_data = train_dataset[offset:(offset + batch_size), :, :, :] 
     batch_labels = train_labels[offset:(offset + batch_size), :] 
     feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels} 
     _, l, predictions = session.run(
     [optimizer, loss, train_prediction ], feed_dict=feed_dict) 
     if (step % 50 == 0): 
     print('Minibatch loss at step %d: %f' % (step, l)) 
     print('Minibatch accuracy: %.1f%%' % accuracy(predictions, batch_labels) 
     print('Validation accuracy: %.1f%%' % accuracy(
      valid_prediction.eval(), valid_labels)) 
    print('Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels[:,0:9])) 
+0

更改測試數據不會影響訓練網絡,舊測試數據的準確性應該穩定。 –

+0

你怎麼能預測在火車組裏沒有的班級? –

+0

是的,我知道如果我刪除未訓練的圖像,它給了我一個很高的準確性,但我的項目是創建新的類,如果在訓練數據集中不可用 – mido

回答

1

這是不可能的培養上一定數量的類(10所認同你)有交叉熵模型,並與不同類別(例如,用10點新的10個訓練身份,對於一個測試共20個)。

您需要無論如何擺脫(大小[num_hidden, 10]的)最後SOFTMAX層的使用尺寸[num_hidden, 20]未經訓練的 SOFTMAX層。

問題是這個新圖層將被隨機初始化,並且會產生非常糟糕的結果。


一般的解決方法來處理未知類在深度學習是構建每個輸入數據(面部)的非常好的表示成(的大小num_hidden)的特徵空間。這種技術被稱爲representation learning

想象一下,你有一個很好的特徵空間,你的模型發送面孔。理論上,一個身份的所有面孔將被髮送到一個乾淨的集羣中的同一個位置。然後,您將能夠運行k-means來獲取身份集羣或任何算法,其中包含,其中k是測試身份的數量(k=20)。


有很多種方法可以獲得良好的嵌入。您可以在softmax之前獲得最後一個隱藏層,甚至可以獲得已經訓練過的模型的最後一個隱藏層(VGGFace具有非常好的結果並可以免費獲得)。

VGGFace論文中另一個有趣的想法是使用三重損失來微調嵌入。

+0

謝謝@Olivier Moindrot,可能你是對的,我已經看到鏈接[VGGFace],但matlab中的內容文件,我不熟悉它,我可以通過使用tensorflow使用VGG-Face CNN描述符嗎? – mido