我试图在keras中提取特征(使用tensorflow以及theano背景)。但变得不成功。
我的代码是:
model = Sequential()
model.add(Convolution2D(64, 5, 5, input_shape=(3,img_width, img_height)))
model.add(LeakyReLU(alpha=.01))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Convolution2D(64, 2, 2))
model.add(LeakyReLU(alpha=.01))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.1))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dense(8))
model.add(ActivityRegularization(l2=0.01))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(1))
model.add(Activation('sigmoid'))
test_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory(
test_data_dir,
target_size=(img_width, img_height),
batch_size=16,
class_mode='binary')
scores = model.evaluate_generator(test_generator, 237)
print("Accuracy = ", scores[1])
我已经将fit_generator用于训练,验证和测试用例。
我从第3层获取输出的代码是:
get_activations = theano.function([model.layers[0].input],
model.layers[3].output(train=False), allow_input_downcast=True)
activations = get_activations(test_generator)
但在排除它之后我收到了一个错误:
File "test.py", line 96, in <module>
get_activations = theano.function([model.layers[0].input],
model.layers[3].output(train=False), allow_input_downcast=True)
TypeError: 'TensorVariable' object is not callable
如何在theano或tensorflow模式(其中任何一个或两者)中执行此操作。我在我的代码中使用了fit_generator进行图像增强。
请帮忙。
答案 0 :(得分:1)
首先,我建议您切换到Keras-2.x以获得更好的体验。 Keras-2.x更有条理。
其次,建议不要使用theano.function
之类的代码,而应使用keras.backend.function
代替。
引发错误是因为model.layers[3].output
是张量,你不能像model.layers[3].output(train=False)
那样调用张量。
我提取功能的代码通常如下:
model = Sequential()
model.add(Convolution2D(64, 5, 5, input_shape=(3,img_width, img_height)))
model.add(Convolution2D(64, 2, 2))
# blablabla...
model.add(Dense(8, name='feature'))
model.add(Dropout(0.25))
model.add(Dense(1))
model.add(Activation('sigmoid'))
feature_network = Model(model.input, model.get_layer('feature').output)
feature = feature_network.predict(your_data_here)
我使用feature
命名目标要素图层,并使用get_layer
函数检索该图层。