tensorflow transpose 的c 实现

1.Tensorflow 的 transpose 调用的是 eigen 库的 tensor类的 tensor.shuffle 

2.

3.Eigen 库中tensor.shuffle 中最核心的代码是下面这样的。没有进行内存搬运,而是修改了几个tensor 的成员变量

最重要的是修改了m_inputStrides 这个成员变量。

 

EIGEN_DEVICE_FUNC EIGEN_STRONG_INLINE TensorEvaluator(const XprType& op, const Device& device)
      : m_impl(op.expression(), device)
  {
    const typename TensorEvaluator<ArgType, Device>::Dimensions& input_dims = m_impl.dimensions();
    const Shuffle& shuffle = op.shufflePermutation();
    for (int i = 0; i < NumDims; ++i) {
      m_dimensions[i] = input_dims[shuffle[i]];
    }

    array<Index, NumDims> inputStrides;

    if (static_cast<int>(Layout) == static_cast<int>(ColMajor)) {
      inputStrides[0] = 1;
      m_outputStrides[0] = 1;
      for (int i = 1; i < NumDims; ++i) {
        inputStrides[i] = inputStrides[i - 1] * input_dims[i - 1];
        m_outputStrides[i] = m_outputStrides[i - 1] * m_dimensions[i - 1];
      }
    } else {
      inputStrides[NumDims - 1] = 1;
      m_outputStrides[NumDims - 1] = 1;
      for (int i = NumDims - 2; i >= 0; --i) {
        inputStrides[i] = inputStrides[i + 1] * input_dims[i + 1];
        m_outputStrides[i] = m_outputStrides[i + 1] * m_dimensions[i + 1];
      }
    }

    for (int i = 0; i < NumDims; ++i) {
      m_inputStrides[i] = inputStrides[shuffle[i]];
    }
  }

作为一种开源的机器学习框架,TensorFlow被广泛应用于各种应用场景,其中就包括胶囊网络。胶囊网络是一种用于图像分析和分类的新型神经网络结构,不仅具有较高的准确率,而且能够使用更少的架构参数来实现。下面就让我们来看看如何使用TensorFlow实现胶囊网络。 胶囊网络的核心组件是胶囊,一种用于代替传统神经网络中的全连接层的基础组件。胶囊由一个向量(被称为胶囊结果)和一个学习到的矩阵(被称为转换矩阵)组成。TensorFlow中的胶囊网络可以使用tf.contrib.capsule的库来实现,该库包括以下几个组件: 1. Capsule层:用于实现胶囊网络中的胶囊层,该层包括若干个胶囊单元,每个单元输出一个向量。 2. Route层:用于将胶囊层的输出转换为下一层输入的加权和,该层包括两个输入——胶囊层的输出和前一层的输出。 3. Squash函数:用于将胶囊输出向量缩放到0和1之间,该函数可以使用一个简单的非线性函数实现。 4. Margin Loss:用于计算胶囊网络的损失函数,该损失函数包括预测误差和正则化项,可以使用标准的交叉熵损失函数来实现。 一个简单的胶囊网络可以通过以下TensorFlow代码来实现: ``` python import tensorflow as tf import numpy as np class CapsuleLayer(object): def __init__(self, input_capsules, output_capsules, output_dim, routing_iterations): self.input_capsules = input_capsules self.output_capsules = output_capsules self.output_dim = output_dim self.routing_iterations = routing_iterations self.w = tf.Variable(tf.random_normal([output_capsules, input_capsules, output_dim, input_dim])) def __call__(self, input): input = tf.expand_dims(input, axis=2) input = tf.tile(input, [1, 1, self.output_capsules, 1, 1]) input = tf.transpose(input, perm=[0, 2, 1, 3, 4]) capsules = tf.matmul(self.w, input) b = tf.zeros([input.shape[0], self.output_capsules, self.input_capsules]) for i in range(self.routing_iterations): c = tf.nn.softmax(b, axis=1) s = tf.reduce_sum(tf.multiply(c, capsules), axis=2, keep_dims=True) v = self.squash(s) if i < self.routing_iterations - 1: b += tf.reduce_sum(tf.multiply(capsules, v), axis=3) return tf.squeeze(v, [1, 4]) def squash(self, vector): squared_norm = tf.reduce_sum(tf.square(vector), axis=-2, keep_dims=True) scaled = squared_norm / (1 + squared_norm) * vector return scaled / tf.sqrt(squared_norm + 1e-9) class RouteLayer(object): def __init__(self, input_dim, output_dim): self.input_dim = input_dim self.output_dim = output_dim self.w = tf.Variable(tf.random_normal([output_dim, input_dim])) def __call__(self, input): input = tf.reshape(input, [-1, self.input_dim]) output = tf.matmul(input, self.w, transpose_b=True) return output class Squash(object): def __call__(self, vector): squared_norm = tf.reduce_sum(tf.square(vector), axis=-2, keep_dims=True) scaled = squared_norm / (1 + squared_norm) * vector return scaled / tf.sqrt(squared_norm + 1e-9) class MarginLoss(object): def __init__(self, m_plus, m_minus, lambda_value): self.m_plus = m_plus self.m_minus = m_minus self.lambda_value = lambda_value def __call__(self, y_true, y_pred): L = y_true * tf.square(tf.maximum(0., self.m_plus - y_pred)) + \ self.lambda_value * (1 - y_true) * tf.square(tf.maximum(0., y_pred - self.m_minus)) return tf.reduce_mean(tf.reduce_sum(L, axis=1)) ``` 以上代码实现了胶囊网络的四个核心组件(CapsuleLayer、RouteLayer、Squash和MarginLoss),其中CapsuleLayer实现了胶囊层,RouteLayer实现了路由层,Squash实现了缩放函数,MarginLoss实现了胶囊网络的损失函数。通过这些组件,可以在TensorFlow中构建一个简单的胶囊网络。 需要注意的是,以上代码仅提供了一个简单的胶囊网络的实现,实际应用中可能涉及到更复杂的模型,需要根据具体场景进行修改和优化,以提高网络的性能和准确率。同时,由于TensorFlow是一种强大的机器学习框架,拥有庞大的社区和丰富的资源,因此在应用中也可以参考社区中的代码和文档,以快速实现和优化胶囊网络。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值