如何输出网络的第二层?

Posted

技术标签:

【中文标题】如何输出网络的第二层?【英文标题】:How to output the second layer of a network? 【发布时间】:2020-06-07 02:24:35 【问题描述】:

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

在阅读了很多例子之后——例如this、and this、or this。

我没有设法在我自己的网络上做到这一点。这两种解决方案都不适用于我自己的算法。

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

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

我错过了什么?第二层如何输出? 如果我的 Shape 是 (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: 错误 从 Container 中读取资源变量 dense_1/bias 时: 本地主机。这可能意味着该变量未初始化。不是 发现:容器 localhost 不存在。 (找不到资源: localhost/dense_1/bias) [[node dense_1/BiasAdd/ReadVariableOp]]

【问题讨论】:

您问题中的链接已损坏,请添加它们以了解您的尝试 @ThéoRubenach 完成 【参考方案1】:

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

尽量不要将旧 keras 与 tensorflow>=2.0 一起使用(也不要像第一个链接中那样引用旧文档),因为它很容易与新文档混淆(尽管严格来说没有不合逻辑):

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'

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

完成此操作后,使用您尝试过的an answer,m 是您的模型,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”是什么意思?该变量的值应该是多少? 模型输入的形状,在定义模型时,您甚至可以在自己的代码中使用它:input_shape=(28, 28) 这里我使用随机数据,但在你的情况下,你当然应该用你自己的数据替换my_input_data 你自己的数据是什么意思?内部的值应该是什么 - 训练数据?测试数据?它应该只是 1 个对象(图像)还是对象(图像)的列表/数组/元组?我尝试了许多不同的组合,但都没有奏效。当我按照你提到的设置'input_shape'时,我收到错误''AttributeError:'tuple'对象没有属性'shape'' 我相应地更新了我的答案。您要使用的图像取决于您的用例,它与代码无关。如果您仍然感到困惑,也许可以在另一个 stackexchange 网站上问一个新问题?【参考方案2】:

(假设 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 就是你要找的东西

替代方法

如果您正在寻找更通用的解决方案,假设您的模型是顺序的,您可以像这样使用get_layerindex 关键字

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 = ... # 应该像网络的标准输入'是什么意思?该变量的值应该是多少? 任何标准输入,如顺序模型所期望的 - 如果您的输入是 28x28,您应该为单个示例传递 1x28x28 数组 编辑了我的回答 如何打印“output_of_hidden”中的值?当前结果是 'output_of_hidden Tensor("hidden_​​1/Relu:0", shape=(1, 128), dtype=float32)'。我尝试使用 session&eval 但收到错误。 如果在TF2中,你通常应该调用output_of_hidden.numpy(),它会转换成numpy数组

以上是关于如何输出网络的第二层?的主要内容,如果未能解决你的问题,请参考以下文章

二层STP的原理

一文说透以太坊上TVL最大的二层网络:Arbitrum

Linux的第五周作业

二层交换机与三层交换机区别详解

马哥Linux网络班作业

科普 | 区块链的扩容方案和主要的二层网络方案