为什么tf.layers.dense抛出AttributeError?

时间:2019-01-04 15:21:30

标签: python tensorflow

我试图了解tf.layers.dense对数组的作用,并在使用下面的代码。但是,在运行代码时出现错误。

我尝试调试,似乎在计算张量的秩时可能存在一些问题。但是,sess.run(tf.rank(a))成功返回3。因此,我认为张量本身还有其他问题。

import numpy as np
import tensorflow as tf

a = np.array([[[1,  0,  0], [1,  1,  0]], [[0,  0,  0], [0, 1, 1]]])
hidden_layer = tf.layers.dense(a, 5, activation=tf.nn.relu)

sess = tf.Session()
print(sess.run(hidden_layer))

上面的代码抛出错误 AttributeError:'tuple'对象没有属性'ndims',但是我希望应该创建一个具有权重和偏差的完全连接的层。

我在做什么错了?

此外,如果有人可以展示与该实现等效的Python / NumPy(不使用tensorflow的密集型),那将非常有帮助,以便直观地进行操作。

2 个答案:

答案 0 :(得分:0)

该代码有两个问题:Dense层希望输入Tensor而不是Numpy数组,并且需要显式初始化隐藏层的权重。这是带有一些注释的更正代码:

import numpy as np
import tensorflow as tf

# Make sure Dense layer is always initialized with the same values.
tf.set_random_seed(0)

# Dense layer will need float input
a = np.array([[[1,  0,  0], [1,  1,  0]], [[0,  0,  0], [0, 1, 1]]], 
        dtype=np.float32)
# Convert numpy array to Tensor
t = tf.convert_to_tensor(a)

# Create hidden layer with the array as input and random initializer that
# draws from a uniform distribution.
hidden_layer = tf.layers.dense(t, 5, activation=tf.nn.relu)

sess = tf.Session()
# Initialize Dense layer with the random initializer
sess.run(tf.global_variables_initializer())
# Print result of running the array through the Dense layer
print(sess.run(hidden_layer))

顺便说一句,只要您正在尝试,就可能会受益于在eager mode中使用TensorFlow或使用具有更友好界面的PyTorch

答案 1 :(得分:0)

首先,您应该重塑a。然后将a输入到隐藏层。然后应该初始化参数。

import numpy as np
import tensorflow as tf
a = np.array([[[1,  0,  0], [1,  1,  0]], [[0,  0,  0], [0, 1, 1]]], dtype=np.int32)
a = tf.reshape(a, [-1, 4*3])
hidden_layer = tf.layers.dense(a, 5, activation=tf.nn.relu)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
print(sess.run(hidden_layer))