问题描述
所以我创建了自己的神经网络,我想根据输入变量对它进行自动微分。我的神经网络代码是这样的
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
。我在这里做错了什么?
解决方法
因为您正在通过不可微分的 x
将 np.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))