神经网络实现鸢尾花的分类
准备数据
数据集的读入
from sklearn import datasets
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)
np.random.seed(116)
116 是随机因子,为了让标签和特征随机的规律一致,当然设置其他数字也行,但保证代码所有的数字也跟着变。
生成训练集和测试集
# 分出训练集和测试机
x_train = x_data[:-30]
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]
分出前30做测试集,后面的当训练集。
配成(输入特征和标签的配对)
配对
# 配对
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)
将训练集特征和标签打包,每32个数据当做一步输入神经网络。(batch后的数字最好是2的倍数)
搭建网络
# 搭建网络结构
w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))
b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))
由于输入特征是四个,分类是三个,所以构建4行3列的张量。stddev作为正态分布(truncated)的标准差,seed表示的是random的随机因子(实际上这个加不加无所谓)。
参数优化
# 迭代循环,更新参数
for epoch in range(epoch): # 数据集级别的循环,每个epoch循环一次数据集
for step, (x_train, y_train) in enumerate(train_db): # batch级别的循环 ,每个step循环一个batch
with tf.GradientTape