简单反向传播训练实例

import tensorflow as tf
from tensorflow import keras
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

w1 = tf.Variable(tf.random.truncated_normal([784, 256], stddev=0.1))
w2 = tf.Variable(tf.random.truncated_normal([256, 128], stddev=0.1))
w3 = tf.Variable(tf.random.truncated_normal([128, 10], stddev=0.1))

b1 = tf.Variable(tf.zeros([256]))
b2 = tf.Variable(tf.zeros([128]))
b3 = tf.Variable(tf.zeros([10]))

(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = tf.convert_to_tensor(x_train, dtype=tf.float32)/255. #转化为张量
y_train = tf.convert_to_tensor(y_train, dtype=tf.int32)
x_train = tf.reshape(x_train, [-1, 28*28])
#一次前项计算
#[60000, 256] @ [256, 128] + [128]
net1 = x_train@w1 + tf.broadcast_to(b1, [x_train.shape[0], 256])#可以直接加b1
out1 = tf.nn.relu(net1)
net2 = out1@w2 + b2
out2 = tf.nn.relu(net2)
out3 = out2@w3 + b3
out3 = tf.nn.softmax(out3)

y_train = tf.one_hot(y_train, depth=10)
loss = tf.nn.softmax_cross_entropy_with_logits(labels=y_train, logits=out3)#交叉熵
loss = tf.reduce_mean(loss)

#反向传播
with tf.GradientTape() as tape:
    tape.watch([w1, b1, w2, b2, w3, b3])
    out3 = tf.nn.softmax(tf.nn.relu(tf.nn.relu(x_train@w1 + b1)@w2 + b2)@w3 + b3)
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_train, logits=out3))
grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])

#更新参数
# w = w - lr * grads
lr = 0.01
All_loss = []
for step in range(1001):
    with tf.GradientTape() as tape:
        tape.watch([w1, b1, w2, b2, w3, b3])
        out3 = tf.nn.softmax(tf.nn.relu(tf.nn.relu(x_train @ w1 + b1) @ w2 + b2) @ w3 + b3)
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_train, logits=out3))
    All_loss.append(loss)
    grads = tape.gradient(loss, [w1, b1, w2, b2, w3, b3])
    #更新参数
    w1.assign_sub(lr*grads[0])
    b1.assign_sub(lr*grads[1])
    w2.assign_sub(lr*grads[2])
    b2.assign_sub(lr*grads[3])
    w3.assign_sub(lr*grads[4])
    b3.assign_sub(lr*grads[5])
    if step % 100 == 0:
        print(step, 'loss:', float(loss))
plt.plot(All_loss)
plt.show()

#测试模型
x_test = tf.convert_to_tensor(x_test, dtype=tf.float32)/255.
y_test = tf.convert_to_tensor(y_test, dtype=tf.int32)
x_test = tf.reshape(x_test, [-1, 28*28])
out3 = tf.nn.softmax(tf.nn.relu(tf.nn.relu(x_test@w1 + b1)@w2 + b2)@w3 + b3)
y_predict = tf.math.argmax(out3, axis=-1)
y_test = tf.cast(y_test, tf.int64)
y_c = tf.math.equal(y_predict, y_test)
y_c = tf.cast(y_c, tf.int64)
r = tf.math.reduce_sum(y_c)/10000
print(r)

输出:

0 loss: 2.2990057468414307
100 loss: 2.274552583694458
200 loss: 2.254326581954956
300 loss: 2.235755443572998
400 loss: 2.214735269546509
500 loss: 2.1878538131713867
600 loss: 2.1503565311431885
700 loss: 2.100029230117798
800 loss: 2.043839693069458
900 loss: 1.9901422262191772
1000 loss: 1.9435820579528809
tf.Tensor(0.6674, shape=(), dtype=float64)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的 MATLAB 示例,演示如何使用反向传播网络来逼近一个非线性函数。 首先,我们定义要逼近的函数。在本例中,我们将使用以下函数: ``` y = sin(x) + 0.1 * randn(size(x)); ``` 其中,`y` 是输出,`x` 是输入,`randn` 是 MATLAB 内置的随机数生成函数,用于添加一些噪声到函数中。 接下来,我们创建训练集和测试集。我们将使用前 70% 的数据作为训练集,后 30% 的数据作为测试集。 ```matlab x = linspace(0, 4*pi, 1000); y = sin(x) + 0.1 * randn(size(x)); train_ratio = 0.7; train_size = round(train_ratio * length(x)); x_train = x(1:train_size)'; y_train = y(1:train_size)'; x_test = x(train_size+1:end)'; y_test = y(train_size+1:end)'; ``` 接下来,我们创建反向传播神经网络,使用 `feedforwardnet` 函数。我们将使用一个具有 10 个隐层神经元的网络,使用 `trainlm` 算法进行训练。 ```matlab net = feedforwardnet(10, 'trainlm'); net = train(net, x_train, y_train); ``` 最后,我们可以使用训练好的网络来进行预测。我们将使用测试集来评估网络的性能。 ```matlab y_pred = net(x_test)'; mse = mean((y_test - y_pred).^2); fprintf('MSE: %f\n', mse); plot(x_test, y_test, 'b', x_test, y_pred, 'r'); legend('True', 'Predicted'); ``` 输出结果为: ``` MSE: 0.008247 ``` 同时,还会绘制出真实值和预测值的图像。 这个例子说明了如何使用反向传播神经网络来逼近任意函数。需要注意的是,这只是一个简单的例子,实际应用中需要根据具体情况选择合适的网络结构、算法和参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值