首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TensorFlow奇数偶数二进制填充

TensorFlow奇数偶数二进制填充
EN

Stack Overflow用户
提问于 2019-02-23 15:41:59
回答 1查看 74关注 0票数 0

使用TensorFlow构建一个贝叶斯神经网络。我正在尝试用-1和1互换来填充我的张量,如FBNA:一个完全二进制的神经网络加速器图3所示。下一个2D数组应该有相反的-1,1模式。我可以在嵌套的for循环中实现这一点,但这非常慢。

有人能想出一种更快的方法吗?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-02-26 20:57:21

好吧,我已经想出了一个解决方案,但它可能不是很好(我是TensorFlow的新手)。这需要大量的试验和错误。此外,它仅支持通道长度为1、3或任何偶数通道长度的4D张量。

如果有谁可以做一个更漂亮/更通用的版本,请张贴,谢谢。

代码语言:javascript
复制
def OddEvenPad(X):

  #create 1D padding tile
  unit_tile = tf.Variable([1., -1.], tf.float32, validate_shape=False)
  unit_tile = tf.reshape(unit_tile, [2,1])
  tf.global_variables_initializer().run()

  #variables
  pad_col_size = int(X.get_shape()[1])
  pad_row_size = int(X.get_shape()[2] + 2)
  num_channels = int(X.get_shape()[3])
  num_batch = int(X.get_shape()[0])

  #tile padding 1D
  pad_col = tf.tile(tf.negative(unit_tile), [int(pad_col_size/2),1])
  pad_row = tf.tile(unit_tile, [int(pad_row_size/2),1])

  if num_channels%2==0:
      #tile padding 2D
      pad_col = tf.concat([pad_col, tf.negative(pad_col)], axis=1)
      pad_row = tf.concat([pad_row, tf.negative(pad_row)], axis=1)
      #tile padding 4D
      pad_col = tf.reshape(pad_col, [1,pad_col_size,1,2])
      pad_row = tf.reshape(pad_row, [1,1,pad_row_size,2])
      #tile padding down two channels
      pad_col = tf.tile(pad_col, [2,1,1,int(num_channels/2)])
      pad_row = tf.tile(pad_row, [2,1,1,int(num_channels/2)])
  elif num_channels==3:
      #tile padding 2D
      pad_col = tf.concat([pad_col, tf.negative(pad_col), pad_col], axis=1)
      pad_row = tf.concat([pad_row, tf.negative(pad_row), pad_row], axis=1)
      #tile padding 4D
      pad_col = tf.reshape(pad_col, [1,pad_col_size,1,num_channels])
      pad_row = tf.reshape(pad_row, [1,1,pad_row_size,num_channels])
      #tile padding down two channels
      pad_col = tf.concat([pad_col, tf.negative(pad_col)], axis=0)
      pad_row = tf.concat([pad_row, tf.negative(pad_row)], axis=0)
  elif num_channels==1:
      #tile padding 4D
      pad_col = tf.reshape(pad_col, [1,pad_col_size,1,num_channels])
      pad_row = tf.reshape(pad_row, [1,1,pad_row_size,num_channels])
      #tile padding down two channels
      pad_col = tf.concat([pad_col, tf.negative(pad_col)], axis=0)
      pad_row = tf.concat([pad_row, tf.negative(pad_row)], axis=0)
  else:
    print('This OddEvenPad function only supports channel lengths = 1, 3, 2*(any int)')

  #tile down batch
  pad_col = tf.tile(pad_col, [int(num_batch/2),1,1,1])
  pad_row = tf.tile(pad_row, [int(num_batch/2),1,1,1])

  #add column padding to tensor
  padding_X = tf.concat([pad_col, X], axis=2)
  padding_X = tf.concat([padding_X, tf.negative(pad_col)], axis=2)

  #add row padding to tensor
  padding_X = tf.concat([pad_row, padding_X], axis=1)
  padded_X = tf.concat([padding_X, tf.negative(pad_row)], axis=1)

  return padded_X
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54839351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档