我有一个关于的问题和noise_shape的论点。
问题1:
如果您的输入具有形状(,timesteps,features),并且希望所有时间步骤的退出掩码相同,那么noise_shape=(batch_size,1,features)有什么意义?添加这个参数有什么好处?
这是否意味着,随着时间的推移,将被丢弃的神经元数量是相同的?这意味着,在每一个时间步骤t,会有n个神经元下降?
问题2:在创建模型时是否必须在noise_shape中包含“batch_size”?->参见下面的示例。
假设我有一个多变量时间序列数据,形状为(10000,1,100,2) ->(数据数、通道数、时间步长、特征数)。
然后创建批数为64 -> (64,1,100,2)的批处理。
如果我想创建一个退出的CNN模型,我使用:
inp = Input([1, 100, 2])
conv1 = Conv2D(64, kernel_size=(11,2), strides(1,1),data_format='channels_first')(inp)
max1 = MaxPooling2D((2,1))(conv1)
max1_shape = max1._keras_shape
drop1 = Dropout((0.1, noise_shape=[**?**, max1._keras_shape[1], 1, 1]))因为层max1的输出形状应该是( None,64,50,1),所以我不能将无一个分配给问号(它对应于batch_size)。
我想知道我该如何处理这个问题?我应该只使用(64,1,1)作为noise_shape吗?或者我应该定义一个名为'batch_size‘的变量,然后像这样将它传递给这个参数(batch_size,64,1,1)?
发布于 2018-01-11 14:39:38
问题1:
我觉得这有点像一场粗俗的广播。
假设您有2个批处理、3个时间步骤和4个特性(这是一个小示例,可以使它更容易显示):(2,3,4)
如果您使用的噪声形状为(2,1,4),则每个批次都将有自己的退出掩码,这些掩码将应用于所有时间步骤。
假设这些是形状的权重(2,3,4):
array([[[ 1, 2, 3, 4],
[ 5, 6, 7, 8],
[ 10, 11, 12, 13]],
[[ 14, 15, 16, 17],
[ 18, 19, 20, 21],
[ 22, 23, 24, 25]]])这将是随机的noise_shape (2,1,4) (1类似于保持,0类似于关闭它):
array([[[ 1, 1, 1, 0]],
[[ 1, 0, 0, 1]]])所以你有这两个噪音形状(每批一次)。然后它就会沿着时间步长轴广播。
array([[[ 1, 1, 1, 0],
[ 1, 1, 1, 0],
[ 1, 1, 1, 0]],
[[ 1, 0, 0, 1],
[ 1, 0, 0, 1],
[ 1, 0, 0, 1]]])并适用于权重:
array([[[ 1, 2, 3, 0],
[ 5, 6, 7, 0],
[ 10, 11, 12, 0]],
[[ 14, 0, 0, 17],
[ 18, 0, 0, 21],
[ 22, 0, 0, 25]]])问题2:
老实说,我不太清楚你的第二个问题。
编辑:您可以做的是获取输入形状的第一个维度,它应该是batch_size,就像这个github问题中所建议的那样
import tensorflow as tf
...
batch_size = tf.shape(inp)[0]
drop1 = Dropout((0.1, noise_shape=[batch_size, max1._keras_shape[1], 1, 1]))如你所见,我在tensorflow后端。不知道,如果西亚诺也有这些问题,如果有,你可能只是能够解决它与西亚诺形状等效。
发布于 2022-01-04 19:13:22
下面是示例代码,以查看到底发生了什么。输出日志是不言自明的。
如果您对动态batch_size感到烦恼,那么只需将noise_shape的第一个元素设置为None,如下所示:
dl1 = tk.layers.Dropout(0.2, noise_shape=[_batch_size, 1, _num_features])
至
dl1 = tk.layers.Dropout(0.2, noise_shape=[None, 1, _num_features])
import tensorflow as tf
import tensorflow.keras as tk
import numpy as np
_batch_size = 5
_time_steps = 2
_num_features = 3
input = np.random.random((_batch_size, _time_steps, _num_features))
dl = tk.layers.Dropout(0.2)
dl1 = tk.layers.Dropout(0.2, noise_shape=[_batch_size, 1, _num_features])
out = dl(input, training=True).numpy()
out1 = dl1(input, training=True).numpy()
for i in range(_batch_size):
print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>", i)
print("input")
print(input[i])
print("out")
print(out[i])
print("out1")
print(out1[i])产出如下:
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 0
input
[[0.53853024 0.80089701 0.64374258]
[0.06481775 0.31187039 0.5029061 ]]
out
[[0.6731628 1.0011213 0. ]
[0.08102219 0.38983798 0.6286326 ]]
out1
[[0.6731628 0. 0.8046782 ]
[0.08102219 0. 0.6286326 ]]
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 1
input
[[0.70746014 0.08990712 0.58195288]
[0.75798534 0.50140453 0.04914242]]
out
[[0.8843252 0.11238389 0. ]
[0.9474817 0.62675565 0. ]]
out1
[[0. 0.11238389 0. ]
[0. 0.62675565 0. ]]
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2
input
[[0.85253707 0.55813084 0.70741476]
[0.98812977 0.21565134 0.67909392]]
out
[[1.0656713 0.69766355 0.8842684 ]
[0. 0.26956415 0. ]]
out1
[[1.0656713 0.69766355 0.8842684 ]
[1.2351623 0.26956415 0.84886736]]
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 3
input
[[0.9837272 0.3504008 0.37425778]
[0.67648931 0.74456052 0.6229444 ]]
out
[[1.2296591 0.438001 0. ]
[0.84561163 0.93070066 0.7786805 ]]
out1
[[0. 0.438001 0.46782222]
[0. 0.93070066 0.7786805 ]]
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 4
input
[[0.45599217 0.80992091 0.04458478]
[0.12214568 0.09821599 0.51525869]]
out
[[0.5699902 1.0124011 0. ]
[0.1526821 0. 0.64407337]]
out1
[[0.5699902 1.0124011 0.05573097]
[0.1526821 0.12276999 0.64407337]]https://stackoverflow.com/questions/46585069
复制相似问题