You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在TensorFlow中为该二分类神经网络实现剩余的for循环

嘿,我来帮你搞定这个TensorFlow二分类模型的问题!先给你提个小醒:你当前代码里把权重w_1和偏置b_1定义成tf.placeholder是不对的哦——占位符是用来喂入训练数据的,而权重、偏置是模型要学习的参数,得用tf.Variable来定义。接下来我一步步帮你补全模型和训练循环:

第一步:修正变量定义,区分占位符与可训练参数

首先我们把输入数据、标签的占位符,和需要学习的权重、偏置分开定义,同时让占位符更灵活(支持任意数量的样本,不局限于8个):

import tensorflow as tf

# 你的花瓣数据集
x = [[3,1.5], [2,1], [4,1.5], [3,1], [3.5,0.5], [2,0.5], [5.5,1], [1,1]]
y = [1, 0, 1, 0, 1, 0, 1, 0]
# 把标签转换成二维数组,方便后续损失计算
y = [[label] for label in y]

# 输入特征占位符:None表示可接受任意数量的样本,2是特征维度(花长+花宽)
x_input = tf.placeholder(tf.float32, shape=[None, 2])
# 真实标签占位符:对应每个样本的二分类标签
y_true = tf.placeholder(tf.float32, shape=[None, 1])

# 可训练的权重:输入是2维,输出是1维(二分类),用随机正态分布初始化
weights = tf.Variable(tf.random_normal([2, 1], mean=0, stddev=0.1), dtype=tf.float32)
# 可训练的偏置:初始化值为0
bias = tf.Variable(tf.zeros([1]), dtype=tf.float32)
第二步:构建前向传播模型

我们用简单的单层感知机,最后通过sigmoid激活函数输出0-1之间的概率值(代表属于类别1的概率):

# 计算线性输出:输入矩阵 × 权重 + 偏置
linear_output = tf.matmul(x_input, weights) + bias
# sigmoid激活,得到预测概率
y_pred = tf.sigmoid(linear_output)
第三步:定义损失函数与优化器

二分类任务最常用的是交叉熵损失,搭配梯度下降优化器来最小化损失:

# 交叉熵损失(直接用TensorFlow内置的sigmoid交叉熵函数,数值更稳定)
loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(labels=y_true, logits=linear_output))
# 梯度下降优化器,设置学习率为0.1
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(loss)
第四步:实现训练循环

现在我们就可以写训练循环了,每一轮迭代都会更新一次模型的权重和偏置:

# 初始化所有可训练变量
init_op = tf.global_variables_initializer()

# 开启TensorFlow会话执行训练
with tf.Session() as sess:
    # 初始化变量
    sess.run(init_op)
    # 设置训练轮数
    total_epochs = 1000
    
    # 训练循环
    for epoch in range(total_epochs):
        # 喂入数据,执行优化器和损失计算
        _, current_loss = sess.run([optimizer, loss], feed_dict={
            x_input: x,
            y_true: y
        })
        
        # 每100轮打印一次损失,监控训练进度
        if (epoch + 1) % 100 == 0:
            print(f"第 {epoch+1} 轮训练,当前损失值: {current_loss:.4f}")
    
    # 训练完成后,测试模型的预测效果
    predicted_probs = sess.run(y_pred, feed_dict={x_input: x})
    # 把概率转换成0/1的标签(概率≥0.5则预测为1,否则为0)
    predicted_labels = [1 if prob >= 0.5 else 0 for prob in predicted_probs.flatten()]
    
    print("\n训练完成,预测结果对比:")
    for true_label, pred_label in zip(y, predicted_labels):
        print(f"真实标签: {true_label[0]}, 预测标签: {pred_label}")

额外说明

  1. 你原来定义的w_1形状是[2,8],这是不合适的——我们的任务是二分类,输出只需要1维,所以权重形状应该是[2,1],这样才能和输入矩阵正确相乘。
  2. 这个例子用了全批量训练(每一轮用所有8个样本更新参数),如果是大数据集,你可以改成小批量喂入数据,但对于这个小数据集来说,全批量训练足够了。

内容的提问来源于stack exchange,提问作者Himansu Odedra

火山引擎 最新活动