【问题标题】:Keras residual connection on only part of input仅部分输入的 Keras 剩余连接
【发布时间】:2018-08-18 05:36:52
【问题描述】:

我已经制作了一个没有残余连接的模型,它编译和拟合没有任何错误[使用 Keras Sequential API]

我希望测试修改后的版本,只需添加一个残差连接,如SPEECH ENHANCEMENT BASED ON DEEP NEURAL NETWORKS WITH SKIP CONNECTIONS。所以,我需要改用函数式 API。

我的问题是在输入中间提取一块。我试过了。

INPUT_SIZE = N*OUTPUT_SIZE # N must be odd
HIDDEN_SIZE = N*OUTPUT_SIZE # N must be odd

modelInputs = Input(shape=(INPUT_SIZE,))
x = Dense(HIDDEN_SIZE, activation='relu', kernel_initializer=INPUT_KERNEL_INITIALIZER)(modelInputs)
for _ in np.arange(1,N_HIDDEN):
    x = Dense(HIDDEN_SIZE, activation='relu', kernel_initializer=INPUT_KERNEL_INITIALIZER)(x)
Y = Dense(OUTPUT_SIZE, activation='relu', kernel_initializer=INPUT_KERNEL_INITIALIZER)(x)

# --------------------------------------------------------
# Here, 4 options I tried to get "modelInputs_selected"
# --------------------------------------------------------
# Try 1
modelInputs_selected = Lambda(lambda x: x[int(N/2)*OUTPUT_SIZE:(int(N/2)+1)*OUTPUT_SIZE])(modelInputs)
# Try 2 [Try 1 with 'output_shape' filled]
modelInputs_selected = Lambda(lambda x: x[int(N/2)*OUTPUT_SIZE:(int(N/2)+1)*OUTPUT_SIZE, :], output_shape=(OUTPUT_SIZE,))(modelInputs)

# Try 3
modelInputs_selected = K.transpose(K.gather(K.transpose(modelInputs), K.arange(int(N/2)*OUTPUT_SIZE, (int(N/2)+1)*OUTPUT_SIZE)))
# Try 4 [Try 3 unwrapped]
toto1 = K.transpose(modelInputs)
toto2 = K.gather(toto1, K.arange(int(N/2)*OUTPUT_SIZE, (int(N/2)+1)*OUTPUT_SIZE))
modelInputs_selected = K.transpose(toto2)
# --------------------------------------------------------
# End of option tried
# --------------------------------------------------------

predictions = add([modelInputs_selected, Y])

model = Model(inputs=modelInputs, outputs=predictions)

结果是:

  • 尝试 1 和尝试 2:
    • 错误 = add() 期间形状不连贯
  • 尝试 3 和尝试 4:
    • add() 的好形状
    • 模型错误(...)
      • 我一步一步进入了 Model()。我们从最后一层开始往回走
      • 输出 add() OK
      • 上一个 K.transpose(): 错误 AttributeError: 'Tensor' object has no attribute '_keras_history' in "build_map_of_graph"

模型构建失败,因为我使用了后端的函数(TensorFlow,对我来说)?

有人可以帮忙吗?

如果我使用乘法()也许可以?

  • modelInputs 为 (m, N*OUTPUT_SIZE),modelInputs_selected 为 (m,OUTPUT_SIZE)
  • 使用好的矩阵 A (N*OUTPUT_SIZE, OUTPUT_SIZE):modelInputs_selected = multiply(modelInputs, A)

【问题讨论】:

    标签: keras deep-residual-networks


    【解决方案1】:

    尝试 1 时出错

    您忽略了样本维度(第一个维度)。
    张量 x 应该以 (samples_or_batch_size, INPUT_SIZE) 的形状出现。

    • 解决方案:

      • 所以你需要lambda x: x[:, int(N/2)*OUTPUT_SIZE:(int(N/2)+1)*OUTPUT_SIZE]
    • 但老实说,为什么不选择其中之一呢?

      • lambda x: x[:,:OUTPUT_SIZE]
      • lambda x: x[:,-OUTPUT_SIZE:]

    是从头到尾的问题吗?这甚至使您免于使用N,唯一的条件是INPUT_SIZE >= OUTPUT_SIZE

    尝试 2 时出错

    您并没有忽略样本,而是在反转维度。
    它应该是x[:,expression] 而不是x[expression,:]

    如果你不使用 Tensorflow,你只需要声明输出形状(Tensorflow 可以自动为你做)

    3 和 4 中的错误

    您不能在图层之外使用任何功能。
    使用 Keras 后端或 Tensorflow 函数都没有问题,但它们必须在层内,例如在尝试 1 和 2 中。

    no _keras_history 是使用层外函数的典型错误。

    【讨论】:

    • 谢谢。为什么我要使用中间的一个:我的输入是 N FFT(过去的“一半”,当前的一个和未来的“一半”),我希望使用“当前时间”FFT。这个组织更适合逻辑数据的呈现,因为,当然”,我应该把当前的 FFT 放在第一位......
    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2014-10-11
    • 2011-04-03
    • 2019-07-13
    • 2014-10-19
    • 2011-11-06
    • 2013-10-26
    • 2018-03-31
    相关资源
    最近更新 更多