tf.GradientTape() returns None 我的神经网络函数的值
tf.GradientTape() returns None value for my neural network function
所以我创建了自己的神经网络,我想针对输入变量对其进行自动微分。我的神经网络代码是这样的
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,0.5)),
'h2': tf.Variable(tf.random.normal([n_hidden_1, n_hidden_2],0,0.5)),
'out': tf.Variable(tf.random.normal([n_hidden_2, n_output],0,0.5))
}
biases = {
'b1': tf.Variable(tf.random.normal([n_hidden_1],0,0.5)),
'b2': tf.Variable(tf.random.normal([n_hidden_2],0,0.5)),
'out': tf.Variable(tf.random.normal([n_output],0,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
。我这里做错了什么?
因为您正在通过 np.array
将 x
转换为不可微分的 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))
所以我创建了自己的神经网络,我想针对输入变量对其进行自动微分。我的神经网络代码是这样的
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,0.5)),
'h2': tf.Variable(tf.random.normal([n_hidden_1, n_hidden_2],0,0.5)),
'out': tf.Variable(tf.random.normal([n_hidden_2, n_output],0,0.5))
}
biases = {
'b1': tf.Variable(tf.random.normal([n_hidden_1],0,0.5)),
'b2': tf.Variable(tf.random.normal([n_hidden_2],0,0.5)),
'out': tf.Variable(tf.random.normal([n_output],0,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
。我这里做错了什么?
因为您正在通过 np.array
将 x
转换为不可微分的 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))