Sigmoid函数

当神经元的输出接近 1时,曲线变得相当平,即σ′(z)的值会很小,进而也就使∂C/∂w∂C/∂b会非常小。造成学习缓慢,下面有一个二次代价函数的cost变化图,epoch从15到50变化很小。

引入交叉熵代价函数

针对上述问题,希望对输出层选择一个不包含sigmoid的权值更新,使得

由链式法则,得到

由σ′(z) = σ(z)(1− σ(z))以及σ(z)=a,可以将上式转换成

对方程进行关于a的积分,可得

对样本进行平均之后就是下面的交叉熵代价函数

对比之前的输出层delta,相当于去掉了前面的

相应的代码仅改动了一行(58->59),新的cost变化图如下。

在训练和测试数据各5000个时,识别正确数从4347稍提高到4476。

 # coding:utf8
import cPickle
import numpy as np
import matplotlib.pyplot as plt class Network(object):
def __init__(self, sizes):
self.num_layers = len(sizes)
self.sizes = sizes
self.biases = [np.random.randn(y, 1) for y in sizes[1:]] # L(n-1)->L(n)
self.weights = [np.random.randn(y, x)
for x, y in zip(sizes[:-1], sizes[1:])] def feedforward(self, a):
for b_, w_ in zip(self.biases, self.weights):
a = self.sigmoid(np.dot(w_, a)+b_)
return a def SGD(self, training_data, test_data,epochs, mini_batch_size, eta):
n_test = len(test_data)
n = len(training_data)
plt.xlabel('epoch')
plt.title('cost')
cy=[]
cx=range(epochs)
for j in cx:
self.cost = 0.0
np.random.shuffle(training_data) # shuffle
for k in xrange(0, n, mini_batch_size):
mini_batch = training_data[k:k+mini_batch_size]
self.update_mini_batch(mini_batch, eta)
cy.append(self.cost/n)
print "Epoch {0}: {1} / {2}".format(
j, self.evaluate(test_data), n_test)
plt.plot(cx,cy)
plt.scatter(cx,cy)
plt.show() def update_mini_batch(self, mini_batch, eta):
for x, y in mini_batch:
delta_b, delta_w,cost = self.backprop(x, y)
self.weights -= eta/len(mini_batch)*delta_w
self.biases -= eta/len(mini_batch)*delta_b
self.cost += cost def backprop(self, x, y):
b=np.zeros_like(self.biases)
w=np.zeros_like(self.weights)
a_ = x
a = [x]
for b_, w_ in zip(self.biases, self.weights):
a_ = self.sigmoid(np.dot(w_, a_)+b_)
a.append(a_)
for l in xrange(1, self.num_layers):
if l==1:
# delta= self.sigmoid_prime(a[-1])*(a[-1]-y) # O(k)=a[-1], t(k)=y
delta= a[-1]-y # cross-entropy
else:
sp = self.sigmoid_prime(a[-l]) # O(j)=a[-l]
delta = np.dot(self.weights[-l+1].T, delta) * sp
b[-l] = delta
w[-l] = np.dot(delta, a[-l-1].T)
cost=0.5*np.sum((b[-1])**2)
return (b, w,cost) def evaluate(self, test_data):
test_results = [(np.argmax(self.feedforward(x)), y)
for (x, y) in test_data]
return sum(int(x == y) for (x, y) in test_results) def sigmoid(self,z):
return 1.0/(1.0+np.exp(-z)) def sigmoid_prime(self,z):
return z*(1-z) if __name__ == '__main__': def get_label(i):
c=np.zeros((10,1))
c[i]=1
return c def get_data(data):
return [np.reshape(x, (784,1)) for x in data[0]] f = open('mnist.pkl', 'rb')
training_data, validation_data, test_data = cPickle.load(f)
training_inputs = get_data(training_data)
training_label=[get_label(y_) for y_ in training_data[1]]
data = zip(training_inputs,training_label)
test_inputs = training_inputs = get_data(test_data)
test = zip(test_inputs,test_data[1])
net = Network([784, 30, 10])
net.SGD(data[:5000],test[:5000],50,10, 3.0,) # 4476/5000 (4347/5000)

BP神经网络——交叉熵作代价函数的更多相关文章

  1. 神经网络(NN)+反向传播算法(Backpropagation/BP)+交叉熵+softmax原理分析

    神经网络如何利用反向传播算法进行参数更新,加入交叉熵和softmax又会如何变化? 其中的数学原理分析:请点击这里.

  2. 交叉熵代价函数——当我们用sigmoid函数作为神经元的激活函数时,最好使用交叉熵代价函数来替代方差代价函数,以避免训练过程太慢

    交叉熵代价函数 machine learning算法中用得很多的交叉熵代价函数. 1.从方差代价函数说起 代价函数经常用方差代价函数(即采用均方误差MSE),比如对于一个神经元(单输入单输出,sigm ...

  3. 最大似然估计 (Maximum Likelihood Estimation), 交叉熵 (Cross Entropy) 与深度神经网络

    最近在看深度学习的"花书" (也就是Ian Goodfellow那本了),第五章机器学习基础部分的解释很精华,对比PRML少了很多复杂的推理,比较适合闲暇的时候翻开看看.今天准备写 ...

  4. 理解交叉熵(cross_entropy)作为损失函数在神经网络中的作用

    交叉熵的作用 通过神经网络解决多分类问题时,最常用的一种方式就是在最后一层设置n个输出节点,无论在浅层神经网络还是在CNN中都是如此,比如,在AlexNet中最后的输出层有1000个节点: 而即便是R ...

  5. 深度学习原理与框架-Tensorflow卷积神经网络-卷积神经网络mnist分类 1.tf.nn.conv2d(卷积操作) 2.tf.nn.max_pool(最大池化操作) 3.tf.nn.dropout(执行dropout操作) 4.tf.nn.softmax_cross_entropy_with_logits(交叉熵损失) 5.tf.truncated_normal(两个标准差内的正态分布)

    1. tf.nn.conv2d(x, w, strides=[1, 1, 1, 1], padding='SAME')  # 对数据进行卷积操作 参数说明:x表示输入数据,w表示卷积核, stride ...

  6. BP神经网络算法推导及代码实现笔记zz

    一. 前言: 作为AI入门小白,参考了一些文章,想记点笔记加深印象,发出来是给有需求的童鞋学习共勉,大神轻拍! [毒鸡汤]:算法这东西,读完之后的状态多半是 --> “我是谁,我在哪?” 没事的 ...

  7. 基于BP神经网络的字符识别研究

    基于BP神经网络的字符识别研究 原文作者:Andrew Kirillov. http://www.codeproject.com/KB/cs/neural_network_ocr.aspx 摘要:本文 ...

  8. Python3 BP神经网络

    转自麦子学院 """ network.py ~~~~~~~~~~ A module to implement the stochastic gradient descen ...

  9. NO.2:自学tensorflow之路------BP神经网络编程

    引言 在上一篇博客中,介绍了各种Python的第三方库的安装,本周将要使用Tensorflow完成第一个神经网络,BP神经网络的编写.由于之前已经介绍过了BP神经网络的内部结构,本文将直接介绍Tens ...

随机推荐

  1. 2016 - 1- 22 NSURLConnetction --- POST请求

    一:与上一篇博客中的GET方法类似  只不过需要多注意,如果要改变请求的类型,需要生成NSMutableURLRequest对象才可以设置请求的类型. NSURL *url = [NSURL URLW ...

  2. BZOJ 1271 秦腾与教学评估

    二分. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> ...

  3. 我与python3擦肩而过(一)—— Dict与collections.OrderredDict邂逅

    最近一直在撸Python Data Analysis上的代码(书是基于Python2的,小白我用的python3),所以我下的时候多少有些改动. 这是9.4中的nltk词频分析关于Dict_key的问 ...

  4. PHP使用mysqli操作MySQL数据库

    PHP的 mysqli 扩展提供了其先行版本的所有功能,此外,由于 MySQL 已经是一个 具有完整特性的数据库服务器 , 这为PHP 又添加了一些新特性 . 而 mysqli 恰恰也支持了 这些新特 ...

  5. Android Studio And Gradle

    AS特色: 智能感知体验特好,堪比VS 布局预览,手写布局后预览页面即时显示,便于布局调整和优化 编辑速度飞快流畅,毫无eclipse的卡顿 布局或源码中有图标和颜色的预览,十分直观 调试时体验极佳 ...

  6. ssh 命令

    常用的ssh命令 cd 切换目录 1.查看日志:举例: tail -f tomcat/apache-tomcat-6.0.26/logs/catalina.2010-11-10.out 2.pwd   ...

  7. Magento删除产品同时删除图片

    在Magento后台删除产品时,默认不会删除产品的图片,如果长期不清理这些废弃的图片,会导致Media目录下的文件越来越多,浪费服务器空间,为了实现删除产品的同时删除图片,网络上常见的方法是修改Mag ...

  8. Intellij IDEA 创建Web项目并在Tomcat中部署运行

      一.创建Web项目 1.File -> New Module,进入创建项目窗口 2.选择Java类型,在 Module name 处输入项目名,点击Next 3.勾选 Web Applica ...

  9. poj 1990 MooFest

    题目大意: FJ有n头牛,排列成一条直线(不会在同一个点),给出每头牛在直线上的坐标x.另外,每头牛还有一个自己的声调v,如果两头牛(i和j)之间想要沟通的话,它们必须用同个音调max(v[i],v[ ...

  10. 160. Intersection of Two Linked Lists

    Write a program to find the node at which the intersection of two singly linked lists begins. For ex ...