如何输出网络的第二层?


9

我的模型训练有数字图像(MNIST dataset)。我正在尝试打印网络第二层的输出-128个数字的数组。

在阅读了很多示例之后-例如thisthisthis

我没有在自己的网络上执行此操作。我自己的算法都无法使用这两种解决方案。

链接到Colab:https ://colab.research.google.com/drive/1MLbpWJmq8JZB4_zKongaHP2o3M1FpvAv ? fbclid = IwAR20xRz2i6sFS-Nm6Xwfk5hztdXOuxY4tZaDRXxAx3b986Toa9

我收到了很多不同的错误消息。我试图处理它们中的每一个,但我自己无法解决。

我想念什么?如何输出第二层? 如果我的形状是(28,28)-的类型和值应该是什么input_shape


试用失败和错误,例如:

(1)

for layer in model.layers:

    get_2nd_layer_output = K.function([model.layers[0].input],[model.layers[2].output])
    layer_output = get_2nd_layer_output(layer)[0]
    print('\nlayer output: get_2nd_layer_output=, layer=', layer, '\nlayer output: get_2nd_layer_output=', get_2nd_layer_output)

TypeError:输入应为列表或元组。

(2)

input_shape=(28, 28)
inp = model.input                                           # input placeholder
outputs = [layer.output for layer in model.layers]          # all layer outputs
functor = K.function([inp, K.learning_phase()], outputs )   # evaluation function

# Testing
test = np.random.random(input_shape)[np.newaxis,...]
layer_outs = functor([test, 0.])
print('layer_outs',layer_outs)

tensorflow.python.framework.errors_impl.FailedPreconditionError:从容器:本地主机读取资源变量density_1 / bias时出错。这可能意味着该变量未初始化。找不到:容器lo​​calhost不存在。(找不到资源:localhost / dense_1 / bias)[[{{node density_1 / BiasAdd / ReadVariableOp}}]]]


1
在你的问题链路断开,请加他们有一个你尝试过什么样的想法
西奥Rubenach

@ThéoRubenach完成
Shir K

Answers:


3

看起来您正在混合旧的keras(在tensorflow 2.0:之前import keras)和新的keras(from tensorflow import keras)。

尽量不要在tensorflow> = 2.0旁边使用旧的keras(并且不要像第一个链接中那样参考旧的文档),因为它很容易与新的keras混淆(尽管严格地说是不合逻辑的):

from tensorflow import keras
from keras.models import Model
print(Model.__module__) #outputs 'keras.engine.training'

from tensorflow.keras.models import Model
print(Model.__module__) #outputs 'tensorflow.python.keras.engine.training'

混合这两个库的行为将非常不稳定。

完成此操作后,使用您尝试的答案,即为模型,并my_input_shape为模型的形状输入,即一张图片的形状(此处为(28,28)或(1,28,28)(如果有)批次):

from tensorflow import keras as K
my_input_data = np.random.rand(*my_input_shape) 
new_temp_model = K.Model(m.input, m.layers[3].output) #replace 3 with index of desired layer
output_of_3rd_layer = new_temp_model.predict(my_input_data) #this is what you want

如果您只有一张图片img,可以直接写new_temp_model.predict(img)


Rubenach“ my_input_shape”是什么意思?该var的值应该是多少?
Shir K

1
:好你的模型输入的形状,您在定义模型时甚至有它自己的代码input_shape=(28, 28)
西奥Rubenach

1
这里我用随机数据,但在你的情况下,你应该更换my_input_data你自己的,当然数据
西奥Rubenach

“您自己的数据”是什么意思?内部数据应该是什么-训练数据?测试数据?应该只是一个对象(图像)还是对象(图像)的列表/数组/元组?我尝试了许多不同的组合,但没有一个奏效。当我按照您提到的那样设置“ input_shape”时,收到错误“ AttributeError:'tuple'对象没有属性'shape”
Shir K,

1
我相应地更新了我的答案。您要使用的图像取决于您的用例,它与代码无关。如果您仍然感到困惑,也许在另一个stackexchange网站上问一个新问题?
西奥Rubenach

3

(假设TF2)

我认为最直接的方法是命名图层,然后使用标准输入进行调用,因此您的模型可能看起来像

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28), name='flatten'),
    keras.layers.Dense(128, activation='relu', name='hidden'),
    keras.layers.Dense(10, activation='softmax')
])

然后只需创建一个输入并

my_input = tf.random.normal((1, 28, 28)) # Should be like the standard input to your network
output_of_flatten = model.get_layer('flatten')(my_input)
output_of_hidden = model.get_layer('hidden')(output_of_flatten)

output_of_hidden 是您要寻找的

替代方法

如果你正在寻找一个更通用的解决方案,假设你的模型是连续的,你可以使用index的关键字get_layer这样

my_input = tf.random.normal((1, 28, 28)) # Should be like the standard input to your network
desired_index = 1  # 1 == second layer

for i in range(desired_index):
    my_input = model.get_layer(index=i)(my_input)

在此循环的结尾my_input应该是您要寻找的


“ my_input = ...#应该是您网络的标准输入”是什么意思?该var的值应该是多少?
Shir K

1
任何标准输入,如顺序模型期望的那样-如果输入为28x28,则应为单个示例传递1x28x28数组
bluesummers

1
编辑了我的答复
bluesummers

如何打印“ output_of_hidden”中的值?当前结果是“ output_of_hidden Tensor(“ hidden_​​1 / Relu:0”,shape =(1,128),dtype = float32)”。我尝试使用session&eval,但是收到错误消息。
Shir K

1
如果在TF2中,通常应该调用output_of_hidden.numpy()并将其转换为numpy数组
bluesummers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.