Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Keras中的损失计算过程中检查掩蔽是否正确处理?_Python_Tensorflow_Keras_Neural Network_Padding - Fatal编程技术网

Python 如何在Keras中的损失计算过程中检查掩蔽是否正确处理?

Python 如何在Keras中的损失计算过程中检查掩蔽是否正确处理?,python,tensorflow,keras,neural-network,padding,Python,Tensorflow,Keras,Neural Network,Padding,我的输入数据具有形状(批处理、最大值、嵌入尺寸),并且必须在批处理产生到网络之前进行嵌入和填充。下面是一个2令牌长输入的示例,输入中填充了零填充向量,最大值为maxlen=4: x=np.连接((np.一((1,2,10)),np.零((1,2,10)),轴=1) >>>x 数组([[1,1,1,1,1,1,1,1,1,1,1,1,1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0.,

我的输入数据具有形状
(批处理、最大值、嵌入尺寸)
,并且必须在批处理产生到网络之前进行嵌入和填充。下面是一个2令牌长输入的示例,输入中填充了零填充向量,最大值为
maxlen=4

x=np.连接((np.一((1,2,10)),np.零((1,2,10)),轴=1) >>>x 数组([[1,1,1,1,1,1,1,1,1,1,1,1,1.], [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]]) 以下是我用来创建循环模型的函数:

def make_模型(n_output_标签、maxlen、embedsize、rec_单位、density_单位)->模型:
输入=输入(形状=(最大长度,最大尺寸))
x=掩蔽(掩蔽值=0)(输入)
x=双向(LSTM(记录单元,激活=“relu”,返回序列=真))(x)
x=时间分布(密集(密集单位,激活=“relu”))(x)
输出=密集(n_输出_标签,activation=“softmax”)(x)
mod=tf.keras.Model(输入、输出)
mod.compile(
optimizer=tf.keras.optimizers.Adam(),
损失=tf.keras.loss.CategoricalCrossentropy(),
指标=[“准确度”]
)
返回模式
  • 假设我有两个输出类“TAG1”、“TAG2”(这将是一个热编码,因为我有一个softmax输出),为了适应我的输出,包括第三类“PAD”是否正确,因为即使上面示例中的最后两个时间步应该被屏蔽,网络仍然期望任何4长输入都有4长的输出

  • 当用上面的模型预测上面的例子时,我得到以下输出。最后两个时间步具有相等的类概率,从而预测类
    0
    (以两者中的为准),这是一种预期行为吗

  • >mod=make_模型(3,4,10,16,8)
    >>>国防部(x)
    >>>np.argmax(模数(x),轴=2)
    数组([[0,2,0,0]])
    
  • 关于模型的损失,下面的示例显示,更改填充元素的目标类不会更改损失,而更改常规元素的目标会更改损失。这是否意味着损耗计算确实考虑到了遮罩(假设它到达了模型的最后一层),因此我可以安全地使用填充样式训练模型,而不会出现任何损耗泄漏
  • y=np.数组([[1,0,0.],[0,1,0.],[0,0,0,1.],[0,0,0,1.],[0,0,1.]])#“PAD”在这里作为第三类 >>>y2=np.数组([[1,0,0.],[0,1,0.],[0,1,0.],[1,0,0.]) >>>y3=np.数组([[1,0,0.],[0,0,1.],[0,1,0.],[1,0,0.])) >>>模值(x,y)[0] 0.5602633953094482 >>>模型评估(x,y2)[0] 0.5602633953094482 >>>模型评估(x,y3)[0] 0.49864211678504944 我的直觉是,问题3回答了问题1和问题2,但输出和输出填充看起来有些奇怪,我宁愿确定

    感谢您的帮助或见解,谢谢大家