2016-07-26 25 views
5

Vì vậy, tôi đang cố gắng triển khai this giấy về mạng thần kinh Xiêm: Tìm hiểu một số liệu tương tự một cách phân biệt, với ứng dụng đối mặt với xác minh, bởi Sumit Chopra, Raia Hadsell và Yann LeCun (2005) . Tôi đang sử dụng các CIFAR10 dataset thay vào đó, mặc dù, với 10 lớp học.Thực hiện một Xiêm NN trong Keras

Thông số kỹ thuật của một trong hai chân được sao chép để thuận tiện. Ký hiệu: C_x là một lớp convolution, S_x là một lớp lớp con và F_x là một lớp được kết nối hoàn toàn; với một chỉ số chung x:

  1. C1: bản đồ tính năng: 15, kernel size = (7, 7)
  2. S2: Tính năng bản đồ: 15, lĩnh vực-of-view = (2, 2)
  3. C3: bản đồ tính năng: 45, kích thước hạt nhân = (6, 6)
  4. S4: bản đồ tính năng: 45, trường xem = (4, 3)
  5. C5: bản đồ tính năng: 250, kích thước hạt nhân = (5, 5)
  6. F6 (lớp được kết nối hoàn toàn): không. các đơn vị = 50

Những gì tôi đã cố gắng

model = Sequential() 

#C1 
model.add(Convolution2D(15, 7, 7, 
activation='relu', 
border_mode='same', 
input_shape=input_img_shape)) 
print("C1 shape: ", model.output_shape) 

#S2 
model.add(MaxPooling2D((2,2), border_mode='same')) 
print("S2 shape: ", model.output_shape) 
#... 

#C5 
model.add(Convolution2D(250, 5, 5, 
activation='relu', 
border_mode='same')) 
print("C5 shape: ", model.output_shape) 

#F6 
model.add(Dense(50)) 

này ném một thông báo lỗi dài, mà tôi tin là một lỗi Reshape. Một đoạn trích của lỗi:

Exception: Input 0 is incompatible with layer dense_13: expected 
ndim=2, found ndim=4 

Tôi biết rằng vấn đề được phân lập trong lớp dày đặc cuối cùng đó, vì mã này tiến hành suôn sẻ nếu tôi nhận xét. Nhưng tôi không chắc chắn chính xác làm thế nào tôi nên sau đó hình/xác định cuối cùng của tôi hoàn toàn kết nối lớp để nó tương thích với các lớp convolution trước?

Một số Nơi tôi đã Nhìn

This là một vấn đề có liên quan, mặc dù việc thực hiện là hơi khác nhau (có vẻ như không có một lớp lõi 'Xiêm' trong keras tại thời điểm viết bài này). Tôi biết rằng cũng có implementations in Theano, mà tôi sẽ nhớ nếu tôi không thể làm điều đó trong keras.

Cảm ơn!

Trả lời

3

Như đã đề cập bởi Matias Valdenegro, Keras đã có ví dụ về Siamese network. Ví dụ này chỉ sử dụng các lớp dày đặc.

Vấn đề của bạn là bạn cần phải thêm một lớp Flatten giữa các lớp chập và các lớp dày đặc để có hình dạng chính xác, xem this Keras CNN example

Những 2 ví dụ sẽ giúp bạn xây dựng mạng lưới Xiêm của bạn.

+0

Về mặt khái niệm, tôi có thể hỏi tại sao bạn cần một lớp "phẳng" không? Điều này là mới đối với tôi bởi vì tôi đã không nhìn thấy nó được đề cập trong bài báo. Cảm ơn! – AndreyIto

+1

@AndreyIđây là chi tiết thực hiện hơn: Trong Keras, đầu ra của lớp 'Convolution2D' có 4 kích thước [(xem nguồn)] (https://github.com/fchollet/keras/blob/master/keras/layers /convolutional.py#L248) trong khi đầu vào của lớp 'Dense' phải có kích thước 2 [(xem nguồn)] (https://github.com/fchollet/keras/blob/master/keras/layers/core.py # L567). Vì vậy, bạn cần phải san bằng dữ liệu của bạn với lớp 'Flatten' trước khi chuyển nó qua lớp 'Dense'. – sytrus

1

Bạn không cần lớp Xiêm, bạn chỉ cần sử dụng Keras functional API để tạo mô hình có hai đầu vào và một đầu ra.

Dường như ví dụ của Keras already contain mô hình rất giống với mô hình bạn đang triển khai.

+0

Cảm ơn bạn đã nhập!Yup, tôi đã đi qua ví dụ này, và nó đã giúp tôi kết hợp cấu trúc chung, nhưng nó không giải quyết được vấn đề cụ thể về quản lý hình dạng giữa các lớp. Nhưng dù gì cũng cảm ơn! – AndreyIto

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