当前位置: 首页 > 编程日记 > 正文

BP神经网络公式推导及实现(MNIST)

BP神经网络的基础介绍见:http://blog.csdn.net/fengbingchun/article/details/50274471,这里主要以公式推导为主。

BP神经网络又称为误差反向传播网络,其结构如下图。这种网络实质是一种前向无反馈网络,具有结构清晰、易实现、计算功能强大等特点。

BP神经网络有一个输入层,一个输出层,一个或多个隐含层。每一层上包含了若干个节点,每个节点代表一个神经元,同一层上各节点之间无任何耦合连接关系,层间各神经元之间实现全连接,即后一层(如输入层)的每一个神经元与前一层(如隐含层)的每一个神经元实现全连接。网络按照监督学习的方式学习,当信息被输入网络后神经元受到刺激,激活值从输入层依次经过各隐含层节点,最后在输出层的各节点获得网络的输入响应。

BP神经网络的基本思想:BP神经网络的学习采用误差反向传播算法,BP算法是一种有监督的学习方法,其主要思想是把整个学习过程分为正向传播、反向(逆向)传播和记忆训练三个部分。正向传播时,输入样本从输入层输入,经各隐含层处理后传向输出层,每一层神经元的状态只影响下一层神经元的状态。如果在输出层得不到期望的输出,则转入误差的反向传播阶段,将输出误差以某种形式通过隐含层向输入层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号并将其作为修正各单元权值的依据。这种网络的信号正向传播与误差反向传播是反复交替进行的,权值的不断调整就是网络的记忆训练过程。网络的记忆训练过程一直进行到网络趋向收敛,即输出误差达到要求的标准。

三层BP神经网络的学习算法:为了使BP网络具有某种功能,完成某项任务,必须调整层间连接权值和节点阈值,使所有样品的实际输出和期望输出之间的误差稳定在一个较小的值之内。三层BP网络学习过程主要由四部分组成:(1)、输入模式顺传播(输入模式由输入层经隐含层向输出层传播计算);(2)、输出误差逆传播(输出的误差由输出层经隐含层传向输入层);(3)、循环记忆训练(模式顺传播与误差逆传播的计算过程反复交替循环进行);(4)、学习结果判别(判定全局误差是否趋向极小值或是否已达到设定的最大迭代次数)。

(1)、输入模式顺传播:这一过程主要是利用输入模式求出它所对应的实际输出。

确定输入向量X k


式中,k=1,2,…,m;m是学习模式对数(训练模式对数);n是输入层单元数。

确定期望输出向量Y k


式中,k=1,2,…,m;m是学习模式对数(训练模式对数);q为输出层单元数。

计算隐含层各神经元的激活值s j


式中,n是输入层单元数;wij是输入层至隐含层的连接权值;θj是隐含层单元的阈值;j=1,2…p,p是隐含层单元数。

激活函数采用s型函数:


计算隐含层j单元的输出值:将上面的激活值即公式(3)代入激活函数即公式(4)中可得隐含层j单元的输出值:


阈值θj在学习过程中与权值wij一样也不断地被修正。

计算输出层第t个单元的激活值o t


计算输出层第t个单元的实际输出值ct


式中,wjt是隐含层至输出层的权值;θt是输出层单元阈值;j=1,2…p,p是隐含层单元数;xj为隐含层第j个节点的输出值;f是s型激活函数,t=1,2…,q,q为输出层单元数。

利用以上各公式就可以计算出一个输入模式的顺传播过程。

(2)、输出误差的逆传播:在第一步的模式顺传播计算中得到了网络的实际输出值,当这些实际的输出值与希望的输出值不一样或者误差大于所限定的数值时,就要对网络进行校正。

这里的校正是从前往后进行的,所以叫做误差逆传播,计算时是从输出层到隐含层,再从隐含层到输入层。

输出层的校正误差:


式中,t=1,2,…,q,q是输出层单元数;k=1,2,…,m,m是训练(学习)模式对数;ytk是希望输出;ctk是实际输出;f(.)是对输出函数的导数。

隐含层各单元的校正误差:


式中,t=1,2,…,q,q是输出层单元数;j=1,2,…,p; p是隐含层单元数;k=1,2,…,m,m是训练(学习)模式对数。

对于输出层至隐含层连接权和输出层阈值的校正量:


式中,bjk是隐含层j单元的输出;dtk是输出层的校正误差;j=1,2…,p;t=1,2,…,q;k=1,2,…,m; α>0(输出层至隐含层学习率)。

隐含层至输入层的校正量:


式中,ejk是隐含层j单元的校正误差;xik是标准输入,i=1,2,…,n ,n是输入层单元数;0<β<1(隐含层至输入层学习率)。

(3)、循环记忆训练:为使网络的输出误差趋向于极小值,对于BP网输入的每一组训练模式,一般要经过数百次甚至上万次的循环记忆训练,才能使网络记住这一模式。这种循环记忆实际上就是反复重复上面介绍的输入模式顺传播和输出误差逆传播。

(4)、学习结果的判别:当每次循环记忆训练结束后,都要进行学习结果的判别。判别的目的主要是检查输出误差是否已经小到可以允许的程度。如果小到可以允许的程度,就可以结束整个学习过程,否则还要继续进行循环训练。

确定隐含层节点数:一般有3个经验公式:


式中,m为要设置的隐含层节点数;n为输入层节点数;l为输出层节点数;α为1至10之间的常数。

以下按照上面的公式实现的BP,通过MNIST库测试,识别率可以达到96.5%以上。

BP.hpp:

#ifndef _BP_HPP_
#define _BP_HPP_namespace ANN {#define num_node_input_BP	784 //输入层节点数
#define width_image_BP		28 //归一化图像宽
#define height_image_BP		28 //归一化图像高
#define num_node_hidden_BP	120 //隐含层节点数
#define num_node_output_BP	10 //输出层节点数
#define alpha_learning_BP	0.8 //输出层至隐含层学习率
#define beta_learning_BP	0.6 //隐含层至输入层学习率
#define patterns_train_BP	60000 //训练模式对数(总数)
#define patterns_test_BP	10000 //测试模式对数(总数)
#define iterations_BP		10000 //最大训练次数
#define accuracy_rate_BP	0.965 //要求达到的准确率class BP {
public:BP();~BP();void init(); //初始化,分配空间bool train(); //训练int predict(const int* data, int width, int height); //预测bool readModelFile(const char* name); //读取已训练好的BP modelprotected:void release(); //释放申请的空间bool saveModelFile(const char* name); //将训练好的model保存起来,包括各层的节点数,权值和阈值bool initWeightThreshold(); //初始化,产生[-1, 1]之间的随机小数bool getSrcData(); //读取MNIST数据void calcHiddenLayer(const int* data); //计算隐含层输出void calcOutputLayer(); //计算输出层输出void calcAdjuctOutputLayer(const int* data); //计算输出层校正误差void calcAdjuctHiddenLayer(); //计算隐含层校正误差float calcActivationFunction(float x); //计算激活函数,对数S形函数void updateWeightThresholdOutputLayer(); //更新输出层至隐含层权值和阈值void updateWeightThresholdHiddenLayer(const int* data); //更新隐含层至输入层权值和阈值float test(); //训练完一次计算一次准确率private:float weight1[num_node_input_BP][num_node_hidden_BP]; //输入层至隐含层连接权值float weight2[num_node_hidden_BP][num_node_output_BP]; //隐含层至输出层连接权值float threshold1[num_node_hidden_BP]; //隐含层阈值float threshold2[num_node_output_BP]; //输出层阈值float output_hiddenLayer[num_node_hidden_BP]; //顺传播,隐含层输出值float output_outputLayer[num_node_output_BP]; //顺传播,输出层输出值float adjust_error_outputLayer[num_node_output_BP]; //逆传播,输出层校正误差float adjust_error_hiddenLayer[num_node_hidden_BP]; //逆传播,隐含层校正误差int* data_input_train; //原始标准输入数据,训练int* data_output_train; //原始标准期望结果,训练int* data_input_test; //原始标准输入数据,测试int* data_output_test; //原始标准期望结果,测试
};}#endif //_BP_HPP_
BP.cpp:

#include <assert.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <windows.h>#include "BP.hpp"namespace ANN {BP::BP()
{data_input_train = NULL;data_output_train = NULL;data_input_test = NULL;data_output_test = NULL;
}BP::~BP()
{release();
}void BP::release()
{if (data_input_train) {delete[] data_input_train;}if (data_output_train) {delete[] data_output_train;}if (data_input_test) {delete[] data_input_test;}if (data_output_test) {delete[] data_output_test;}
}bool BP::initWeightThreshold()
{srand(time(0) + rand());for (int i = 0; i < num_node_input_BP; i++) {for (int j = 0; j < num_node_hidden_BP; j++) {weight1[i][j] = -1 + 2 * ((float)rand()) / RAND_MAX; //[-1, 1]}}for (int i = 0; i < num_node_hidden_BP; i++) {for (int j = 0; j < num_node_output_BP; j++) {weight2[i][j] = -1 + 2 * ((float)rand()) / RAND_MAX;}}for (int i = 0; i < num_node_hidden_BP; i++) {threshold1[i] = -1 + 2 * ((float)rand()) / RAND_MAX;}for (int i = 0; i < num_node_output_BP; i++) {threshold2[i] = -1 + 2 * ((float)rand()) / RAND_MAX;}return true;
}static int reverseInt(int i)
{unsigned char ch1, ch2, ch3, ch4;ch1 = i & 255;ch2 = (i >> 8) & 255;ch3 = (i >> 16) & 255;ch4 = (i >> 24) & 255;return((int)ch1 << 24) + ((int)ch2 << 16) + ((int)ch3 << 8) + ch4;
}static void readMnistImages(std::string filename, int* data_dst, int num_image)
{std::ifstream file(filename, std::ios::binary);assert(file.is_open());int magic_number = 0;int number_of_images = 0;int n_rows = 0;int n_cols = 0;file.read((char*)&magic_number, sizeof(magic_number));magic_number = reverseInt(magic_number);file.read((char*)&number_of_images, sizeof(number_of_images));number_of_images = reverseInt(number_of_images);assert(number_of_images == num_image);file.read((char*)&n_rows, sizeof(n_rows));n_rows = reverseInt(n_rows);file.read((char*)&n_cols, sizeof(n_cols));n_cols = reverseInt(n_cols);assert(n_rows == height_image_BP && n_cols == width_image_BP);for (int i = 0; i < number_of_images; ++i) {for (int r = 0; r < n_rows; ++r) {for (int c = 0; c < n_cols; ++c) {unsigned char temp = 0;file.read((char*)&temp, sizeof(temp));//data_dst[i * num_node_input_BP + r * n_cols + c] = (int)temp; //formula[1]if (temp > 128) {data_dst[i * num_node_input_BP + r * n_cols + c] = 1;} else {data_dst[i * num_node_input_BP + r * n_cols + c] = 0;}}}}
}static void readMnistLabels(std::string filename, int* data_dst, int num_image)
{std::ifstream file(filename, std::ios::binary);assert(file.is_open());int magic_number = 0;int number_of_images = 0;file.read((char*)&magic_number, sizeof(magic_number));magic_number = reverseInt(magic_number);file.read((char*)&number_of_images, sizeof(number_of_images));number_of_images = reverseInt(number_of_images);assert(number_of_images == num_image);for (int i = 0; i < number_of_images; ++i) {unsigned char temp = 0;file.read((char*)&temp, sizeof(temp));data_dst[i * num_node_output_BP + temp] = 1; //formula[2]}
}bool BP::getSrcData()
{assert(data_input_train && data_output_train && data_input_test && data_output_test);std::string filename_train_images = "D:/Download/MNIST/train-images.idx3-ubyte";std::string filename_train_labels = "D:/Download/MNIST/train-labels.idx1-ubyte";readMnistImages(filename_train_images, data_input_train, patterns_train_BP);/*unsigned char* p = new unsigned char[784];memset(p, 0, sizeof(unsigned char) * 784);for (int j = 0, i = 59998 * 784; j< 784; j++, i++) {p[j] = (unsigned char)data_input_train[i];}delete[] p;*/readMnistLabels(filename_train_labels, data_output_train, patterns_train_BP);/*int* q = new int[10];memset(q, 0, sizeof(int) * 10);for (int j = 0, i = 59998 * 10; j < 10; j++, i++) {q[j] = data_output_train[i];}delete[] q;*/std::string filename_test_images = "D:/Download/MNIST/t10k-images.idx3-ubyte";std::string filename_test_labels = "D:/Download/MNIST/t10k-labels.idx1-ubyte";readMnistImages(filename_test_images, data_input_test, patterns_test_BP);readMnistLabels(filename_test_labels, data_output_test, patterns_test_BP);return true;
}void BP::init()
{data_input_train = new int[patterns_train_BP * num_node_input_BP];memset(data_input_train, 0, sizeof(int) * patterns_train_BP * num_node_input_BP);data_output_train = new int[patterns_train_BP * num_node_output_BP];memset(data_output_train, 0, sizeof(int) * patterns_train_BP * num_node_output_BP);data_input_test = new int[patterns_test_BP * num_node_input_BP];memset(data_input_test, 0, sizeof(int) * patterns_test_BP * num_node_input_BP);data_output_test = new int[patterns_test_BP * num_node_output_BP];memset(data_output_test, 0, sizeof(int) * patterns_test_BP * num_node_output_BP);initWeightThreshold();getSrcData();
}float BP::calcActivationFunction(float x)
{return 1.0 / (1.0 + exp(-x)); //formula[4] formula[5] formula[7]
}void BP::calcHiddenLayer(const int* data)
{for (int i = 0; i < num_node_hidden_BP; i++) {float tmp = 0;for (int j = 0; j < num_node_input_BP; j++) {tmp += data[j] * weight1[j][i];}tmp -= threshold1[i]; //formula[3]output_hiddenLayer[i] = calcActivationFunction(tmp);}
}void BP::calcOutputLayer()
{for (int i = 0; i < num_node_output_BP; i++) {float tmp = 0;for (int j = 0; j < num_node_hidden_BP; j++) {tmp += output_hiddenLayer[j] * weight2[j][i];}tmp -= threshold2[i]; //formula[6]output_outputLayer[i] = calcActivationFunction(tmp);}
}void BP::calcAdjuctOutputLayer(const int* data)
{for (int i = 0; i < num_node_output_BP; i++) {adjust_error_outputLayer[i] = (data[i] - output_outputLayer[i]) *output_outputLayer[i] * (1.0 - output_outputLayer[i]); //formula[8], f'(x)= f(x)*(1. - f(x))}
}void BP::calcAdjuctHiddenLayer()
{for (int i = 0; i < num_node_hidden_BP; i++) {float tmp = 0;for (int j = 0; j < num_node_output_BP; j++) {tmp += weight2[i][j] * adjust_error_outputLayer[j];}adjust_error_hiddenLayer[i] = tmp * (output_hiddenLayer[i] * (1.0 - output_hiddenLayer[i])); //formula[9]}
}void BP::updateWeightThresholdOutputLayer()
{for (int i = 0; i < num_node_output_BP; i++) {for (int j = 0; j < num_node_hidden_BP; j++) {weight2[j][i] += (alpha_learning_BP * adjust_error_outputLayer[i] * output_hiddenLayer[j]); //formula[10]}threshold2[i] += (alpha_learning_BP * adjust_error_outputLayer[i]); //formula[11]}
}void BP::updateWeightThresholdHiddenLayer(const int* data)
{for (int i = 0; i < num_node_hidden_BP; i++) {for (int j = 0; j < num_node_input_BP; j++) {weight1[j][i] += (beta_learning_BP * adjust_error_hiddenLayer[i] * data[j]); //formula[12]}threshold1[i] += (beta_learning_BP * adjust_error_hiddenLayer[i]); //formula[13]}
}float BP::test()
{int count_accuracy = 0;for (int num = 0; num < patterns_test_BP; num++) {int* p1 = data_input_test + num * num_node_input_BP;calcHiddenLayer(p1);calcOutputLayer();float max_value = -9999;int pos = -1;for (int i = 0; i < num_node_output_BP; i++) {if (output_outputLayer[i] > max_value) {max_value = output_outputLayer[i];pos = i;}}int* p2 = data_output_test + num * num_node_output_BP;if (p2[pos] == 1) {count_accuracy++;}Sleep(1);}return (count_accuracy * 1.0 / patterns_test_BP);
}bool BP::saveModelFile(const char* name)
{FILE* fp = fopen(name, "wb");if (fp == NULL) {return false;}int num_node_input = num_node_input_BP;int num_node_hidden = num_node_hidden_BP;int num_node_output = num_node_output_BP;fwrite(&num_node_input, sizeof(int), 1, fp);fwrite(&num_node_hidden, sizeof(int), 1, fp);fwrite(&num_node_output, sizeof(int), 1, fp);fwrite(weight1, sizeof(weight1), 1, fp);fwrite(threshold1, sizeof(threshold1), 1, fp);fwrite(weight2, sizeof(weight2), 1, fp);fwrite(threshold2, sizeof(threshold2), 1, fp);fflush(fp);fclose(fp);return true;
}bool BP::readModelFile(const char* name)
{FILE* fp = fopen(name, "rb");if (fp == NULL) {return false;}int num_node_input, num_node_hidden, num_node_output;fread(&num_node_input, sizeof(int), 1, fp);assert(num_node_input == num_node_input_BP);fread(&num_node_hidden, sizeof(int), 1, fp);assert(num_node_hidden == num_node_hidden_BP);fread(&num_node_output, sizeof(int), 1, fp);assert(num_node_output == num_node_output_BP);fread(weight1, sizeof(weight1), 1, fp);fread(threshold1, sizeof(threshold1), 1, fp);fread(weight2, sizeof(weight2), 1, fp);fread(threshold2, sizeof(threshold2), 1, fp);fflush(fp);fclose(fp);return true;
}int BP::predict(const int* data, int width, int height)
{assert(data && width == width_image_BP && height == height_image_BP);const int* p = data;calcHiddenLayer(p);calcOutputLayer();float max_value = -9999;int ret = -1;for (int i = 0; i < num_node_output_BP; i++) {if (output_outputLayer[i] > max_value) {max_value = output_outputLayer[i];ret = i;}}return ret;
}bool BP::train()
{int i = 0;for (i = 0; i < iterations_BP; i++) {std::cout << "iterations : " << i;float accuracyRate = test();std::cout << ",    accuray rate: " << accuracyRate << std::endl;if (accuracyRate > accuracy_rate_BP) {saveModelFile("bp.model");std::cout << "generate bp model" << std::endl;break;}for (int j = 0; j < patterns_train_BP; j++) {int* p1 = data_input_train + j * num_node_input_BP;calcHiddenLayer(p1);calcOutputLayer();int* p2 = data_output_train + j * num_node_output_BP;calcAdjuctOutputLayer(p2);calcAdjuctHiddenLayer();updateWeightThresholdOutputLayer();int* p3 = data_input_train + j * num_node_input_BP;updateWeightThresholdHiddenLayer(p3);}}if (i == iterations_BP) {saveModelFile("bp.model");std::cout << "generate bp model" << std::endl;}return true;
}}
test.cpp:

#include <iostream>
#include "BP.hpp"
#include <opencv2/opencv.hpp>int test_BP();int main()
{test_BP();std::cout << "ok!" << std::endl;
}int test_BP()
{//1. bp trainANN::BP bp1;bp1.init();bp1.train();//2. bp predictANN::BP bp2;bool flag = bp2.readModelFile("bp.model");if (!flag) {std::cout << "read bp model error" << std::endl;return -1;}int target[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };std::string path_images = "../../../../test-images/";int* data_image = new int[width_image_BP * height_image_BP];for (int i = 0; i < 10; i++) {char ch[15];sprintf(ch, "%d", i);std::string str;str = std::string(ch);str += ".jpg";str = path_images + str;cv::Mat mat = cv::imread(str, 2 | 4);if (!mat.data) {std::cout << "read image error" << std::endl;return -1;}if (mat.channels() == 3) {cv::cvtColor(mat, mat, cv::COLOR_BGR2GRAY);}if (mat.cols != width_image_BP || mat.rows != height_image_BP) {cv::resize(mat, mat, cv::Size(width_image_BP, height_image_BP));}memset(data_image, 0, sizeof(int) * (width_image_BP * height_image_BP));for (int h = 0; h < mat.rows; h++) {uchar* p = mat.ptr(h);for (int w = 0; w < mat.cols; w++) {if (p[w] > 128) {data_image[h* mat.cols + w] = 1;}}}int ret = bp2.predict(data_image, mat.cols, mat.rows);std::cout << "correct result: " << i << ",    actual result: " << ret << std::endl;}delete[] data_image;return 0;
}

train结果如下图所示:



predict结果如下图所示,测试图像是从MNIST test集合中选取的:


GitHub:https://github.com/fengbingchun/NN

相关文章:

AI应用落地哪家强?CSDN AI Top 30+案例评选等你来秀!

人工智能历经百年发展&#xff0c;如今迎来发展的黄金时期。目前&#xff0c;AI 技术已涵盖自然语言处理、模式识别、图像识别、数据挖掘、机器学习等领域的研究&#xff0c;在汽车、金融、教育、医疗、安防、零售、家居、文娱、工业等行业获得了令人印象深刻的成果。 在各行业…

安利Mastodon:属于未来的社交网络

我为Mastodon开发了一款安卓客户端&#xff0c;v1.0版本已经发布&#xff0c;欢迎下载使用 源码在这里&#xff1a;https://github.com/shuiRong/Gakki ??? 正文 Mastodon(长毛象)是什么&#xff1f; 是一个免费开源、去中心化、分布式的微博客社交网络&#xff0c;是微博、…

通过案例练习掌握SSH 的整合

1. SSH整合_方案01 ** 整合方案01 Struts2框架 Spring框架 在Spring框架中整合了Hibernate&#xff08;JDBC亦可&#xff09; 一些业务组件&#xff08;Service组件&#xff09;也可以放入Spring框架中迚行管理&#xff08;昨天的例子&#xff09; 1. 请求&#xff0…

tiny-cnn开源库的使用(MNIST)

tiny-cnn是一个基于CNN的开源库&#xff0c;它的License是BSD 3-Clause。作者也一直在维护更新&#xff0c;对进一步掌握CNN很有帮助&#xff0c;因此下面介绍下tiny-cnn在windows7 64bit vs2013的编译及使用。 1. 从https://github.com/nyanp/tiny-cnn下载源码&#xff1…

玩嗨的2亿快手“老铁”和幕后的极致视觉算法

作者 | Just出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;创立八年&#xff0c;短视频平台快手目前已经有超过两亿人在每天登陆使用&#xff0c;每天还有超过 1500 万条短视频被制作和上传&#xff0c;每天的累计观看数更是达到 150 亿。拥有如此庞大的用户数&…

lsmod命令详解

基础命令学习目录首页 原文链接&#xff1a;http://blog.sina.com.cn/s/blog_e6b2465d0101fuev.html lsmod——显示已载入系统的模块 lsmod 其实就是list modules的缩写&#xff0c;即 列出所有模块. 功能说明&#xff1a;显示已载入系统的模块。 语法&#xff1a;lsmod 说明&a…

javascript模块化、模块加载器初探

最常见网站的javascript架构可能是这样的&#xff1a; 一个底层框架文件&#xff0c;如jQuery一个网站业务框架文件&#xff0c;包含整站公用业务模块类(如弹框、ajax封装等)多个业务文件&#xff0c;包含每个具体页面有关系的业务代码为了减少一个HTTP请求&#xff0c;我们可能…

tiny-cnn执行过程分析(MNIST)

在http://blog.csdn.net/fengbingchun/article/details/50573841中以MNIST为例对tiny-cnn的使用进行了介绍&#xff0c;下面对其执行过程进行分析&#xff1a;支持两种损失函数&#xff1a;(1)、mean squared error(均方差)&#xff1b;(2)、cross entropy(交叉熵)。在MNIST中使…

关于element的select多选选择器,数据回显的问题

关于element的select多选&#xff0c;数据回显的问题 在工作中遇到这样一个问题&#xff0c;新建表单时用element的select多选以后&#xff0c;在编辑的时候打开表单发现其他数据能正常显示&#xff0c;多选却无法正常回显。在网上找了很多后&#xff0c;终于解决了这个问题&am…

360金融发布Q2财报:净利6.92亿,同比增长114%,大数据与AI加持的科技服务是新亮点?

8月23日&#xff0c;360金融发布未经审计的2019年第二季度业绩报告。财务数据显示&#xff0c;2019年第二季度&#xff0c;360金融实现收入22.27亿元人民币&#xff0c;较2018年二季度9.79亿元增长128%&#xff1b;净利润为6.18亿元&#xff0c;而去年同期为净亏损1.42亿元&…

SPRING3.X JSON 406 和 中文乱码问题

2019独角兽企业重金招聘Python工程师标准>>> 简要 最近使用Spring3.2.3 版本 在使用 JSON message convertion 的时候&#xff0c;老是出现406 返回类型不匹配的问题&#xff0c;去网上google 了一番 也没有一个明确的说法&#xff0c;只能自己去调试。 Maven 依…

VLFeat开源库介绍及在VS2013中的编译

VLFeat是一个开源的计算机视觉算法库&#xff0c;内容主要包括feature detectors、feature extractors、k-means clustering、randomized kd-tree matching、super-pixelization。它是跨平台的&#xff0c;能够应用在Linux、Mac、Windows平台。它的License是BSD。 在VS2013中编…

人工智能写手,好用吗?

作者 | 王树义来源 | 玉树芝兰&#xff08;ID&#xff1a;nkwangshuyi&#xff09;1、印象之前给学生上课的时候&#xff0c;我介绍过利用循环神经网络&#xff0c;仿照作家风格进行创作的机器学习模型。不过&#xff0c;那模型写出来的东西嘛……我的评价是&#xff1a;望之&a…

表单系列之input number总结

各浏览器表现 <input type"number" /> chrome 除数字字符&#xff0c;只可输入e和.IE 除数字字符&#xff0c;其他字符均可输入&#xff0c;无报错Firefox 除数字字符&#xff0c;其他字符均可输入&#xff0c;但会报错移除箭头 //谷歌去除箭头 input::-webki…

Android中Service深入学习

概述 1、当用户在与当前应用程序不同的应用程序时&#xff0c;Service可以继续在后台运行。 2、Service可以让其他组件绑定&#xff0c;以便和它交互并进行进程间通信。 3、Service默认运行在创建它的应用程序的主线程中。 Service的使用主要是因为应用程序里面可能需要长时间地…

卷积神经网络(CNN)的简单实现(MNIST)

卷积神经网络(CNN)的基础介绍见http://blog.csdn.net/fengbingchun/article/details/50529500&#xff0c;这里主要以代码实现为主。CNN是一个多层的神经网络&#xff0c;每层由多个二维平面组成&#xff0c;而每个平面由多个独立神经元组成。以MNIST作为数据库&#xff0c;仿照…

Tensorflow源码解析5 -- 图的边 - Tensor

1 概述 前文两篇文章分别讲解了TensorFlow核心对象Graph&#xff0c;和Graph的节点Operation。Graph另外一大成员&#xff0c;即为其边Tensor。边用来表示计算的数据&#xff0c;它经过上游节点计算后得到&#xff0c;然后传递给下游节点进行运算。本文讲解Graph的边Tensor&…

物联网成网络安全防护新重点!

在昨天的 2019 北京网络安全大会上&#xff0c;工信部负责人表示&#xff0c;我国面向 5G 和车联网将建设网安防护体系&#xff0c;提升监测预警和应急响应能力。其中物联网设备已成为网安防护新重点。为什么工信部会这么重视物联网&#xff1f;物联网开发者的现状又是如何呢&a…

【分享】Java的几个重要词语

Java 是一种解释型语言,由SUN公司开发,基本上属于一个完全面向对象的语言&#xff0c;并且语言的设计仍然以简捷为重点。初学Java肯定会被一些名词给弄晕了&#xff0c;现在集中几个解释一下下。1、JVMJVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&…

64位Ubuntu上编译32位程序操作步骤

1. 确认主机为64位架构的内核&#xff0c;应该输出为adm64&#xff0c;执行&#xff1a;$ dpkg --print-architecture2. 确认打开了多架构支持功能&#xff0c;应该输出为i386&#xff0c;执行&#xff1a;$ dpkg --print-foreign-architectures如果没有&#xff0c;…

分布式事务中间件 Fescar—RM 模块源码解读

2019独角兽企业重金招聘Python工程师标准>>> 前言 在SOA、微服务架构流行的年代&#xff0c;许多复杂业务上需要支持多资源占用场景&#xff0c;而在分布式系统中因为某个资源不足而导致其它资源占用回滚的系统设计一直是个难点。我所在的团队也遇到了这个问题&…

二维码检测哪家强?五大开源库测评比较

作者 | 周强来源 | 我爱计算机视觉&#xff08;ID&#xff1a;aicvml&#xff09;二维码已经进入人们的日常生活中&#xff0c;尤其是日本Denso Wave公司1994年发明的QR码&#xff0c;由于其易于检测、写入信息量大、提供强大的纠错机制&#xff0c;应用最为广泛&#xff0c;可…

linux 内核 出错-HP 方案

2019独角兽企业重金招聘Python工程师标准>>> SUPPORT COMMUNICATION - CUSTOMER ADVISORY Document ID: c03456595 Version: 1 Advisory: Red Hat Enterprise Linux 6 - "P4-Clockmod: Warning: EST-Capable CPU Detected" Messages Logged in /var/log…

Windows7 64bit VS2013 Caffe test MNIST操作步骤

在http://blog.csdn.net/fengbingchun/article/details/49849225中用Caffe对MNIST数据库进行训练&#xff0c;产生了model。下面介绍下如何将产生的model应用在实际的数字图像识别中。用到的测试图像与http://blog.csdn.net/fengbingchun/article/details/50573841中相同&#…

记住这35个英文单词,你就可以在RPA界混了!

无论是想玩转RPA&#xff08;机器人流程自动化&#xff09;&#xff0c;还是有意了解、进入这项行业&#xff0c;只有先了解该领域的专有名词&#xff08;行业术语&#xff09;&#xff0c;才能为之后的活动提供更多的可能。UiBot现为您编译整理了这份机器人流程自动化术语表&a…

福利 | 送你一张通往「2019 AI开发者大会」的门票

2019 AI开发者大会(AI ProCon 2019)是由中国IT社区CSDN主办的AI技术与产业年度盛会。多年经验淬炼&#xff0c;如今蓄势待发&#xff1a;2019年9月6-7日&#xff0c;大会将有近百位中美顶尖AI专家、知名企业代表以及千余名AI开发者齐聚北京&#xff0c;进行技术解读和产业论证。…

收缩日志文件夹

-- MSSQL2005 USE mastergo DECLARE dbname sysname;SET dbnameBSV100;-- 清空日志EXEC (DUMP TRANSACTION [dbname] WITH NO_LOG); -- 截断事务日志&#xff1a;EXEC (BACKUP LOG [dbname] WITH NO_LOG); -- 收缩数据库文件(如果不压缩,数据库的文件不会减小EXEC (DBCC SHR…

腾讯AI开源框架Angel 3.0重磅发布:超50万行代码,支持3种算法,打造全栈机器学习平台...

出品 | AI科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;【导语】2019年8月22日&#xff0c;腾讯首个AI开源项目Angel正式发布3.0版本。Angel 3.0尝试打造一个全栈的机器学习平台&#xff0c;功能特性涵盖了机器学习的各个阶段&#xff1a;特征工程&#xff0c;模…

路印协议受邀参加澳洲新南威尔士政府孵化器Haymarket HQ分享论坛

2019年2月15日&#xff0c;澳洲新南威尔士政府孵化器Haymarket HQ和Next Genius 社区联合举办了区块链解决方案分享论坛&#xff0c;路印协议CMO周杰受邀介绍当前交易所现状和路印协议的去中心化解决方案。参与此次论坛的还有区块链开发人员、企业家和去中心化技术爱好者&#…

一步一步指引你在Windows7上配置编译使用Caffe(https://github.com/fengbingchun/Caffe_Test)

之前写过几篇关于Caffe源码在Windows764位上配置编译及使用过程&#xff0c;只是没有把整个工程放到网上&#xff0c;最近把整个工程整理清理了下&#xff0c;把它放到了GitHub上。下面对这个工程的使用作几点说明&#xff1a;1. 整个工程Caffe在Windows7 64位VS2013下编译…