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)
b21.assign_sub(grad[5]*lr2)
b31.assign_sub(grad[6]*lr3)
b41.assign_sub(grad[7]*lr4)
# **************打印损失和预测损失**********************
if eporch%10==0:
test_loss.append(TestLoss)
print("第{}次迭代后的损失率为{}".format(eporch,loss))
print("第{}次迭代后的测试集损失率为{}".format(eporch,TestLoss))
代码运行后结果如下:
ypeError Traceback (most recent call last) <ipython-input-155-e49210c91f1f> in <module> 58 grad=tp.gradient(loss,[w11,w21,w31,w41,b11,b21,b31,b41]) 59 # **************更新参数********************** ---> 60 w11.assign_sub(grad[0]*lr1) 61 w21.assign_sub(grad[1]*lr2) 62 w31.assign_sub(grad[2]*lr3) TypeError: unsupported operand type(s) for *: 'NoneType' and 'float'
显示打印grad后,显示为
[None, None, None, None, None, None, None, None]
请问为什么梯度为空,没信息
建议先检查一下数据读入是否没有问题,有时候读不到东西比较麻烦,其次报错的问题是格式不对,建议print(type())反向检查一下
查到原因了,用tf.gradient 计算梯度值,需要把所有函数写在with 语句下面