首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用noise_shape实现Keras

用noise_shape实现Keras
EN

Stack Overflow用户
提问于 2017-10-05 11:59:24
回答 2查看 5K关注 0票数 8

我有一个关于的问题和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模型,我使用:

代码语言:javascript
复制
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)?

EN

回答 2

Stack Overflow用户

发布于 2018-01-11 14:39:38

问题1:

我觉得这有点像一场粗俗的广播。

假设您有2个批处理、3个时间步骤和4个特性(这是一个小示例,可以使它更容易显示):(2,3,4)

如果您使用的噪声形状为(2,1,4),则每个批次都将有自己的退出掩码,这些掩码将应用于所有时间步骤。

假设这些是形状的权重(2,3,4):

代码语言:javascript
复制
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类似于关闭它):

代码语言:javascript
复制
array([[[ 1,  1,  1,  0]],

       [[ 1,  0,  0,  1]]])

所以你有这两个噪音形状(每批一次)。然后它就会沿着时间步长轴广播。

代码语言:javascript
复制
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]]])

并适用于权重:

代码语言:javascript
复制
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问题中所建议的那样

代码语言:javascript
复制
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后端。不知道,如果西亚诺也有这些问题,如果有,你可能只是能够解决它与西亚诺形状等效。

票数 6
EN

Stack Overflow用户

发布于 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])

代码语言:javascript
复制
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])

产出如下:

代码语言:javascript
复制
>>>>>>>>>>>>>>>>>>>>>>>>>>>> 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]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46585069

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档