关于神经网络数据来源与自创数据

知识核心

  1. 我们根据特征值数量,标签值数量和训练总数可以得到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个标签




posted @ 2023-10-11 15:55  影梦无痕  阅读(26)  评论(0)    收藏  举报