Press "Enter" to skip to content

神经网络中的分类器该如何改成生成器?

作者 | 李秋键

责编 | 刘静

出品 | CSDN(ID:CSDNnews)

 

引言:   相信我们都做过一些图片分类或者是其他分类的项目,我们知道神经网络是在w和b参数调节基础上,使得x与y达到对应输出的效果。 比如最经典的Mnist手写字体识别,给一张图片模型判断后将会输出数字结果,比如这样:

 

 

我们知道大多数生成网络是用的GAN算法,显然他有他自己的优势,

 

通过对目的的改进,可以变更机率分解建模的变量,使随机变量与具体数据分布尽量相似。 在现代的分解建模中的,一般使用统计数据的似然作为改进目的,而GAN创新地用于了另一个改进目的。

 

首先,引进判断建模(常见建模还包括反对矢量机和多层人工神经网络)。

 

其次,其改进步骤是在分解建模和判断建模两者之间寻找沃克平衡。

 

GAN创建的自学构建实质上是分解建模和判断建模两者之间的仿真博弈论。

 

分解建模的目标是尽量多地仿真、仿真和自学现实统计数据的产于规律性。

 

判断建模是辨别一个输出统计数据是来自现实的数据分布还是分解的建模。

 

通过这两个外部建模两者之间的停滞市场竞争,提升了分解和区别这两个建模的战斗能力。 如果分解的建模统计数据依然不存在误解,无法准确辨别,那幺我们指出分解的建模实质上早已理解了现实统计数据的状况。

 

与其它算法比起,GAN能制造出有更加明晰、现实的样本

 

下面我们将对我们的项目进行演示讲解

 

通过程序调试可以知道,它的输入端是x,为多行784列的矩阵,而输出端是多行10列的矩阵为onehot编码形式,即[0,0,0,1,0,0,0,0,0,0]这种形式。

 

那幺我们不妨设想,如果把x换成[0,0,0,1,0,0,0,0,0,0]形式,而输出端换成多行784列的矩阵又将如何呢,下面我们将对其进行修改演示。

 

首先导入相关的库:

 

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
#构建TensorFlow模型
import tensorflow as tf
import sys
import numpy as np
from matplotlib import pyplot as plt
from tensorflow.examples.tutorials.mnist import input_data

 

读入数据:

 

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
print(mnist)

 

下面是定义变量和占位符,注意看我的修改:

 

x = tf.placeholder("float", [None, 10])#占位符
W = tf.Variable(tf.zeros([10,784]))#赋值变量,生成784*10的矩阵,内容全为零
b = tf.Variable(tf.zeros([784]))#同上理
y = tf.nn.softmax(tf.matmul(x,W) + b)#将x*W+b公式计算的结果借助softmax激活函数分类
y_ = tf.placeholder("float", [None,784])#占位符,生成10列的矩阵,行数自适应

 

很显然在上面我们把x输入改成了[0,0,0,1,0,0,0,0,0,0]形式,而y则是多行784列的矩阵,为了满足矩阵相乘的条件,把w和b也对应互换。

 

下面我们就用最简单的算法进行实现,因为我们只是在试探生成器的原理,至于是用神经网络算法还是卷积等等最后按照自己需求修改即可。

 

分别定义短时函数,优化器梯度下降,以及会话训练的准备。

 

cross_entropy = -tf.reduce_sum(y_*tf.log(y))#定义损失函数为y*logy的算术平均值
train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)#梯度下降法减少损失函数的值,优化模型
init = tf.initialize_all_variables()#模型初始化。即所有参数初始为0
sess = tf.Session()#模型初始化会话
sess.run(init)#准备训练
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))#定义预测准确数,通过对比y真实值和y_预测值的相等的数量
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))#定义准确率为准确率的均方差

 

然后训练1000次:

 

for i in range(1000):#训练1000次
  if i % 20 == 0:#每20次向控制台输出结果
    sys.stdout.write('.')
  batch_xs, batch_ys = mnist.train.next_batch(100)#训练批次为100次
  sess.run(train_step, feed_dict={y_: batch_xs, x: batch_ys})#建立训练
  ttt=str(sess.run(accuracy, feed_dict={y_: batch_xs, x: batch_ys}))
  print("训练第"+str(i)+"次的准确率为"+ttt)

 

输出下最终得到的结果,看生成的图片效果怎幺样:

 

print (sess.run(accuracy, feed_dict={y_: mnist.test.images, x: mnist.test.labels}))#测试输出预测结果
'''显示图片预测'''
x=np.array([[0,1,0,0,0,0,0,0,0,0]])
x=tf.cast(x,tf.float32)
plt.figure()
y=tf.nn.softmax(tf.matmul(x,W) + b)
y=y.eval(session=sess)
print(y)
y=np.reshape(y,[28,28])
plt.imshow(y)
plt.show()

 

仅仅是5秒的时间,我们便训练了1000次生成了图片,因为是最简单的线性训练,测试的是生成数字1的图片

 

效果如下图所示:

 

 

很显然我们5秒生成的图片效果还不错,还是挺接近1的。 如果你想要更多的效果可以修改生成其他图片。 我们这个项目最简单的讲解了生成器和判别器的互换,让更多的人不必研究那些深奥的算法即可实现生成图片。 那幺下面我们将生成器做更深的了解。

 

市面上大多数生成图片是用的GAN算法,即生成对抗神经网络,很显然我们用了如此简单的算法也可以实现生成图片的效果。 但是不可忽略的是GAN的效果会更好些,但是难度较大。 那幺我们将对其中的GAN做个简单的介绍。

 

GAN主要的启发可能是零和的游戏在概率论观念,运用于浅自学人工神经网络,是通过生成器和判断器(鉴频器)网络游戏,从而使S自学数据分布,如果用在影像分解军事训练已完成后,S可以从一个哈希分解细致的影像。

 

G和D的主要基本功能是:

 

G是一个生成网,它接管一个随机噪声y(哈希),通过杂讯分解影像。

 

D是一个辨别影像否“现实”的网。 它的输出变量是f, f推选一张照片,输入E (f)推选f是一张现实照片的机率。 如果是1,推选100%现实的影像,如果是0,推选不有可能的影像。

 

在军事训练步骤中的,分解互联网S的目的是分解尽量多的现实影像来愚弄互联网E,而E的目的是企图将S分解的骗影像与现实影像区别。 这样,S和E包含一个静态的“博弈论步骤”,最后的均衡点为沃克均衡点。

 

通过对目的的改进,可以变更机率分解建模的变量,使随机变量与具体数据分布尽量相似。

 

那幺,如何界定必要的改进目的或伤亡呢?

 

在现代的分解建模中的,一般使用统计数据的似然作为改进目的,而GAN创新地用于了另一个改进目的。

 

首先,引进判断建模(常见建模还包括反对矢量机和多层人工神经网络)。

 

其次,其改进步骤是在分解建模和判断建模两者之间寻找沃克平衡。

 

GAN创建的自学构建实质上是分解建模和判断建模两者之间的仿真博弈论。

 

分解建模的目标是尽量多地仿真、仿真和自学现实统计数据的产于规律性。

 

判断建模是辨别一个输出统计数据是来自现实的数据分布还是分解的建模。

 

通过这两个外部建模两者之间的停滞市场竞争,提升了分解和区别这两个建模的战斗能力。

 

当一个建模具备极强的区别战斗能力时。

 

如果分解的建模统计数据依然不存在误解,无法准确辨别,那幺我们指出分解的建模实质上早已理解了现实统计数据的产于状况。

 

作者简介: 李秋键,CSDN 博客专家,CSDN达人课作者。

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注