tf=1.9AttributeError: module 'tensorflow.contrib.rnn.python.ops.rnn_cell' has no attribute '_linear'

我的tf=1.9 的环境,原代码是1.12,结果报错了。

from tensorflow.contrib.rnn.python.ops import rnn_cell
linear = rnn_cell._linear # pylint: disable=protected-access


这个暂时是无解。不过由于这个函数实现的简单的线性求和,因此可以手动在程序中进行修改。

from tensorflow.python.ops import nn_ops
from tensorflow.python.ops import init_ops
from tensorflow.python.util import nest
from tensorflow.python.ops import variable_scope as vs
def linear(args, output_size, bias, bias_start=0.0, scope=None):
  """Linear map: sum_i(args[i] * W[i]), where W[i] is a variable.

  Args:
    args: a 2D Tensor or a list of 2D, batch x n, Tensors.
    output_size: int, second dimension of W[i].
    bias: boolean, whether to add a bias term or not.
    bias_start: starting value to initialize the bias; 0 by default.
    scope: (optional) Variable scope to create parameters in.

  Returns:
    A 2D Tensor with shape [batch x output_size] equal to
    sum_i(args[i] * W[i]), where W[i]s are newly created matrices.

  Raises:
    ValueError: if some of the arguments has unspecified or wrong shape.
  """
  if args is None or (nest.is_sequence(args) and not args):
    raise ValueError("`args` must be specified")
  if not nest.is_sequence(args):
    args = [args]

  # Calculate the total size of arguments on dimension 1.
  total_arg_size = 0
  #shapes = [a.get_shape() for a in args]
  shapes=[]
  for a in args:
    shapes.append(a.get_shape())
    
  for shape in shapes:
    if shape.ndims != 2:
      raise ValueError("linear is expecting 2D arguments: %s" % shapes)
    if shape[1].value is None:
      raise ValueError("linear expects shape[1] to be provided for shape %s, "
                       "but saw %d" % (shape, shape[1]))
    else:
      total_arg_size += shape[1].value

  dtype = [a.dtype for a in args][0]

  # Now the computation.
  scope = vs.get_variable_scope()
  with vs.variable_scope(scope) as outer_scope:
    weights = vs.get_variable(
        "weights", [total_arg_size, output_size], dtype=dtype)
    if len(args) == 1:
      res = math_ops.matmul(args[0], weights)
    else:
      res = math_ops.matmul(array_ops.concat( args,1), weights)
    if not bias:
      return res
    with vs.variable_scope(outer_scope) as inner_scope:
      inner_scope.set_partitioner(None)
      biases = vs.get_variable(
          "biases", [output_size],
          dtype=dtype,
          initializer=init_ops.constant_initializer(bias_start, dtype=dtype))
  return nn_ops.bias_add(res, biases)

 

参考:

https://github.com/tensorflow/tensorflow/blob/r1.4/tensorflow/python/ops/rnn_cell_impl.py#L1196

https://blog.csdn.net/sparkexpert/article/details/71513976   这个还有关于其他的API的改动方法

https://blog.csdn.net/u013713117/article/details/54598583

你可能感兴趣的:(TensorFlow)