关于神经网络数据来源与自创数据
知识核心
- 我们根据特征值数量,标签值数量和训练总数可以得到y,x,然后可以推出w和b的行列数量,比如我们现在有120个训练集,鸢尾花中特征值为4,分别是花萼长,花萼宽,花瓣长,花瓣宽,标签值为3,分别是狗尾草鸢尾,杂色鸢尾,弗吉尼亚鸢尾。那么y就是(120, 3),x就是(120,4),所以w就是(4, 3), b就是(120, 3),所以最终的公式就是y = x(4,3)+(120,3)
项目情景
假设男生想要找到女朋友的特征为财富和颜值,如果财富+颜值>=1则可以找到女朋友,否则不能找到女朋友
此处表格:
| 财富 | 颜值 | 标签 |
|---|---|---|
| 0.98 | 0.53 | 1 |
| 0.48 | 0.23 | 0 |
代码
# 使用鸢尾花数据集
import tensorflow as tf
import numpy as np
once_size = 5 # 输入层的数据一次输入多少,不要过大
seed = 22 # 随便设个固定值,保证每次生成的都一样
lr = 0.2 # 每次优化loss调整的步长
epoch = 5000 # 训练次数
boys = 4500 # 4500条数据
rng = np.random.RandomState(2) # 用这个rng生成每次都一样的随机数(seed相同)
X_DATA = rng.rand(boys, 2) # 随机生成一个班级4500个学生的颜值和财富(特征值范围[0 , 1)),有现成数据更好
X_DATA = tf.cast(X_DATA, tf.float32)
# 我们定义颜值+财富对于Y值,Y值含有两列
# Y值结果为0和1出现的概率(0代表找不到女朋友,1代表能找到女朋友)
Y_DATA = [int(x1 + x2 >= 1) for (x1, x2) in X_DATA]
print(Y_DATA)
# 定义神经网络中所有可训练参数
w1 = tf.Variable(tf.random.truncated_normal([2, 2], stddev=0.1, seed=1))
b1 = tf.Variable(tf.random.truncated_normal([2], stddev=0.1, seed=1))
train_db = tf.data.Dataset.from_tensor_slices((X_DATA, Y_DATA)).batch(32)
for epoch in range(epoch):
# 下面的for迭代4次(train_db有4个元素,每个元素是一个batch)
for step, (x_train, y_train) in enumerate(train_db):
with tf.GradientTape() as tape:
y = tf.matmul(x_train, w1) + b1 # 神经网络模型
y = tf.nn.softmax(y) # 使y符合概率分布并可以和独热码对比
y_ = tf.one_hot(y_train, depth=2) # 将标签转换为独热码(3分类)
loss = tf.reduce_mean((tf.square(y_ - y))) # 损失函数
grads = tape.gradient(loss, [w1, b1]) # 让loss分别对w1和b1求偏导
w1.assign_sub(lr * grads[0]) # 更新w1(w1 = w1 - lr * w1_grad)
b1.assign_sub((lr * grads[1])) # 更新b1(b1 = b1 - lr * b1_grad)
print(f"轮数:{epoch}, loss值:{loss}")
rng = np.random.RandomState(3) # 用这个rng生成每次都一样的随机数(seed相同)
X_TEST = rng.rand(60, 2) # 随机生成一个班级4500个学生的颜值和财富(特征值范围[0 , 1)),有现成数据更好
X_TEST = tf.cast(X_TEST, tf.float32)
# 我们定义颜值+财富对于Y值,Y值含有两列
# Y值结果为0和1出现的概率(0代表找不到女朋友,1代表能找到女朋友)
Y_TEST = [int(x1 + x2 >= 1) for (x1, x2) in X_TEST]
print(Y_TEST)
test_db = tf.data.Dataset.from_tensor_slices((X_TEST, Y_TEST)).batch(32)
for x_test, y_test in test_db: # 一次性未入30ge数据集的特征到神经网络,共喂入1次
y = tf.matmul(x_test, w1) + b1 # 用求出的w1和b1根据测试集中的特征预测结果
y = tf.nn.softmax(y) # 让y符合概率分布
pred = tf.argmax(y, axis=1) # 返回y中最大值的索引, 既预测的分类
print("============================结果=================================")
print(pred) # 每个特征值预测的结果,本案例中,我们的神经网络根据30个特征预测的结果
print(y_test) # 测试集中的每个特征对应的标签, 测试集中的30个标签

浙公网安备 33010602011771号