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