微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

TensorFlow中相同网络错误的两个输入

如何解决TensorFlow中相同网络错误的两个输入

我正在尝试建立一个TensorFlow模型,该模型分别将表示形式和分类部分结合在一起。但是,我的分类器使用了来自同一表示网络的两个输入,并且在我编码该体系结构时收到错误:“传递给模型的输入列表是多余的。所有输入应该只出现一次。”这是我的代码

import tensorflow as tf

def representation():
    inp = tf.keras.Input(shape=[100,300])
    x = tf.keras.layers.Conv1D(300,10,1,'same')(inp)
    output = tf.keras.layers.Conv1D(300,'same')(x)
    return tf.keras.Model(inp,output)

def classifier():
    inp1 = tf.keras.Input(shape=[100,300])
    inp2 = tf.keras.Input(shape=[100,300])
    output = tf.keras.layers.Activation('sigmoid')(inp1+inp2)
    return tf.keras.Model([inp1,inp2],output)

repre = representation()
cla = classifier()

model = tf.keras.Model([repre.input,repre.input],cla([repre.output,repre.output]))

我使用了tf.keras.Model([repre1.input,repre2.input],cla([repre1.output,repre2.output]))之类的两种表示形式,并且可以使用,但是这些表示来自不同的网络。

解决方法

对representation()函数中的tf.keras.Input的调用在神经网络的计算图上定义了一个节点。该节点表示单个输入,该输入绑定到几个一维卷积层。同时将其用于两个输入是没有意义的,因为上面的模型定义中只有一条从输入到输出的路径。 Keras使用不同的语法来定义使用共享权重和多个输入的模型。 This页面上有很好的示例,您所涉及的最相关的细节是“共享功能性API中的一个层,多次调用同一层实例”。在您的情况下,您想要修改代码以实际定义两个输入节点,并假装您的表示模型是一个图层。

class RepresentationLayer(tf.keras.layers.Layer):
    def __init__(self):
        super(RepresentationLayer,self).__init__()
        self.conv1 = tf.keras.layers.Conv1D(300,10,1,'same')
        self.conv2 = tf.keras.layers.Conv1D(300,'same')
    
    def __call__(self,inputs):
        x = self.conv1(inputs)
        x = self.conv2(x)
        return x

def classifier_shared_representation():
    inp1 = tf.keras.Input(shape=[100,300])
    inp2 = tf.keras.Input(shape=[100,300])
    rep_layer = RepresentationLayer()
    rep1 = rep_layer(inp1)
    rep2 = rep_layer(inp2)
    output = tf.keras.layers.Activation('sigmoid')(rep1+rep2)
    return tf.keras.Model(inputs=[inp1,inp2],outputs=[output])


model = classifier_shared_representation()

在您发布的代码中,您从分类层中指定了两个输出:

model = tf.keras.Model([repre.input,repre.input],cla([repre.output,repre.output]))

要在上面的代码中执行此操作,只需将tf.keras.Model调用更改为

tf.keras.Model(inputs=[inp1,outputs=[output,output])

我仍然不确定您是否需要多个输出。看来您的classifier()定义只是对表示形式的输出求和,并将它们传递给激活,从而产生单个输出。如果您确实想要具有多个输出的共享分类层,则过程与上面相同。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。