Tensorflow 在张量流中实现连体网络

Tensorflow 在张量流中实现连体网络,tensorflow,Tensorflow,我想实现一个连体卷积神经网络,其中两个图像在卷积层中共享权重,然后在通过完全连接的层之前进行连接。我尝试过一个实现,但它似乎是一个“黑客”解决方案。特别是,我将张量上的操作定义为一个简单的Python函数,我不确定是否允许这样做 以下是我尝试过的代码: images=tf.placeholder(tf.float32,shape=[None,64*64]) #卷积层 # ... # ... #结果是pool3_flat,这是第三个卷积层的平坦输出 pool3_flat=tf.重塑(pool3,[

我想实现一个连体卷积神经网络,其中两个图像在卷积层中共享权重,然后在通过完全连接的层之前进行连接。我尝试过一个实现,但它似乎是一个“黑客”解决方案。特别是,我将张量上的操作定义为一个简单的Python函数,我不确定是否允许这样做

以下是我尝试过的代码:

images=tf.placeholder(tf.float32,shape=[None,64*64])
#卷积层
# ...
# ...
#结果是pool3_flat,这是第三个卷积层的平坦输出
pool3_flat=tf.重塑(pool3,[-1,8*8*128])
#现在,合并图像对,其中每对由批处理中的相邻图像组成,步幅为2
def merge_pairs():
#创建一个张量来存储合并的图像对
#批大小为128,因此将有64对(该张量的第一维中有64对)
合并的_pairs=tf.Variable(tf.zero([64,8*8*128]))
#将图像分成64对
成对=tf.分割(0,64,池3_平坦)
#对于每一对,跨维度1连接两个图像,并在适当的合并对行中设置该张量
对于pair_num,枚举中的pair(pairs):
合并对=tf.concat(1,对)
合并的\u对[pair\u num]=合并的\u对
返回合并的\u对
#继续对合并的_对张量进行操作,就像批大小为64一样
fc4=tf.matmul(merge_pairs(),权重4)
# ...
# ...
虽然这个编译过程似乎运行良好,但结果并不像预期的那样。因此,我想知道是否有更好的方法使用TensorFlow中的内置操作来实现暹罗网络?

您可以使用和,有点像:

pairs=tf.pack(tf.split(0,64,pool3_平坦))
左,右=tf.unpack(tf.transpose(pairs,perm=[1,0,2]))
合并的_pairs=tf.concat(1,[左,右])
一种更简洁的方法是从一开始就将两个网络分开,这样就可以定义两个网络,并在每个网络中使用相同的可训练变量

您可能会遇到以下情况(跳过卷积层):

image\u left=tf.placeholder(tf.float32,shape=[None,64,64,1])
image\u right=tf.placeholder(tf.float32,shape=[None,64,64,1])
pool_left=tf.nn.max_pool(image_left,ksize=[1,2,2,1],strips=[1,2,2,1],padding='SAME')
pool_right=tf.nn.max_pool(image_left,ksize=[1,2,2,1],strips=[1,2,2,1],padding='SAME')
池左=tf.重塑(池左,[-1,32*32])
池平面右=tf.重塑(池右,[-1,32*32])
然后简单地在尺寸1中的左侧和右侧合并

concat\u layer=tf.concat(1,[pool\u flat\u left,pool\u flat\u right])
这样,您也可以在以后更改批大小。
确保在每个大小(左和右)上使用相同的权重和偏差。

啊,是的,实际上为两个图像显式地编写单独的操作更有意义。这是一个多一点的代码,但使它更易于管理!它是否正确,因为您的图像_左为右池
pool\u right=tf.nn.max\u pool(image\u left,ksize=[1,2,2,1],strips=[1,2,2,1],padding='SAME')