【问题标题】:Constructing a highly customized neural network in keras (weight sharing, custom connectivity)在 keras 中构建高度定制的神经网络(权重共享、自定义连接)
【发布时间】:2020-07-28 14:47:57
【问题描述】:

我正在尝试为物理科学中的特定问题创建 NN 模型,我的动机是减少权重的数量并根据物理见解共享权重。 神经网络看起来像:

输入大小为 2n,其中前 n 个输入 (X1 .. Xn) 被馈送到第一个隐藏层 - 但是,神经网络的独特之处在于只有一个输入被馈送到第一个隐藏层的每个单元。此外,所有权重在输入之间共享。

第二层中的每个单元都有 2 个输入 - 一个来自前一层,一个直接来自原始输入 (Xn+1 .. X2n)。相应地共享权重和偏差。

最后,输出层有 1 个单元,有 100 个输入(所有输出都来自第二个隐藏层),并且对每个单元应用相同的权重和偏差。

【问题讨论】:

    标签: tensorflow keras neural-network physics biological-neural-network


    【解决方案1】:

    此代码将解决您的问题(假设您想在最后将所有输入加到输出中) 顺便说一句,如果你没有任何激活,你描述的操作是线性的,可以很容易地简化。

    import tensorflow.keras as keras
    import tensorflow.keras.layers as layers
    input_shape = [1]
    num_inputs = 4
    
    inputs = [layers.Input(shape=input_shape, name=f"input_{i}") for i in range(num_inputs)]
    x = [i for i in inputs]
    dense_1 = layers.Dense(units=1, use_bias=False, name="1")
    dense_21 = layers.Dense(units=1, use_bias=True, name="21")
    dense_22 = layers.Dense(units=1, use_bias=False, name="22")
    dense_3 = layers.Dense(units=1, use_bias=True, name="3")
    
    for i in range(num_inputs//2):
        # First hidden layer
        x[i] = dense_1(x[i])
        # Second hidden layer
        x[i] = dense_21(x[i])
        # Connect with the other inputs
        x[i + num_inputs // 2] = dense_22(x[i + num_inputs // 2])
        x[i] = layers.Add()([x[i], x[i + num_inputs // 2]])
        # Last one
        x[i] = dense_3(x[i])
    
    # Add all
    x = layers.Add()(x[:num_inputs//2])
    
    model = keras.Model(inputs=inputs,
                        outputs=x)
    
    keras.utils.plot_model(model=model,
                           to_file="model.png",
                           show_shapes=True)
    

    上述代码的情节是:

    【讨论】:

    猜你喜欢
    • 2011-08-07
    • 2018-04-27
    • 1970-01-01
    • 2019-01-01
    • 2019-08-12
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    相关资源
    最近更新 更多