2016-12-10 12 views
11

Tôi đang cố gắng triển khai facenet trong Keras với phần phụ trợ Thensorflow và tôi gặp một số vấn đề với tổn thất ba lần. enter image description herelỗ ba mặt facenet với keras

tôi gọi là chức năng phù hợp với 3 * n số hình ảnh và sau đó tôi xác định chức năng mất tùy chỉnh của tôi như sau:

def triplet_loss(self, y_true, y_pred): 

    embeddings = K.reshape(y_pred, (-1, 3, output_dim)) 

    positive_distance = K.mean(K.square(embeddings[:,0] - embeddings[:,1]),axis=-1) 
    negative_distance = K.mean(K.square(embeddings[:,0] - embeddings[:,2]),axis=-1) 
    return K.mean(K.maximum(0.0, positive_distance - negative_distance + _alpha)) 

self._model.compile(loss=triplet_loss, optimizer="sgd") 
self._model.fit(x=x,y=y,nb_epoch=1, batch_size=len(x)) 

nơi y chỉ là một mảng giả đầy 0s

Các vấn đề là ngay cả sau lần lặp đầu tiên với kích thước lô 20, mô hình bắt đầu dự đoán cùng một nhúng cho tất cả các hình ảnh. Vì vậy, khi tôi lần đầu tiên thực hiện dự đoán trên mỗi lần nhúng thì khác nhau. Sau đó, tôi làm phù hợp và dự đoán một lần nữa và đột nhiên tất cả các embeddings trở nên gần như giống nhau cho tất cả các hình ảnh trong lô

Cũng lưu ý rằng có một lớp Lambda ở cuối mô hình. Nó bình thường hóa đầu ra của mạng để tất cả các embeddings có chiều dài đơn vị như nó đã được đề xuất trong nghiên cứu net mặt.

Ai có thể giúp tôi ở đây không?

tóm tắt mẫu

Layer (type)      Output Shape   Param #  Connected to      
==================================================================================================== 
input_1 (InputLayer)    (None, 224, 224, 3) 0            
____________________________________________________________________________________________________ 
convolution2d_1 (Convolution2D) (None, 112, 112, 64) 9472  input_1[0][0]      
____________________________________________________________________________________________________ 
batchnormalization_1 (BatchNormal(None, 112, 112, 64) 128   convolution2d_1[0][0]    
____________________________________________________________________________________________________ 
maxpooling2d_1 (MaxPooling2D) (None, 56, 56, 64) 0   batchnormalization_1[0][0]  
____________________________________________________________________________________________________ 
convolution2d_2 (Convolution2D) (None, 56, 56, 64) 4160  maxpooling2d_1[0][0]    
____________________________________________________________________________________________________ 
batchnormalization_2 (BatchNormal(None, 56, 56, 64) 128   convolution2d_2[0][0]    
____________________________________________________________________________________________________ 
convolution2d_3 (Convolution2D) (None, 56, 56, 192) 110784  batchnormalization_2[0][0]  
____________________________________________________________________________________________________ 
batchnormalization_3 (BatchNormal(None, 56, 56, 192) 384   convolution2d_3[0][0]    
____________________________________________________________________________________________________ 
maxpooling2d_2 (MaxPooling2D) (None, 28, 28, 192) 0   batchnormalization_3[0][0]  
____________________________________________________________________________________________________ 
convolution2d_5 (Convolution2D) (None, 28, 28, 96) 18528  maxpooling2d_2[0][0]    
____________________________________________________________________________________________________ 
convolution2d_7 (Convolution2D) (None, 28, 28, 16) 3088  maxpooling2d_2[0][0]    
____________________________________________________________________________________________________ 
maxpooling2d_3 (MaxPooling2D) (None, 28, 28, 192) 0   maxpooling2d_2[0][0]    
____________________________________________________________________________________________________ 
convolution2d_4 (Convolution2D) (None, 28, 28, 64) 12352  maxpooling2d_2[0][0]    
____________________________________________________________________________________________________ 
convolution2d_6 (Convolution2D) (None, 28, 28, 128) 110720  convolution2d_5[0][0]    
____________________________________________________________________________________________________ 
convolution2d_8 (Convolution2D) (None, 28, 28, 32) 12832  convolution2d_7[0][0]    
____________________________________________________________________________________________________ 
convolution2d_9 (Convolution2D) (None, 28, 28, 32) 6176  maxpooling2d_3[0][0]    
____________________________________________________________________________________________________ 
merge_1 (Merge)     (None, 28, 28, 256) 0   convolution2d_4[0][0]    
                    convolution2d_6[0][0]    
                    convolution2d_8[0][0]    
                    convolution2d_9[0][0]    
____________________________________________________________________________________________________ 
convolution2d_11 (Convolution2D) (None, 28, 28, 96) 24672  merge_1[0][0]      
____________________________________________________________________________________________________ 
convolution2d_13 (Convolution2D) (None, 28, 28, 32) 8224  merge_1[0][0]      
____________________________________________________________________________________________________ 
maxpooling2d_4 (MaxPooling2D) (None, 28, 28, 256) 0   merge_1[0][0]      
____________________________________________________________________________________________________ 
convolution2d_10 (Convolution2D) (None, 28, 28, 64) 16448  merge_1[0][0]      
____________________________________________________________________________________________________ 
convolution2d_12 (Convolution2D) (None, 28, 28, 128) 110720  convolution2d_11[0][0]   
____________________________________________________________________________________________________ 
convolution2d_14 (Convolution2D) (None, 28, 28, 64) 51264  convolution2d_13[0][0]   
____________________________________________________________________________________________________ 
convolution2d_15 (Convolution2D) (None, 28, 28, 64) 16448  maxpooling2d_4[0][0]    
____________________________________________________________________________________________________ 
merge_2 (Merge)     (None, 28, 28, 320) 0   convolution2d_10[0][0]   
                    convolution2d_12[0][0]   
                    convolution2d_14[0][0]   
                    convolution2d_15[0][0]   
____________________________________________________________________________________________________ 
convolution2d_16 (Convolution2D) (None, 28, 28, 128) 41088  merge_2[0][0]      
____________________________________________________________________________________________________ 
convolution2d_18 (Convolution2D) (None, 28, 28, 32) 10272  merge_2[0][0]      
____________________________________________________________________________________________________ 
convolution2d_17 (Convolution2D) (None, 14, 14, 256) 295168  convolution2d_16[0][0]   
____________________________________________________________________________________________________ 
convolution2d_19 (Convolution2D) (None, 14, 14, 64) 51264  convolution2d_18[0][0]   
____________________________________________________________________________________________________ 
maxpooling2d_5 (MaxPooling2D) (None, 14, 14, 320) 0   merge_2[0][0]      
____________________________________________________________________________________________________ 
merge_3 (Merge)     (None, 14, 14, 640) 0   convolution2d_17[0][0]   
                    convolution2d_19[0][0]   
                    maxpooling2d_5[0][0]    
____________________________________________________________________________________________________ 
convolution2d_21 (Convolution2D) (None, 14, 14, 96) 61536  merge_3[0][0]      
____________________________________________________________________________________________________ 
convolution2d_23 (Convolution2D) (None, 14, 14, 32) 20512  merge_3[0][0]      
____________________________________________________________________________________________________ 
maxpooling2d_6 (MaxPooling2D) (None, 14, 14, 640) 0   merge_3[0][0]      
____________________________________________________________________________________________________ 
convolution2d_20 (Convolution2D) (None, 14, 14, 256) 164096  merge_3[0][0]      
____________________________________________________________________________________________________ 
convolution2d_22 (Convolution2D) (None, 14, 14, 192) 166080  convolution2d_21[0][0]   
____________________________________________________________________________________________________ 
convolution2d_24 (Convolution2D) (None, 14, 14, 64) 51264  convolution2d_23[0][0]   
____________________________________________________________________________________________________ 
convolution2d_25 (Convolution2D) (None, 14, 14, 128) 82048  maxpooling2d_6[0][0]    
____________________________________________________________________________________________________ 
merge_4 (Merge)     (None, 14, 14, 640) 0   convolution2d_20[0][0]   
                    convolution2d_22[0][0]   
                    convolution2d_24[0][0]   
                    convolution2d_25[0][0]   
____________________________________________________________________________________________________ 
convolution2d_27 (Convolution2D) (None, 14, 14, 112) 71792  merge_4[0][0]      
____________________________________________________________________________________________________ 
convolution2d_29 (Convolution2D) (None, 14, 14, 32) 20512  merge_4[0][0]      
____________________________________________________________________________________________________ 
maxpooling2d_7 (MaxPooling2D) (None, 14, 14, 640) 0   merge_4[0][0]      
____________________________________________________________________________________________________ 
convolution2d_26 (Convolution2D) (None, 14, 14, 224) 143584  merge_4[0][0]      
____________________________________________________________________________________________________ 
convolution2d_28 (Convolution2D) (None, 14, 14, 224) 226016  convolution2d_27[0][0]   
____________________________________________________________________________________________________ 
convolution2d_30 (Convolution2D) (None, 14, 14, 64) 51264  convolution2d_29[0][0]   
____________________________________________________________________________________________________ 
convolution2d_31 (Convolution2D) (None, 14, 14, 128) 82048  maxpooling2d_7[0][0]    
____________________________________________________________________________________________________ 
merge_5 (Merge)     (None, 14, 14, 640) 0   convolution2d_26[0][0]   
                    convolution2d_28[0][0]   
                    convolution2d_30[0][0]   
                    convolution2d_31[0][0]   
____________________________________________________________________________________________________ 
convolution2d_33 (Convolution2D) (None, 14, 14, 128) 82048  merge_5[0][0]      
____________________________________________________________________________________________________ 
convolution2d_35 (Convolution2D) (None, 14, 14, 32) 20512  merge_5[0][0]      
____________________________________________________________________________________________________ 
maxpooling2d_8 (MaxPooling2D) (None, 14, 14, 640) 0   merge_5[0][0]      
____________________________________________________________________________________________________ 
convolution2d_32 (Convolution2D) (None, 14, 14, 192) 123072  merge_5[0][0]      
____________________________________________________________________________________________________ 
convolution2d_34 (Convolution2D) (None, 14, 14, 256) 295168  convolution2d_33[0][0]   
____________________________________________________________________________________________________ 
convolution2d_36 (Convolution2D) (None, 14, 14, 64) 51264  convolution2d_35[0][0]   
____________________________________________________________________________________________________ 
convolution2d_37 (Convolution2D) (None, 14, 14, 128) 82048  maxpooling2d_8[0][0]    
____________________________________________________________________________________________________ 
merge_6 (Merge)     (None, 14, 14, 640) 0   convolution2d_32[0][0]   
                    convolution2d_34[0][0]   
                    convolution2d_36[0][0]   
                    convolution2d_37[0][0]   
____________________________________________________________________________________________________ 
convolution2d_39 (Convolution2D) (None, 14, 14, 144) 92304  merge_6[0][0]      
____________________________________________________________________________________________________ 
convolution2d_41 (Convolution2D) (None, 14, 14, 32) 20512  merge_6[0][0]      
____________________________________________________________________________________________________ 
maxpooling2d_9 (MaxPooling2D) (None, 14, 14, 640) 0   merge_6[0][0]      
____________________________________________________________________________________________________ 
convolution2d_38 (Convolution2D) (None, 14, 14, 160) 102560  merge_6[0][0]      
____________________________________________________________________________________________________ 
convolution2d_40 (Convolution2D) (None, 14, 14, 288) 373536  convolution2d_39[0][0]   
____________________________________________________________________________________________________ 
convolution2d_42 (Convolution2D) (None, 14, 14, 64) 51264  convolution2d_41[0][0]   
____________________________________________________________________________________________________ 
convolution2d_43 (Convolution2D) (None, 14, 14, 128) 82048  maxpooling2d_9[0][0]    
____________________________________________________________________________________________________ 
merge_7 (Merge)     (None, 14, 14, 640) 0   convolution2d_38[0][0]   
                    convolution2d_40[0][0]   
                    convolution2d_42[0][0]   
                    convolution2d_43[0][0]   
____________________________________________________________________________________________________ 
convolution2d_44 (Convolution2D) (None, 14, 14, 160) 102560  merge_7[0][0]      
____________________________________________________________________________________________________ 
convolution2d_46 (Convolution2D) (None, 14, 14, 64) 41024  merge_7[0][0]      
____________________________________________________________________________________________________ 
convolution2d_45 (Convolution2D) (None, 7, 7, 256)  368896  convolution2d_44[0][0]   
____________________________________________________________________________________________________ 
convolution2d_47 (Convolution2D) (None, 7, 7, 128)  204928  convolution2d_46[0][0]   
____________________________________________________________________________________________________ 
maxpooling2d_10 (MaxPooling2D) (None, 7, 7, 640)  0   merge_7[0][0]      
____________________________________________________________________________________________________ 
merge_8 (Merge)     (None, 7, 7, 1024) 0   convolution2d_45[0][0]   
                    convolution2d_47[0][0]   
                    maxpooling2d_10[0][0]    
____________________________________________________________________________________________________ 
convolution2d_49 (Convolution2D) (None, 7, 7, 192)  196800  merge_8[0][0]      
____________________________________________________________________________________________________ 
convolution2d_51 (Convolution2D) (None, 7, 7, 48)  49200  merge_8[0][0]      
____________________________________________________________________________________________________ 
maxpooling2d_11 (MaxPooling2D) (None, 7, 7, 1024) 0   merge_8[0][0]      
____________________________________________________________________________________________________ 
convolution2d_48 (Convolution2D) (None, 7, 7, 384)  393600  merge_8[0][0]      
____________________________________________________________________________________________________ 
convolution2d_50 (Convolution2D) (None, 7, 7, 384)  663936  convolution2d_49[0][0]   
____________________________________________________________________________________________________ 
convolution2d_52 (Convolution2D) (None, 7, 7, 128)  153728  convolution2d_51[0][0]   
____________________________________________________________________________________________________ 
convolution2d_53 (Convolution2D) (None, 7, 7, 128)  131200  maxpooling2d_11[0][0]    
____________________________________________________________________________________________________ 
merge_9 (Merge)     (None, 7, 7, 1024) 0   convolution2d_48[0][0]   
                    convolution2d_50[0][0]   
                    convolution2d_52[0][0]   
                    convolution2d_53[0][0]   
____________________________________________________________________________________________________ 
convolution2d_55 (Convolution2D) (None, 7, 7, 192)  196800  merge_9[0][0]      
____________________________________________________________________________________________________ 
convolution2d_57 (Convolution2D) (None, 7, 7, 48)  49200  merge_9[0][0]      
____________________________________________________________________________________________________ 
maxpooling2d_12 (MaxPooling2D) (None, 7, 7, 1024) 0   merge_9[0][0]      
____________________________________________________________________________________________________ 
convolution2d_54 (Convolution2D) (None, 7, 7, 384)  393600  merge_9[0][0]      
____________________________________________________________________________________________________ 
convolution2d_56 (Convolution2D) (None, 7, 7, 384)  663936  convolution2d_55[0][0]   
____________________________________________________________________________________________________ 
convolution2d_58 (Convolution2D) (None, 7, 7, 128)  153728  convolution2d_57[0][0]   
____________________________________________________________________________________________________ 
convolution2d_59 (Convolution2D) (None, 7, 7, 128)  131200  maxpooling2d_12[0][0]    
____________________________________________________________________________________________________ 
merge_10 (Merge)     (None, 7, 7, 1024) 0   convolution2d_54[0][0]   
                    convolution2d_56[0][0]   
                    convolution2d_58[0][0]   
                    convolution2d_59[0][0]   
____________________________________________________________________________________________________ 
averagepooling2d_1 (AveragePoolin(None, 1, 1, 1024) 0   merge_10[0][0]     
____________________________________________________________________________________________________ 
flatten_1 (Flatten)    (None, 1024)   0   averagepooling2d_1[0][0]   
____________________________________________________________________________________________________ 
dense_1 (Dense)     (None, 128)   131200  flatten_1[0][0]     
____________________________________________________________________________________________________ 
lambda_1 (Lambda)    (None, 128)   0   dense_1[0][0]      
==================================================================================================== 
Total params: 7456944 
____________________________________________________________________________________________________ 
None 
+0

tốc độ học tập của bạn là gì? Có lẽ nó quá lớn. – weitang114

+0

Tôi nghĩ về điều đó vì vậy tôi đã cố gắng rất thấp tỷ lệ học tập liek 1e-10 mà mô hình chỉ nên thay đổi trọng lượng bằng một số lượng rất nhỏ và nó vẫn học để sản xuất cùng một đầu ra cho mỗi hình ảnh trong lô trong một lần lặp rất kỳ quặc. – DalekSupreme

+1

Trong mã của bạn, "embeddings [0] - embeddings [1]", có phải là "embeddings [:, 0] - embeddings [:, 1]" không? – weitang114

Trả lời

3

Bạn đang kìm hãm embeddings của bạn để "được trên một d-chiều hypersphere"? Hãy thử chạy tf.nn.l2_normalize trên các tệp nhúng của bạn ngay sau khi chúng ra khỏi CNN.

Vấn đề có thể là các tệp nhúng là loại thông minh. Một cách dễ dàng để giảm tổn thất là chỉ cần đặt mọi thứ về 0. l2_normalize buộc chúng phải là đơn vị chiều dài.

Có vẻ như bạn sẽ muốn thêm bình thường hóa ngay sau hồ bơi trung bình cuối cùng.

+1

Cảm ơn ý tưởng. Thật không may là Lambda_1 lớp Lambda cuối cùng đã làm điều đó. Nó bình thường hóa việc nhúng như nó đã được đề xuất trong nghiên cứu net mặt. Tại sao tôi nên đặt bình thường hóa sau hồ bơi trung bình chứ không phải lớp dày đặc? – DalekSupreme

+1

Ồ, hmm. Tôi không chắc về điều đó. Đó chỉ là nơi tôi đã làm (đối với mạng Xiêm, một ý tưởng tương tự). –

0

Tôi đã gặp vấn đề tương tự và tôi đã thực hiện một số công việc nghiên cứu. Tôi nghĩ rằng đó là vì mất ba phần tử cần nhiều đầu vào, điều này có thể làm cho mạng tạo ra các kết quả đầu ra như thế. Tôi chưa khắc phục được sự cố, nhưng bạn có thể kiểm tra trang vấn đề của keras để biết thêm chi tiết https://github.com/keras-team/keras/issues/9498.

Trong trang vấn đề, tôi thực hiện một tập dữ liệu giả mạo và mất bộ ba giả để repreduce vấn đề, sau khi tôi thay đổi cơ cấu đầu vào của mạng, sự mất mát trở nên bình thường

Các vấn đề liên quan