TensorFlow实战——实现神经网络

TensorFlow实现神经网络

分类问题解决思路

使用神经网络解决分类问题主要可以分为以下四个步骤:
1. 提取问题中实体的特征向量作为神经网络的输入。
2. 定义神经网络的结构,并定义如何从神经网络的输入得到输出。即前向传播算法。
3. 通过训练数据来调整神经网络中参数的取值,即训练神经网络。
4. 使用训练好的神经网络来预测未知的数据。

前向传播算法的实现

x为输入数据,w1为从输入层到隐藏层的参数矩阵,w2为从隐藏层到输出层的参数矩阵,则前向传播过程代码为

a = tf.matmul(x, w1)
b = tf.matmul(a, w2)

其中tf.matmul实现了矩阵乘法的功能。

TensorFlow变量

在TensorFlow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数。
声明一个2*3的矩阵变量的方法

weights = tf.Variable(tf.random_normal([2,3], stddev=2))

TensorFlow中变量的初始值可以设置成随机数、常数或者是通过其他变量的初始值计算得到。

对于变量,初始化是非常重要的。虽然在变量定义的时候给出了变量初始化的方法,但是这个方法并没有被真正运行,需要通过variable_name.initializer来给变量赋值。

TensorFlow提供了一种更加便捷的方式来完成变量初始化过程。

init_op = tf.initialize_all_variables()
sess.run(init_op)

通过tf.initialize_all_variables函数就不需要将变量一个一个初始化了。

集合的概念
TensorFlow中有集合的概念。比如,所有的变量都会被自动的加入到GraphKeys.VARIABLES这个集合。通过tf.all_variables函数可以拿到当前计算图上所有的变量。
在构建机器学习模型的时候,比如神经网络,可以通过变量声明函数中的trainable参数来区分需要优化的参数(比如神经网络中通过反向传播优化的参数)和其他参数(比如迭代的轮数)。如果trainable参数为True,那么这个变量将会加入GraphKeys.TRAINABLE_VARIABLES集合。TensorFlow中可以通过tf.trainable_variables函数得到所有需要优化的参数。TensorFlow中提供的神经网络优化算法会将GraphKeys.TRAINABLE_VARIABLES中的变量作为默认的优化对象。

变量的类型是不可变的,但和类型不一样的是,维度在程序运行中是有可能改变的,但是需要通过设置参数validate_shape=False

w1 = tf.Variable(tf.random_normal([2, 3], stddev=1), name="w1")
w2 = tf.Variable(tf.random_normal([2, 2], stddev=1), name="w2")

tf.assign(w1, w2)#不成功,报维度不匹配错误
tf.assign(w1, w2, validate_shape=False)#成功执行并且改变了w1的维度

通过TensorFlow训练神经网络模型

反向传播算法的第一步是使用TensorFlow表达一个batch的数据

x = tf.constant([[0.7,0.9]])

但如果每轮迭代中选取的数据都通过常量表示,那么计算图太大。TensorFlow提供了placeholder机制用于提供输入数据。

placeholder相当于定义了一个位置,这个位置中的数据在程序运行时再指定。

这样在程序中就不需要生成大量常量来提供输入数据,而只需要将数据通过placeholder传入TensorFlow计算图。
placeholder的类型也不可以改变。在实践中,placeholder可以用来保存输入层的训练集中的不同样例。

import tensorflow as tf

w1 = tf.Variable(tf.random_normal([2, 3], stddev=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1))
#定义placeholder存放输入数据,维度不一定要定义可以用None表示,也可以用确定的维度
x = tf.placeholder(tf.float32, shape=(1,2), name="input")
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

sess = tf.Session()
init_op = tf.initialize_all_variables()
sess.run(init_op)

print(sess.run(y, feed_dict={x: [[0.7, 0.9]]}))#只计算一个样例的前向传播结果
#feed_dict参数用字典的方式对placeholder的参数进行赋值,这样可以在每次运行时赋予不同的值。

在新的程序中计算前向传播的结果时,需要提供一个feed_dict来指定x的取值。feed_dict是一个字典,在字典中需要给出每个用到的placeholder的取值。

损失函数

在得到一个batch的前向传播结果之后,需要定义一个损失函数来刻画当前的预测值和真实答案之间的差距。然后通过反向传播算法来调整神经网络参数的取值使得差距可以被缩小。

#用损失函数刻画预测值与真实值的差距
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))
#定义学习率
learning_rate = 0.001
#定义反向传播算法来优化神经网络中的参数
train_step = tf.train.AdamOptimizer(learing_rate).minimize(cross_entropy)

cross_entropy定义了真实值与预测值之间的交叉熵,这是分类问题中一个常用的损失函数。关于该值的详细解释参见下一节。

完整的神经网络样例程序

下列程序在一个模拟数据集上训练神经网络,解决二分类问题。

import tensorflow as tf
from numpy.random import RandomState

batch_size = 8

w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')

a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0)))
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)
#随机数生成模拟数据集
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
#定义规则给出样本标签。所有x1+x2<1的样例都被认为是正样本,而其他为负样本。
Y = [[int(x1+x2<1)] for (x1,x2) in X]

with tf.Session() as sess:
    init_op = tf.initialize_all_variables()
    sess.run(init_op)
    print sess.run(w1)
    print sess.run(w2)#训练之前神经网络参数的值打印出来
    STEPS = 5000
    for i in range(STEPS):
        start = (i * batch_size) % dataset_size
        end = min(start+batch_size, dataset_size)   
        sess.run(train_step, feed_dict = {x: X[start:end], y_: Y[start:end]}}
        if i % 1000 == 0:
            total_cross_entropy = sess.run(cross_entropy, feed_dict={x: X, y_: Y})
            print("After %d training step(s), cross entropy on all data is %g" % (i, total_cross_entropy))
    print sess.run(w1)
    print sess.run(w2)

总结,神经网络训练的过程可以分为以下三个步骤:
1. 定义神经网络的结构和前向传播的输出结果
2. 定义损失函数以及选择反向传播优化的算法
3. 生成会话(tf.Session)并且在训练数据上反复运行反向传播优化算法

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow是一个被广泛应用于机器学习和深度学习的开源框架,它提供了丰富的工具和库来构建和训练神经网络模型。其中,CNN(卷积神经网络)是一种特别适用于图像处理任务的神经网络结构,而VGGNet19是其中一个经典的CNN模型。 在进行图像风格转化任务时,我们可以利用VGGNet19来实现。图像风格转化是一种将一张图像的内容与另一张图像的风格相结合的技术,常用于艺术创作和图像处理领域。在这个实战项目中,我们可以使用Jupyter Notebook来编写并运行我们的代码。 首先,我们需要准备两张输入图片,一张作为内容图像,一张作为风格图像。然后,我们可以使用VGGNet19模型来提取内容图像和风格图像的特征表示。接着,我们需要定义一个损失函数,该损失函数可以度量内容图像与生成图像之间的内容差异,以及风格图像与生成图像之间的风格差异。最后,我们可以使用梯度下降等优化算法来最小化损失函数,从而生成新的图像,使得它既保留了内容图像的内容特征,又融合了风格图像的风格特征。 在Jupyter Notebook中,我们可以逐步编写和调试这些代码,并及时查看生成的图像效果。通过这个实战项目,我们不仅能够深入理解CNN模型和图像风格转化的原理,还能够掌握如何使用TensorFlow和Jupyter Notebook进行实际的深度学习任务。这将为我们在图像处理和艺术创作领域带来更多的应用和创新可能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值