【问题标题】:How to print out the tensor values of a specific layer如何打印出特定层的张量值
【发布时间】:2021-05-06 07:18:16
【问题描述】:

我希望在应用mask 后检查张量的值。

这是模型的截断部分。我让temp = x 所以稍后我想打印temp 来检查确切的值。

因此,给定一个使用声学特征的 4 类分类模型。假设我在 (1000,50,136) 中有数据作为(批次、时间步长、特征)

目标是检查模型是否按时间步长研究特征。换句话说,我们希望确保模型正在学习使用切片作为图片中的红色矩形。从逻辑上讲,这是Keras LSTM 层的方式,但是当参数更改(例如密集单位)时,产生的confusion matrix 完全不同。验证准确率保持在 45%,因此我们希望将模型可视化。

提出的思路是打印出第一批的第一步,打印出模型中的输入。如果它们相同,则模型以正确的方式学习((136,1) 个特征一次),而不是单个特征的 (50,1) 个时间步长一次。

input_feature = Input(shape=(X_train.shape[1],X_train.shape[2]))
x = Masking(mask_value=0)(input_feature)
temp = x
x = Dense(Dense_unit,kernel_regularizer=l2(dense_reg), activation='relu')(x)
        

我尝试过tf.print(),它给我带来了AttributeError: 'Tensor' object has no attribute '_datatype_enum'


正如 Lescurel 建议的 Get output from a non final keras model layer

model2 = Model(inputs=[input_attention, input_feature], outputs=model.get_layer('masking')).output
print(model2.predict(X_test))

AttributeError: 'Masking' object has no attribute 'op'

【问题讨论】:

  • 这能回答你的问题吗? Get output from a non final keras model layer
  • @Lescurel 谢谢,我尝试了该方法,但弹出了一个 AttributeError 。
  • 你有一个错字,应该是model2 = Model(inputs=[input_attention, input_feature], outputs=model.get_layer('masking').output)
  • 根据您的代码,我猜您想向密集层传递一个带有已删除掩码值的输入。这是不可能的,原因有二。首先,密集层必须具有固定的输入大小。其次,遮罩层不会以任何方式改变输入,它只会附加相应的遮罩(参见tensorflow.org/guide/keras/masking_and_padding#masking)。请同时指定您的全球目标。

标签: python tensorflow machine-learning


【解决方案1】:

你想在掩码之后输出。 lescurel 在评论中的link 显示了如何做到这一点。 这个link to github也是。

你需要制作一个新模型

  • 将模型的输入作为输入
  • 将层的输出作为输出

我使用从你的 sn-ps 派生的一些虚构代码对其进行了测试。

import numpy as np
from keras import Input
from keras.layers import Masking, Dense
from keras.regularizers import l2
from keras.models import Sequential, Model
X_train = np.random.rand(4,3,2)
Dense_unit = 1
dense_reg = 0.01
mdl = Sequential()
mdl.add(Input(shape=(X_train.shape[1],X_train.shape[2]),name='input_feature'))
mdl.add(Masking(mask_value=0,name='masking'))
mdl.add(Dense(Dense_unit,kernel_regularizer=l2(dense_reg),activation='relu',name='output_feature'))
mdl.summary()
mdl2mask = Model(inputs=mdl.input,outputs=mdl.get_layer("masking").output)
maskoutput = mdl2mask.predict(X_train)
mdloutput = mdl.predict(X_train)
maskoutput # print output after/of masking
mdloutput # print output of mdl
maskoutput.shape #(4, 3, 2): masking has the shape of the layer before (input here)
mdloutput.shape #(4, 3, 1): shape of the output of dense

【讨论】:

  • 掩码不会以任何方式更改输入张量,它只会创建关联的掩码。在tensorflow.org/guide/keras/masking_and_padding#masking 的示例中,如果您在“掩码生成层:嵌入和掩码部分”中调用 print(masked_embedding) 而不是 print(masked_embedding._keras_mask),您将获得初始张量。此外,密集层不使用掩码。可以做的是检查掩码(通过._keras_mask),而不是tenosr。我错过了什么吗?如果不是,则问题不完整或不正确。
  • Masking class 与所有层一样具有call()。该层的output_shapecompute_output_shape() 提供。 Embedding 不是Masking 层的唯一可能用途。问题不完整。
  • 谢谢你们,我已经更新了问题,所以我的目标现在更明确了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-16
  • 2023-01-11
  • 2017-09-12
  • 1970-01-01
  • 2018-06-26
  • 1970-01-01
相关资源
最近更新 更多