首页 > 分享 > TensorFlow 各优化器在鸢尾花分类任务中的应用

TensorFlow 各优化器在鸢尾花分类任务中的应用

目录

1.SGD

2.SGDM

3.Adagrad

4.RMSProp

 5.Adam

优化器是引导神经网络更新参数的工具 

        :待优化参数

        :损失函数

        :学习率

更新参数的步骤:

        1.计算t时刻损失函数关于当前参数的梯度

        2.计算t时刻一阶动量和二阶动量

        3.计算t时刻下降梯度

        4.计算t+1时刻参数

        一阶动量:与梯度相关的参数

        二阶动量:与梯度平方相关的参数

1.SGD

常用的梯度下降法

import tensorflow as tf

from sklearn import datasets

from matplotlib import pyplot as plt

import numpy as np

import time

x_data = datasets.load_iris().data

y_data = datasets.load_iris().target

np.random.seed(116)

np.random.shuffle(x_data)

np.random.seed(116)

np.random.shuffle(y_data)

tf.random.set_seed(116)

x_train = x_data[:-30]

y_train = y_data[:-30]

x_test = x_data[-30:]

y_test = y_data[-30:]

x_train = tf.cast(x_train, tf.float32)

x_test = tf.cast(x_test, tf.float32)

train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)

test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))

b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))

lr = 0.1

train_loss_results = []

test_acc = []

epoch = 500

loss_all = 0

now_time = time.time()

for epoch in range(epoch):

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_ = tf.one_hot(y_train, depth=3)

loss = tf.reduce_mean(tf.square(y_ - y))

loss_all += loss.numpy()

grads = tape.gradient(loss, [w1, b1])

w1.assign_sub(lr * grads[0])

b1.assign_sub(lr * grads[1])

print("Epoch {}, loss: {}".format(epoch, loss_all / 4))

train_loss_results.append(loss_all / 4)

loss_all = 0

total_correct, total_number = 0, 0

for x_test, y_test in test_db:

y = tf.matmul(x_test, w1) + b1

y = tf.nn.softmax(y)

pred = tf.argmax(y, axis=1)

pred = tf.cast(pred, dtype=y_test.dtype)

correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)

correct = tf.reduce_sum(correct)

total_correct += int(correct)

total_number += x_test.shape[0]

acc = total_correct / total_number

test_acc.append(acc)

print("Test_acc:", acc)

print("--------------------------")

total_time = time.time() - now_time

print("total_time", total_time)

plt.title('Loss Function Curve')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.plot(train_loss_results, label="$Loss$")

plt.legend()

plt.show()

plt.title('Acc Curve')

plt.xlabel('Epoch')

plt.ylabel('Acc')

plt.plot(test_acc, label="$Accuracy$")

plt.legend()

plt.show()

2.SGDM

在SGD基础上增加一阶动量

import tensorflow as tf

from sklearn import datasets

from matplotlib import pyplot as plt

import numpy as np

import time

x_data = datasets.load_iris().data

y_data = datasets.load_iris().target

np.random.seed(116)

np.random.shuffle(x_data)

np.random.seed(116)

np.random.shuffle(y_data)

tf.random.set_seed(116)

x_train = x_data[:-30]

y_train = y_data[:-30]

x_test = x_data[-30:]

y_test = y_data[-30:]

x_train = tf.cast(x_train, tf.float32)

x_test = tf.cast(x_test, tf.float32)

train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)

test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))

b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))

lr = 0.1

train_loss_results = []

test_acc = []

epoch = 500

loss_all = 0

m_w, m_b = 0, 0

beta = 0.9

now_time = time.time()

for epoch in range(epoch):

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_ = tf.one_hot(y_train, depth=3)

loss = tf.reduce_mean(tf.square(y_ - y))

loss_all += loss.numpy()

grads = tape.gradient(loss, [w1, b1])

m_w = beta * m_w + (1 - beta) * grads[0]

m_b = beta * m_b + (1 - beta) * grads[1]

w1.assign_sub(lr * m_w)

b1.assign_sub(lr * m_b)

print("Epoch {}, loss: {}".format(epoch, loss_all / 4))

train_loss_results.append(loss_all / 4)

loss_all = 0

total_correct, total_number = 0, 0

for x_test, y_test in test_db:

y = tf.matmul(x_test, w1) + b1

y = tf.nn.softmax(y)

pred = tf.argmax(y, axis=1)

pred = tf.cast(pred, dtype=y_test.dtype)

correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)

correct = tf.reduce_sum(correct)

total_correct += int(correct)

total_number += x_test.shape[0]

acc = total_correct / total_number

test_acc.append(acc)

print("Test_acc:", acc)

print("--------------------------")

total_time = time.time() - now_time

print("total_time", total_time)

plt.title('Loss Function Curve')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.plot(train_loss_results, label="$Loss$")

plt.legend()

plt.show()

plt.title('Acc Curve')

plt.xlabel('Epoch')

plt.ylabel('Acc')

plt.plot(test_acc, label="$Accuracy$")

plt.legend()

plt.show()

3.Adagrad

在SGD基础上增加二阶动量

import tensorflow as tf

from sklearn import datasets

from matplotlib import pyplot as plt

import numpy as np

import time

x_data = datasets.load_iris().data

y_data = datasets.load_iris().target

np.random.seed(116)

np.random.shuffle(x_data)

np.random.seed(116)

np.random.shuffle(y_data)

tf.random.set_seed(116)

x_train = x_data[:-30]

y_train = y_data[:-30]

x_test = x_data[-30:]

y_test = y_data[-30:]

x_train = tf.cast(x_train, tf.float32)

x_test = tf.cast(x_test, tf.float32)

train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)

test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))

b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))

lr = 0.1

train_loss_results = []

test_acc = []

epoch = 500

loss_all = 0

v_w, v_b = 0, 0

now_time = time.time()

for epoch in range(epoch):

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_ = tf.one_hot(y_train, depth=3)

loss = tf.reduce_mean(tf.square(y_ - y))

loss_all += loss.numpy()

grads = tape.gradient(loss, [w1, b1])

v_w += tf.square(grads[0])

v_b += tf.square(grads[1])

w1.assign_sub(lr * grads[0] / tf.sqrt(v_w))

b1.assign_sub(lr * grads[1] / tf.sqrt(v_b))

print("Epoch {}, loss: {}".format(epoch, loss_all / 4))

train_loss_results.append(loss_all / 4)

loss_all = 0

total_correct, total_number = 0, 0

for x_test, y_test in test_db:

y = tf.matmul(x_test, w1) + b1

y = tf.nn.softmax(y)

pred = tf.argmax(y, axis=1)

pred = tf.cast(pred, dtype=y_test.dtype)

correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)

correct = tf.reduce_sum(correct)

total_correct += int(correct)

total_number += x_test.shape[0]

acc = total_correct / total_number

test_acc.append(acc)

print("Test_acc:", acc)

print("--------------------------")

total_time = time.time() - now_time

print("total_time", total_time)

plt.title('Loss Function Curve')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.plot(train_loss_results, label="$Loss$")

plt.legend()

plt.show()

plt.title('Acc Curve')

plt.xlabel('Epoch')

plt.ylabel('Acc')

plt.plot(test_acc, label="$Accuracy$")

plt.legend()

plt.show()

4.RMSProp

在SGD基础上增加二阶动量

import tensorflow as tf

from sklearn import datasets

from matplotlib import pyplot as plt

import numpy as np

import time

x_data = datasets.load_iris().data

y_data = datasets.load_iris().target

np.random.seed(116)

np.random.shuffle(x_data)

np.random.seed(116)

np.random.shuffle(y_data)

tf.random.set_seed(116)

x_train = x_data[:-30]

y_train = y_data[:-30]

x_test = x_data[-30:]

y_test = y_data[-30:]

x_train = tf.cast(x_train, tf.float32)

x_test = tf.cast(x_test, tf.float32)

train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)

test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))

b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))

lr = 0.1

train_loss_results = []

test_acc = []

epoch = 500

loss_all = 0

v_w, v_b = 0, 0

beta = 0.9

now_time = time.time()

for epoch in range(epoch):

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_ = tf.one_hot(y_train, depth=3)

loss = tf.reduce_mean(tf.square(y_ - y))

loss_all += loss.numpy()

grads = tape.gradient(loss, [w1, b1])

v_w = beta * v_w + (1 - beta) * tf.square(grads[0])

v_b = beta * v_b + (1 - beta) * tf.square(grads[1])

w1.assign_sub(lr * grads[0] / tf.sqrt(v_w))

b1.assign_sub(lr * grads[1] / tf.sqrt(v_b))

print("Epoch {}, loss: {}".format(epoch, loss_all / 4))

train_loss_results.append(loss_all / 4)

loss_all = 0

total_correct, total_number = 0, 0

for x_test, y_test in test_db:

y = tf.matmul(x_test, w1) + b1

y = tf.nn.softmax(y)

pred = tf.argmax(y, axis=1)

pred = tf.cast(pred, dtype=y_test.dtype)

correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)

correct = tf.reduce_sum(correct)

total_correct += int(correct)

total_number += x_test.shape[0]

acc = total_correct / total_number

test_acc.append(acc)

print("Test_acc:", acc)

print("--------------------------")

total_time = time.time() - now_time

print("total_time", total_time)

plt.title('Loss Function Curve')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.plot(train_loss_results, label="$Loss$")

plt.legend()

plt.show()

plt.title('Acc Curve')

plt.xlabel('Epoch')

plt.ylabel('Acc')

plt.plot(test_acc, label="$Accuracy$")

plt.legend()

plt.show()

 5.Adam

同时结合SGDM一阶动量和RMSProp二阶动量

import tensorflow as tf

from sklearn import datasets

from matplotlib import pyplot as plt

import numpy as np

import time

x_data = datasets.load_iris().data

y_data = datasets.load_iris().target

np.random.seed(116)

np.random.shuffle(x_data)

np.random.seed(116)

np.random.shuffle(y_data)

tf.random.set_seed(116)

x_train = x_data[:-30]

y_train = y_data[:-30]

x_test = x_data[-30:]

y_test = y_data[-30:]

x_train = tf.cast(x_train, tf.float32)

x_test = tf.cast(x_test, tf.float32)

train_db = tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(32)

test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test)).batch(32)

w1 = tf.Variable(tf.random.truncated_normal([4, 3], stddev=0.1, seed=1))

b1 = tf.Variable(tf.random.truncated_normal([3], stddev=0.1, seed=1))

lr = 0.1

train_loss_results = []

test_acc = []

epoch = 500

loss_all = 0

m_w, m_b = 0, 0

v_w, v_b = 0, 0

beta1, beta2 = 0.9, 0.999

delta_w, delta_b = 0, 0

global_step = 0

now_time = time.time()

for epoch in range(epoch):

for step, (x_train, y_train) in enumerate(train_db):

global_step += 1

with tf.GradientTape() as tape:

y = tf.matmul(x_train, w1) + b1

y = tf.nn.softmax(y)

y_ = tf.one_hot(y_train, depth=3)

loss = tf.reduce_mean(tf.square(y_ - y))

loss_all += loss.numpy()

grads = tape.gradient(loss, [w1, b1])

m_w = beta1 * m_w + (1 - beta1) * grads[0]

m_b = beta1 * m_b + (1 - beta1) * grads[1]

v_w = beta2 * v_w + (1 - beta2) * tf.square(grads[0])

v_b = beta2 * v_b + (1 - beta2) * tf.square(grads[1])

m_w_correction = m_w / (1 - tf.pow(beta1, int(global_step)))

m_b_correction = m_b / (1 - tf.pow(beta1, int(global_step)))

v_w_correction = v_w / (1 - tf.pow(beta2, int(global_step)))

v_b_correction = v_b / (1 - tf.pow(beta2, int(global_step)))

w1.assign_sub(lr * m_w_correction / tf.sqrt(v_w_correction))

b1.assign_sub(lr * m_b_correction / tf.sqrt(v_b_correction))

print("Epoch {}, loss: {}".format(epoch, loss_all / 4))

train_loss_results.append(loss_all / 4)

loss_all = 0

total_correct, total_number = 0, 0

for x_test, y_test in test_db:

y = tf.matmul(x_test, w1) + b1

y = tf.nn.softmax(y)

pred = tf.argmax(y, axis=1)

pred = tf.cast(pred, dtype=y_test.dtype)

correct = tf.cast(tf.equal(pred, y_test), dtype=tf.int32)

correct = tf.reduce_sum(correct)

total_correct += int(correct)

total_number += x_test.shape[0]

acc = total_correct / total_number

test_acc.append(acc)

print("Test_acc:", acc)

print("--------------------------")

total_time = time.time() - now_time

print("total_time", total_time)

plt.title('Loss Function Curve')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.plot(train_loss_results, label="$Loss$")

plt.legend()

plt.show()

plt.title('Acc Curve')

plt.xlabel('Epoch')

plt.ylabel('Acc')

plt.plot(test_acc, label="$Accuracy$")

plt.legend()

plt.show()

相关知识

TensorFlow使用BP神经网络实现鸢尾花分类
TensorFlow学习记录(八)
Tensorflow鸢尾花分类(数据加载与特征处理)
深度学习入门——基于TensorFlow的鸢尾花分类实现(TensorFlow
TensorFlow 2建立神经网络分类模型——以iris数据为例
教程:对鸢尾花进行分类
第3章(下)基于Softmax回归完成鸢尾花分类任务
在鸢尾花分类中感受技术“温度”
使用鸢尾花数据集构建神经网络模型
python 使用Tensorflow训练BP神经网络实现鸢尾花分类

网址: TensorFlow 各优化器在鸢尾花分类任务中的应用 https://m.huajiangbk.com/newsview1284135.html

所属分类:花卉
上一篇: 优化营商环境|临武花塘乡:人居环
下一篇: 花家红在全市优化营商环境工作推进