• Python深度学习实战-基于tensorflow原生代码搭建BP神经网络实现分类任务(附源码和实现效果)


    一、实现功能

            前面两篇文章分别介绍了两种搭建神经网络模型的方法,一种是基于tensorflow的keras框架,另一种是继承父类自定义class类,本篇文章将编写原生代码搭建BP神经网络。

    二、实现代码

    1. import tensorflow as tf
    2. from sklearn.datasets import load_iris
    3. from sklearn.model_selection import train_test_split
    4. from sklearn.preprocessing import StandardScaler
    5. # 加载鸢尾花数据集
    6. iris = load_iris()
    7. X = iris.data
    8. y = iris.target
    9. # 数据预处理
    10. scaler = StandardScaler()
    11. X = scaler.fit_transform(X)
    12. # 划分训练集和测试集
    13. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    14. # 设置超参数
    15. learning_rate = 0.001
    16. num_epochs = 100
    17. batch_size = 32
    18. # 定义输入和输出的维度
    19. input_dim = X.shape[1]
    20. output_dim = len(set(y))
    21. # 定义权重和偏置项
    22. W1 = tf.Variable(tf.random.normal(shape=(input_dim, 64), dtype=tf.float64))
    23. b1 = tf.Variable(tf.zeros(shape=(64,), dtype=tf.float64))
    24. W2 = tf.Variable(tf.random.normal(shape=(64, 64), dtype=tf.float64))
    25. b2 = tf.Variable(tf.zeros(shape=(64,), dtype=tf.float64))
    26. W3 = tf.Variable(tf.random.normal(shape=(64, output_dim), dtype=tf.float64))
    27. b3 = tf.Variable(tf.zeros(shape=(output_dim,), dtype=tf.float64))
    28. # 定义前向传播函数
    29. def forward_pass(X):
    30. X = tf.cast(X, tf.float64)
    31. h1 = tf.nn.relu(tf.matmul(X, W1) + b1)
    32. h2 = tf.nn.relu(tf.matmul(h1, W2) + b2)
    33. logits = tf.matmul(h2, W3) + b3
    34. return logits
    35. # 定义损失函数
    36. def loss_fn(logits, labels):
    37. return tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits))
    38. # 定义优化器
    39. optimizer = tf.optimizers.Adam(learning_rate)
    40. # 定义准确率指标
    41. accuracy_metric = tf.metrics.SparseCategoricalAccuracy()
    42. # 定义训练步骤
    43. def train_step(inputs, labels):
    44. with tf.GradientTape() as tape:
    45. logits = forward_pass(inputs)
    46. loss_value = loss_fn(logits, labels)
    47. gradients = tape.gradient(loss_value, [W1, b1, W2, b2, W3, b3])
    48. optimizer.apply_gradients(zip(gradients, [W1, b1, W2, b2, W3, b3]))
    49. accuracy_metric(labels, logits)
    50. return loss_value
    51. # 进行训练
    52. for epoch in range(num_epochs):
    53. epoch_loss = 0.0
    54. accuracy_metric.reset_states()
    55. for batch_start in range(0, len(X_train), batch_size):
    56. batch_end = batch_start + batch_size
    57. batch_X = X_train[batch_start:batch_end]
    58. batch_y = y_train[batch_start:batch_end]
    59. loss = train_step(batch_X, batch_y)
    60. epoch_loss += loss
    61. train_loss = epoch_loss / (len(X_train) // batch_size)
    62. train_accuracy = accuracy_metric.result()
    63. print(f"Epoch {epoch+1}/{num_epochs}, Loss: {train_loss:.4f}, Accuracy: {train_accuracy:.4f}")
    64. # 进行评估
    65. logits = forward_pass(X_test)
    66. test_loss = loss_fn(logits, y_test)
    67. test_accuracy = accuracy_metric(y_test, logits)
    68. print(f"Test Loss: {test_loss:.4f}, Test Accuracy: {test_accuracy:.4f}")

    三、实现效果

    本人读研期间发表5篇SCI数据挖掘相关论文,现在某研究院从事数据挖掘相关科研工作,对数据挖掘有一定认知和理解,会结合自身科研实践经历不定期分享关于python、机器学习、深度学习基础知识与案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。关注底部公众号:数据杂坛,即可在后台联系我获取相关数据集和源码,送有关数据分析、数据挖掘、机器学习、深度学习相关的电子书籍。

  • 相关阅读:
    如何用一个插件解决 Serverless 灰度发布难题?
    SEAL 0.3 正式发布:国内首个全链路软件供应链安全管理平台
    Sqoop环境搭建
    Flutter本地化存储介绍与使用
    docker 安装 Jenkins
    JavaWeb 项目 --- 博客系统(前后分离)
    力扣算法题:34、在排序数组中查找元素的第一个和最后一个位置.java版
    Docker容器监控CAdvisor+InfluxDB+Granfana(重量级监控系统)
    爬取某网站计算机类图书
    揭示预处理中的秘密!(二)
  • 原文地址:https://blog.csdn.net/sinat_41858359/article/details/134060088