注意:我已经读过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的向量
答案 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]])
带有双[[...]]
。