tensorflow自己实现SGD功能

手动实现SGD和调用优化器结果比较

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
#mnist已经作为官方的例子,做好了数据下载,分割,转浮点等一系列工作,源码在tensorflow源码中都可以找到
mnist = input_data.read_data_sets('MNIST_data', one_hot=True)

# 配置每个 GPU 上占用的内存的比例
# 没有GPU直接sess = tf.Session()
gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.95)
sess = tf.Session(config=tf.ConfigProto(gpu_options=gpu_options))

#每个批次的大小
batch_size = 20
#定义训练轮数据
train_epoch = 1
#定义每n轮输出一次
test_epoch_n = 1

#计算一共有多少批次
n_batch = mnist.train.num_examples // batch_size
print("batch_size="+str(batch_size)+"n_batch="+str(n_batch))

#占位符,定义了输入,输出
x = tf.placeholder(tf.float32,[None, 784]) 
y_ = tf.placeholder(tf.float32,[None, 10]) 
#权重和偏置,使用0初始化
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))

#权重和偏置,使用0初始化
W2 = tf.Variable(tf.zeros([784,10]))
b2 = tf.Variable(tf.zeros([10]))

#这里定义的网络结构
y = tf.matmul(x,W) + b
#损失函数是交叉熵
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_,logits=y))

lr = 0.01#学习率
gw,gb = tf.gradients(ys=cross_entropy, xs=[W,b])
wt = W - lr * gw
bt = b - lr * gb
updatew = tf.assign(W,wt)
updateb = tf.assign(b,bt)

#这里定义的网络结构
y2 = tf.matmul(x,W2) + b2
#损失函数是交叉熵
cross_entropy2 = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=y_,logits=y2))
#训练方法:
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy2)

#初始化sess中所有变量
init = tf.global_variables_initializer() 
sess.run(init) 
batch_xs, batch_ys = mnist.train.next_batch(batch_size)

#输出手动SGD后的b值
for _ in range(2):
    _,_,testsee1,testsee2 = sess.run([updatew,updateb,cross_entropy,b], feed_dict = {x: batch_xs, y_: batch_ys})
    print(testsee1)
    print(testsee2)

#输出优化器后的b值
for _ in range(2):
    _,testsee1,testsee2 = sess.run([train_step,cross_entropy2,b2], feed_dict = {x: batch_xs, y_: batch_ys})
    print(testsee1)
    print(testsee2)

输出结果:

2.30259
[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
2.26225
[ -5.00000024e-04   9.99999931e-04  -5.00000082e-04  -5.00000024e-04
  -1.02445483e-10   4.99999849e-04  -1.00000005e-03  -6.51925805e-11
  -2.79396766e-11   9.99999931e-04]

loss 和b值均一致,说明自己更新网络参数和优化器自动更新一致

此代码网络初始化均为0,mnist也是固定的数据,所以应该必定能复现上面的输出结果。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow 2 是一个功能强大的机器学习框架,它提供了丰富的工具和库用于实现各种任务,其中包括回归问题。 回归是一种机器学习任务,旨在预测连续数值型目标变量的值。在 TensorFlow 2 中,回归问题可以通过构建和训练神经网络模型来解决。以下是实现回归问题的一般步骤: 1. 数据准备:首先,需要准备训练数据,包括输入特征和对应的目标变量。可以使用 Pandas 库加载和处理数据,确保数据格式符合神经网络模型的要求。 2. 构建模型:使用 TensorFlow 2 的高级 API(例如 tf.keras)构建神经网络模型。可以选择不同的层类型,如全连接层、卷积层和循环层,来构建模型的结构。还可以根据需要加入正则化和激活函数等操作。 3. 编译模型:在训练之前,需要编译模型,选择适当的优化器、损失函数和评估指标。常用的优化器包括 Adam、SGD 和 RMSprop。回归问题通常使用均方误差(Mean Squared Error)作为损失函数。 4. 训练模型:使用训练数据对模型进行训练。可以使用 fit() 方法指定训练数据、批大小和训练周期数等参数。在每个训练周期结束后,模型会进行权重更新,逐渐优化模型的性能。 5. 模型评估:使用验证数据对训练后的模型进行评估。可以使用 evaluate() 方法计算模型在验证数据上的损失和准确率等指标,以评估模型的性能。 6. 预测结果:使用训练好的模型对新数据进行预测。可以使用 predict() 方法来获取模型对输入数据的预测结果。 总之,TensorFlow 2 提供了丰富的功能和工具,使得回归问题的实现变得更加简单和高效。通过合理的数据准备、模型构建和训练,我们可以使用 TensorFlow 2 轻松解决各种回归问题。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值