Python 如何使用Keras获得k层后的激活?

Python 如何使用Keras获得k层后的激活?,python,tensorflow,keras,neural-network,Python,Tensorflow,Keras,Neural Network,注意:我已经读过了,但是没有帮助 我正在使用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.resh

注意:我已经读过了,但是没有帮助

我正在使用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的向量要在完成需要使用的模型的训练后运行该模型。这将根据您的输入数据评估图形。请注意,输入数据的尺寸必须与指定的模型输入的尺寸相同,在您的情况下,该尺寸看起来是
[None,784]
。Keras不要求您指定批处理维度,但仍然需要一个2D数组。做点像

x = x_test[5]
x = x[numpy.newaxis,:]
out_val = model.predict(x)[0]
OutFunc = K.function([model.input], [model.layers[2].output])
out_val = OutFunc([x])[0]
如果您只想处理单个值

需要使用
numpy.newaxis
创建2D数组,从而匹配输入大小。如果传入一个值数组以同时计算所有值,则可以跳过此操作

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

x = x_test[5]
x = x[numpy.newaxis,:]
out_val = model.predict(x)[0]
OutFunc = K.function([model.input], [model.layers[2].output])
out_val = OutFunc([x])[0]

同样,请记住输入上有一个批次维度,它将在输出中生成。如果您需要一些额外的示例,那么有很多关于从中间层获取数据的文章。例如,请参阅除公认答案之外的另一种方法:当
x
只是
(784,)
(784,1)
numpy数组时,我们可以使用以下方法:

model.predict([[x]]) 

使用double
[[…]]

谢谢@bivouac0,但即使使用
model.predict([x])
,它也不起作用(
ValueError:检查输入时出错:预期密集输入具有形状(784),但获得具有形状(1,)的数组
)。这里我的
x
是一个形状的numpy数组
(784,1)
,所以它不是
[None,784]
。我在@bivouac0找到了答案:当x只是一个(784,1)numpy数组时,我们应该使用这个:
模型。用双
[…]预测([[x]])
。关键是你必须用网络输入的正确形状的数据来预测。在数据变量周围添加一个括号,只需在数据中添加一个大小为1的维度。根据上面的代码,我不希望您需要二维。在输入之前,
x
的维度是多少?它应该是shape=(784),因为它是图像,对吗?
打印(x.shape)
(784,)
。使用
predict([x])
它不起作用。事实上,
x=x_测试[0]
,x_测试是通过
x_测试=x_测试来定义的。重塑(10000784)。astype('float32')/255.0
。你觉得怎么样?很有趣。显然,在某些时候,他们增加了支持多个输入模型的功能,现在您需要输入
predict
输入数据列表。文档并没有很好地说明这一点,但看看他们的代码,他们肯定是在数据上迭代,因此需要额外的一对括号。只是小心使用双括号技巧,因为它不适用于旧的Keras版本,我不会惊讶于在未来的版本中看到它的变化。
numpy.newaxis
方法可能更稳定。