【发布时间】: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