如何在Keras的k层之后获得激活?

时间:2018-11-16 23:55:30

标签: python tensorflow keras neural-network

注意:我已经读过keras forward pass with tensorflow variable as input,但没有帮助。

我正在用MNIST数据库使用Keras训练自动编码器无监督神经网络:

import keras, cv2
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(60000, 784).astype('float32') / 255.0
x_test = x_test.reshape(10000, 784).astype('float32') / 255.0

model = Sequential()
model.add(Dense(100, activation='sigmoid', input_shape=(784,)))
model.add(Dense(10, activation='sigmoid'))
model.add(Dense(100, activation='sigmoid'))
model.add(Dense(784, activation='sigmoid'))
model.compile(loss='mean_squared_error', optimizer='sgd')
history = model.fit(x_train, x_train, batch_size=1, epochs=1, verbose=0)

然后,当输入向量为x_test[i]时,我想获取输出向量

for i in range(100):
    x = x_test[i]
    a = model(x)
    cv2.imshow('img', a.reshape(28,28))
    cv2.waitKey(0)

但我收到此错误:

  

该层的所有输入均应为张量。

我应该如何修改此代码以对神经网络中的输入向量进行正向传递,并获得一个向量作为回报?

还如何在第二层之后获得激活 ,即不传播到最后一层,而是在第二层之后获得输出。
示例:输入:大小为784的向量,输出:大小为10的向量

2 个答案:

答案 0 :(得分:2)

要在训练完成后运行模型,您需要使用keras predict()。给定您的输入数据,这将评估图形。请注意,输入数据的尺寸必须与指定模型输入的尺寸相同,在您的情况下,输入看起来是[None, 784]。 Keras不需要您指定批处理尺寸,但仍然需要输入2D数组。执行类似操作。

x = x_test[5]
x = x[numpy.newaxis,:]
out_val = model.predict(x)[0]

如果您只想处理一个值。

numpy.newaxis是制作2D数组并因此与您的输入大小匹配所必需的。如果您传入一个值数组以一次求值,则可以跳过此步骤。

使用Keras / Tensorflow,您的模型是图形/函数,而不是标准的python过程代码。您不能直接使用数据调用它。您需要创建函数,然后调用这些函数。要从中间层获取输出,您可以执行以下操作。

OutFunc = K.function([model.input], [model.layers[2].output])
out_val = OutFunc([x])[0]
再次

请记住,输入中将存在批次尺寸,该尺寸将在输出中产生。如果您需要一些其他示例,则有很多文章涉及从中间层获取数据。例如,请参见Keras, How to get the output of each layer?

答案 1 :(得分:0)

除了接受的答案之外,还有另一种方法:当x只是一个(784,)(784,1)的numpy数组时,我们可以使用此方法:

model.predict([[x]]) 

带有双[[...]]

相关问题