反向传播,梯度无法计算

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import load_boston
import tensorflow as tf
x=load_boston()
x_data=x.data
y_data=x.target
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(x_data,y_data,shuffle=True,random_state=1,test_size=0.3)
x_train,x_test,y_train,y_test=tf.cast(x_train,dtype=tf.float32),tf.cast(x_test,dtype=tf.float32),tf.cast(y_train,dtype=tf.float32),tf.cast(y_test,dtype=tf.float32)
# *************************以下为初始化参数******************************************
w11=tf.Variable(tf.random.normal([13,20],mean=1,stddev=1,dtype=tf.float32,seed=2020))
b11=tf.Variable(tf.random.normal([20],mean=1,stddev=1,dtype=tf.float32,seed=2020))
w21=tf.Variable(tf.random.normal([20,20],mean=1,stddev=1,dtype=tf.float32,seed=2021))
b21=tf.Variable(tf.random.normal([20],mean=1,stddev=1,dtype=tf.float32,seed=2021))
w31=tf.Variable(tf.random.normal([20,20],mean=1,stddev=1,dtype=tf.float32,seed=2023))
b31=tf.Variable(tf.random.normal([20],mean=1,stddev=1,dtype=tf.float32,seed=2023))
w41=tf.Variable(tf.random.normal([20,1],mean=1,stddev=1,dtype=tf.float32,seed=2024))
b41=tf.Variable(tf.random.normal([1],mean=1,stddev=1,dtype=tf.float32,seed=2024))
# *************************以下设定超参数******************************************
lr1=0.2
lr2=0.2
lr3=0.3
lr4=0.2
eporch=500
test_loss=[]
train_loss=[]
# *******************************循环开始****************
for eporch in range(eporch):
# **************输入层和relu激活函数***********************
    y_1=tf.matmul(x_train,w11)+b11
    r1=tf.nn.relu(y_1)
# **************隐含1层和relu激活函数***********************
    y_2=tf.matmul(r1,w21)+b21
    r2=tf.nn.relu(y_2)
# **************隐含2层和relu激活函数***********************
    y_3=tf.matmul(r2,w31)+b31
    r3=tf.nn.relu(y_3)
# **************输出层***********************
    y_4=tf.matmul(r3,w41)+b41
# **************把输出结果的维数改为和标签数据维数一致********************** 
    y_4=tf.constant(y_4,shape=[y_4.shape[0]])
# **************计算测试集上的预测值********************** 
    y_1_t=tf.matmul(x_test,w11)+b11
    r1_t=tf.nn.relu(y_1_t)
    y_2_t=tf.matmul(r1_t,w21)+b21
    r2_t=tf.nn.relu(y_2_t)
    y_3_t=tf.matmul(r2_t,w31)+b31
    r3_t=tf.nn.relu(y_3_t)
    y_4_t=tf.matmul(r3_t,w41)+b41
    y_4_t=tf.constant(y_4_t,shape=[y_4_t.shape[0]])
# **************计算均方误差**********************     
    TestLoss=tf.losses.mean_squared_error(y_test,y_4_t)
# **************计算梯度**********************  
    with tf.GradientTape() as tp:
        loss=tf.losses.mean_squared_error(y_train,y_4)
        grad=tp.gradient(loss,[w11,w21,w31,w41,b11,b21,b31,b41])
# **************更新参数**********************  
        w11.assign_sub(grad[0]*lr1)
        w21.assign_sub(grad[1]*lr2)
        w31.assign_sub(grad[2]*lr3)
        w41.assign_sub(grad[3]*lr4)
        b11.assign_sub(grad[4]*lr1)
        b11.assign_sub(grad[5]*lr2)
        b11.assign_sub(grad[6]*lr3)
        b11.assign_sub(grad[7]*lr4)
# **************打印损失和预测损失**********************  
    if eporch%10==0:
        test_loss.append(TestLoss)
        print("第{}次迭代后的损失率为{}".format(eporch,loss))
        print("第{}次迭代后的测试集损失率为{}".format(eporch,TestLoss))

        

在计算梯度是,显示计算值为None