2017-04-17 30 views
6

Tôi đang cố gắng để có được đầu ra của một lớp trung gian trong Keras, Sau đây là mã của tôi:Lấy đầu ra của một lớp trung gian trong TensorFlow/Keras

XX = model.input # Keras Sequential() model object 
YY = model.layers[0].output 
F = K.function([XX], [YY]) # K refers to keras.backend 


Xaug = X_train[:9] 
Xresult = F([Xaug.astype('float32')]) 

Chạy này, tôi có một Lỗi:

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'dropout_1/keras_learning_phase' with dtype bool 

tôi đã biết rằng vì tôi đang sử dụng lớp bỏ học trong mô hình của mình, tôi phải chỉ định cờ learning_phase() cho chức năng của mình theo keras documentation. tôi đã thay đổi mã của tôi như sau:

XX = model.input 
YY = model.layers[0].output 
F = K.function([XX, K.learning_phase()], [YY]) 


Xaug = X_train[:9] 
Xresult = F([Xaug.astype('float32'), 0]) 

Bây giờ tôi nhận được một lỗi mới mà tôi không thể hình dung ra:

TypeError: Cannot interpret feed_dict key as Tensor: Can not convert a int into a Tensor. 

Bất kỳ trợ giúp sẽ được đánh giá cao.
PS: Tôi mới sử dụng TensorFlow và Keras.

Chỉnh sửa 1: Sau đây là mã hoàn chỉnh mà tôi đang sử dụng. Tôi đang sử dụng không gian Transformer Mạng như đã thảo luận trong này NIPS paper và nó thực hiện Kera của here

input_shape = X_train.shape[1:] 

# initial weights 
b = np.zeros((2, 3), dtype='float32') 
b[0, 0] = 1 
b[1, 1] = 1 
W = np.zeros((100, 6), dtype='float32') 
weights = [W, b.flatten()] 

locnet = Sequential() 
locnet.add(Convolution2D(64, (3, 3), input_shape=input_shape, padding='same')) 
locnet.add(Activation('relu')) 
locnet.add(Convolution2D(64, (3, 3), padding='same')) 
locnet.add(Activation('relu')) 
locnet.add(MaxPooling2D(pool_size=(2, 2))) 
locnet.add(Convolution2D(128, (3, 3), padding='same')) 
locnet.add(Activation('relu')) 
locnet.add(Convolution2D(128, (3, 3), padding='same')) 
locnet.add(Activation('relu')) 
locnet.add(MaxPooling2D(pool_size=(2, 2))) 
locnet.add(Convolution2D(256, (3, 3), padding='same')) 
locnet.add(Activation('relu')) 
locnet.add(Convolution2D(256, (3, 3), padding='same')) 
locnet.add(Activation('relu')) 
locnet.add(MaxPooling2D(pool_size=(2, 2))) 
locnet.add(Dropout(0.5)) 
locnet.add(Flatten()) 
locnet.add(Dense(100)) 
locnet.add(Activation('relu')) 
locnet.add(Dense(6, weights=weights)) 


model = Sequential() 

model.add(SpatialTransformer(localization_net=locnet, 
          output_size=(128, 128), input_shape=input_shape)) 

model.add(Convolution2D(64, (3, 3), padding='same')) 
model.add(Activation('relu')) 
model.add(Convolution2D(64, (3, 3), padding='same')) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Convolution2D(128, (3, 3), padding='same')) 
model.add(Activation('relu')) 
model.add(Convolution2D(128, (3, 3), padding='same')) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Convolution2D(256, (3, 3), padding='same')) 
model.add(Activation('relu')) 
model.add(Convolution2D(256, (3, 3), padding='same')) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Convolution2D(256, (3, 3), padding='same')) 
model.add(Activation('relu')) 
model.add(Convolution2D(256, (3, 3), padding='same')) 
model.add(Activation('relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Dropout(0.5)) 
model.add(Flatten()) 
model.add(Dense(256)) 
model.add(Activation('relu')) 

model.add(Dense(num_classes)) 
model.add(Activation('softmax')) 

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

#============================================================================== 
# Start Training 
#============================================================================== 
#define training results logger callback 
csv_logger = keras.callbacks.CSVLogger(training_logs_path+'.csv') 
model.fit(X_train, y_train, 
      batch_size=batch_size, 
      epochs=20, 
      validation_data=(X_valid, y_valid), 
      shuffle=True, 
      callbacks=[SaveModelCallback(), csv_logger]) 




#============================================================================== 
# Visualize what Transformer layer has learned 
#============================================================================== 

XX = model.input 
YY = model.layers[0].output 
F = K.function([XX, K.learning_phase()], [YY]) 


Xaug = X_train[:9] 
Xresult = F([Xaug.astype('float32'), 0]) 

# input 
for i in range(9): 
    plt.subplot(3, 3, i+1) 
    plt.imshow(np.squeeze(Xaug[i])) 
    plt.axis('off') 

for i in range(9): 
    plt.subplot(3, 3, i + 1) 
    plt.imshow(np.squeeze(Xresult[0][i])) 
    plt.axis('off') 
+0

điều này sẽ hoạt động. 1) bạn có thể cho chúng tôi thấy mô hình của bạn? 2) bạn có thể thử một lớp khác trong mô hình. 3) nếu nó không quá nhiều rắc rối, bạn có thể thử xây dựng mô hình bằng cách sử dụng một phong cách chức năng ?; – putonspectacles

+0

@putonspectacles Tôi cũng đã thêm kiến ​​trúc mô hình của mình. – Ahmed

Trả lời

1

Cách đơn giản nhất là để tạo ra một mô hình mới trong Keras, mà không gọi backend. Bạn sẽ cần API mô hình chức năng cho điều này:

from keras.models import Model 

XX = model.input 
YY = model.layers[0].output 
new_model = Model(XX, YY) 

Xaug = X_train[:9] 
Xresult = new_model.predict(Xaug) 
Các vấn đề liên quan