该网络中只有一层线形层加一个激活函数,先用训练集训练再用测试集测试,训练60个epoch要比40个epoch效果更好
代码来源:点我
得到下面的训练结果(60个epoch)
如果是40个epoch的话:
from sklearn import datasets
import numpy as np
import tensorflow as tf
import seaborn as sns
x_data=datasets.load_iris().data
y_data=datasets.load_iris().target
np.random.seed(116)
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)
x_train=x_data[:-40]
y_train=y_data[:-40]
x_test=x_data[-40:]
y_test=y_data[-40:]
train_db=tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32)
test_db=tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(32)
w=tf.Variable(tf.random.truncated_normal([4,3],stddev=0.1,seed=1))
b=tf.Variable(tf.random.truncated_normal([3],stddev=0.1,seed=1))
print(type(w))
epoch=60
lr=0.2
loss_rec=[]
acc=[]
for epoch in range(epoch):
loss_all=0
for step,(x_train,y_train) in enumerate(train_db):
x_train=tf.cast(x_train,tf.float32)#cast不是作用函数
w=tf.cast(w,tf.float32)
b=tf.cast(b,tf.float32)
# print(w.dtype,b.dtype)
with tf.GradientTape() as tape:
tape.watch([w,b])
y=tf.matmul(x_train,w)+b
y=tf.nn.softmax(y)
y_=tf.one_hot(y_train,depth=3,dtype=tf.float32)
loss=tf.reduce_mean(tf.square(y_-y))
grads=tape.gradient(loss,[w,b])
w.assign_sub(grads[0]*lr)
b.assign_sub(grads[1]*lr)
# print(grads)
loss_all+=loss.numpy()
loss_rec.append(loss_all/4)
#print(loss_rec)
#下面进行预测
total_cor=0
total_num=0
for step,(x_test,y_test) in enumerate(test_db):
x_test=tf.cast(x_test,tf.float32)
y=tf.matmul(x_test,w)+b
y=tf.nn.softmax(y)
pre=tf.argmax(y,axis=1)
pre=tf.cast(pre,dtype=y_test.dtype)
correct=tf.cast(tf.equal(pre,y_test),dtype=tf.int32)
correct=tf.reduce_sum(correct)
total_cor+=correct.numpy()
total_num+=y_test.shape[0]
tmp=total_cor/total_num
acc.append(tmp)
print(total_cor,total_num)
# data1=pd.DataFrame(loss_rec)
# #data1.loc[:,'pl']
# sns.set_style("darkgrid")
# sns.lineplot(data=data1,ci=1 )
data1=pd.DataFrame(acc)
#data1.loc[:,'pl']
sns.lineplot(data=data1,ci=1 )