tf.GradientTape() 为我的神经网络函数返回 None 值

问题描述

所以我创建了自己的神经网络,我想根据输入变量对它进行自动微分。我的神经网络代码是这样的

n_input = 1     
n_hidden_1 = 50 
n_hidden_2 = 50 
n_output = 1 

weights = {
'h1': tf.Variable(tf.random.normal([n_input,n_hidden_1],0.5)),'h2': tf.Variable(tf.random.normal([n_hidden_1,n_hidden_2],'out': tf.Variable(tf.random.normal([n_hidden_2,n_output],0.5))
}

biases = {
'b1': tf.Variable(tf.random.normal([n_hidden_1],'b2': tf.Variable(tf.random.normal([n_hidden_2],'out': tf.Variable(tf.random.normal([n_output],0.5))
}

def multilayer_perceptron(x):
    x = np.array([[[x]]],dtype='float32')
    layer_1 = tf.add(tf.matmul(x,weights['h1']),biases['b1'])
    layer_1 = tf.nn.tanh(layer_1)
    layer_2 = tf.add(tf.matmul(layer_1,weights['h2']),biases['b2'])
    layer_2 = tf.nn.tanh(layer_2)
    output = tf.matmul(layer_2,weights['out']) + biases['out']
    return output

使用 tf.GradientTape(),我试图用这个来区分神经网络

x = tf.Variable(1.0)
with tf.GradientTape() as tape:
    y = multilayer_perceptron(x)
dNN1 = tape.gradient(y,x)
print(dNN1)

结果None。我在这里做错了什么?

解决方法

因为您正在通过不可微分的 xnp.array 转换为 numpy 数组。

像这样修改你的代码:

def multilayer_perceptron(x):
    #x = np.array([[[x]]],dtype='float32') #comment
    layer_1 = tf.add(tf.matmul([[[x]]],weights['h1']),biases['b1']) #change x shape by adding []
    layer_1 = tf.nn.tanh(layer_1)
    layer_2 = tf.add(tf.matmul(layer_1,weights['h2']),biases['b2'])
    layer_2 = tf.nn.tanh(layer_2)
    output = tf.matmul(layer_2,weights['out']) + biases['out']
    return output
,

为了一些 tensorflow 操作的良好运行,最好操作的所有元素都是 tf.tensor 类型,你必须使用

def multilayer_perceptron(x):
 x =  tf.reshape(x,(1,1,1))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...