3:用tensorflow搭个神经网络出来

为什么用tensorflow呢,应为谷歌是亲爹啊,虽然有些人说caffe更适合图像啊mxnet效率更高等等,但爸爸就是爸爸,Android都能那么火,一个道理嘛。其实这些个框架一通百通,就是语法不一样了些。从tensorflow开始吧。

关于tf的安装详见另一篇博文,此处tensorflow的学习基本来自Udacity中google的深度学习课程。

1:tensorflow的计算图

在tensorflow中编写代码可以分成两个部分,首先是要定义一个计算的流程,或者叫计算图,然后再建立一个任务,让tensorflow调用系统资源去运算这个东西,举个栗子:

  1. import tensorflow as tf #导入tensorflow库
  2. matrix1=tf.constant([[3.,3.]])#创建常量节点
  3. matrix2=tf.constant([2.],[2.])
  4. product=tf.matmul(matrix1,matrix2)#创建矩阵乘法节点

上边并没有运算具体的值,而只是一个运算图。

真正的计算要用到session:

  1. sess=tf.Session()#启动默认图
  2. #运行这里会有一堆运行信息出来
  3. result = sess.run(product)#调用sessrun方法来执行矩阵乘法节点的操作,product代表了矩阵乘法这个节点的输出
  4. print result
  5. sess.close()#完成任务后关闭会话

这就是tf的基础运行方式,对于变量,使用Variable方法定义:

  1. W1=tf.Variable(tf.zeros((2,2)), name=”weights”)
  2. sess.run(tf.initialize_all_variables())#变量需要预先初始化
  3. print sess.run(W1)

另一个栗子:

  1. state = tf.Variable(0,name=”counter”)
  2. new_value=tf.add(state, tf.constant(1))#对state1
  3. update=tf.assign(state,new_value)#将自增后的值重新赋值给state
  4. with tf.Session() as sess: #使用with可以省去close()操作,还可以处理一些操作出现的异常(也可以用try)
  5. sess.run(tf.initialize_all_variables())
  6. print(sess.run(state))#输出计数器值
  7. for _ in range(3):
  8. sess.run(update)
  9. print(sess.run(state))

为毛谷歌爸爸这么蛋疼呢,直接算不好吗?其实一点也不蛋疼,这么设计,同样一套计算图,就可以扔给不同的设备或者分布式的设备去运算了:

  1. with tf.Session() as sess:
  2. with tf.device(“/gpu:1”):

另一个好处就是python的运算效率较低,所以设计成使用python编写运算图,之后再使用python之外的运算器(比如底层的C++)去计算。

2:使用tensorflow搭建一个卷积神经网络

这里会详解Google发布在udacity中使用CNN分类not_MINIST数据代码,这些代码包含在了tensorflow源代码中的examples中

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/udacity

<1>:准备数据(notMINIST)

代码的第一部分是载入数据:

  1. # These are all the modules we'll be using later. Make sure you can import them
  2. # before proceeding further.
  3. from __future__ import print_function
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. import os
  7. import sys
  8. import tarfile
  9. from IPython.display import display, Image
  10. from scipy import ndimage
  11. from sklearn.linear_model import LogisticRegression
  12. from six.moves.urllib.request import urlretrieve
  13. import tensorflow as tf
  14. from six.moves import cPickle as pickle
  15. from six.moves import range
  16. # Config the matplotlib backend as plotting inline in IPython
  17. %matplotlib inline
  18.  
  19. url = 'http://commondatastorage.googleapis.com/books1000/'
  20. last_percent_reported = None
  21.  
  22. def download_progress_hook(count, blockSize, totalSize):
  23. """A hook to report the progress of a download. This is mostly intended for users with
  24. slow internet connections. Reports every 5% change in download progress.
  25. """
  26. global last_percent_reported
  27. percent = int(count * blockSize * 100 / totalSize)
  28.  
  29. if last_percent_reported != percent:
  30. if percent % 5 == 0:
  31. sys.stdout.write("%s%%" % percent)
  32. sys.stdout.flush()
  33. else:
  34. sys.stdout.write(".")
  35. sys.stdout.flush()
  36.  
  37. last_percent_reported = percent
  38.  
  39. def maybe_download(filename, expected_bytes, force=False):
  40. """Download a file if not present, and make sure it's the right size."""
  41. if force or not os.path.exists(filename):
  42. print('Attempting to download:', filename)
  43. filename, _ = urlretrieve(url + filename, filename, reporthook=download_progress_hook)
  44. print('\nDownload Complete!')
  45. statinfo = os.stat(filename)
  46. if statinfo.st_size == expected_bytes:
  47. print('Found and verified', filename)
  48. else:
  49. raise Exception(
  50. 'Failed to verify ' + filename + '. Can you get to it with a browser?')
  51. return filename
  52.  
  53. train_filename = maybe_download('notMNIST_large.tar.gz', 247336696)
  54. test_filename = maybe_download('notMNIST_small.tar.gz', 8458043)

上边的代码是下载所需要的数据集压缩包,下一步是解压

  1. num_classes = 10
  2. np.random.seed(133)
  3.  
  4. def maybe_extract(filename, force=False):
  5. root = os.path.splitext(os.path.splitext(filename)[0])[0] # remove .tar.gz
  6. if os.path.isdir(root) and not force:
  7. # You may override by setting force=True.
  8. print('%s already present - Skipping extraction of %s.' % (root, filename))
  9. else:
  10. print('Extracting data for %s. This may take a while. Please wait.' % root)
  11. tar = tarfile.open(filename)
  12. sys.stdout.flush()
  13. tar.extractall()
  14. tar.close()
  15. data_folders = [
  16. os.path.join(root, d) for d in sorted(os.listdir(root))
  17. if os.path.isdir(os.path.join(root, d))]
  18. if len(data_folders) != num_classes:
  19. raise Exception(
  20. 'Expected %d folders, one per class. Found %d instead.' % (
  21. num_classes, len(data_folders)))
  22. print(data_folders)
  23. return data_folders
  24.  
  25. train_folders = maybe_extract(train_filename)
  26. test_folders = maybe_extract(test_filename)

解压后可以查看一下代码文件所在的文件夹中会有两个文件夹not_MNIST_large和not_MNIST_small,large用来训练,small用来验证,每个文件夹中都有10个文件夹,分别保存了A到J的图像(28*28),这些图像就是数据集,标签就是A到J,当然之前下载的压缩文件也在。下一步是将这些数据转换成python中更容易处理的pickle格式,为了确保内存装得下,我们把每一个类别分别转换成一个独立的pickle文件,同时也对数据进行去均值和归一化,在这个过程中可能会有一些文件是不可读的,跳过即可,无所谓:

  1. image_size = 28 # Pixel width and height.
  2. pixel_depth = 255.0 # Number of levels per pixel.
  3.  
  4. def load_letter(folder, min_num_images):
  5. """Load the data for a single letter label."""
  6. image_files = os.listdir(folder)
  7. dataset = np.ndarray(shape=(len(image_files), image_size, image_size),
  8. dtype=np.float32)
  9. print(folder)
  10. num_images = 0
  11. for image in image_files:
  12. image_file = os.path.join(folder, image)#文件路径拼接
  13. try:
  14. image_data = (ndimage.imread(image_file).astype(float) -
  15. pixel_depth / 2) / pixel_depth #去均值和归一化
  16. if image_data.shape != (image_size, image_size):
  17. raise Exception('Unexpected image shape: %s' % str(image_data.shape))
  18. dataset[num_images, :, :] = image_data
  19. num_images = num_images + 1
  20. except IOError as e:
  21. print('Could not read:', image_file, ':', e, '- it\'s ok, skipping.')
  22.  
  23. dataset = dataset[0:num_images, :, :]
  24. if num_images < min_num_images:
  25. raise Exception('Many fewer images than expected: %d < %d' %
  26. (num_images, min_num_images))
  27.  
  28. print('Full dataset tensor:', dataset.shape)
  29. print('Mean:', np.mean(dataset))
  30. print('Standard deviation:', np.std(dataset))
  31. return dataset
  32.  
  33. def maybe_pickle(data_folders, min_num_images_per_class, force=False):
  34. dataset_names = []
  35. for folder in data_folders:#本例中就是not_MNIST_large/A, not_MNIST_large/B等等
  36. set_filename = folder + '.pickle'#folders是A到J,设定文件名
  37. dataset_names.append(set_filename)#往dataset_names后边添加set_filename
  38. if os.path.exists(set_filename) and not force:
  39. # You may override by setting force=True.
  40. print('%s already present - Skipping pickling.' % set_filename)
  41. else:
  42. print('Pickling %s.' % set_filename)
  43. dataset = load_letter(folder, min_num_images_per_class)
  44. try:
  45. with open(set_filename, 'wb') as f:
  46. pickle.dump(dataset, f, pickle.HIGHEST_PROTOCOL)
  47. except Exception as e:
  48. print('Unable to save data to', set_filename, ':', e)
  49.  
  50. return dataset_names
  51.  
  52. train_datasets = maybe_pickle(train_folders, 45000)
  53. test_datasets = maybe_pickle(test_folders, 1800)

上边的代码就是把数据压缩到了一个pickle文件中去了,这样生成的数据文件可以在后续的程序中继续使用,这也就是没有直接采集图像数据的原因之一,下一步是将这些pickle文件中的数据进行合并和分类,生成一个拥有训练集、测试集合验证集的文件,训练数据的量取决于内存,如果非要使用超出内存的量的数据必须就分开运算了。

  1. def make_arrays(nb_rows, img_size):#在merge_dagasets方法中把数据转换成图片个数*imgsize*imgsize(28),同时建一个标签向量,大小为nb_rows
  2. if nb_rows:
  3. dataset = np.ndarray((nb_rows, img_size, img_size), dtype=np.float32)
  4. labels = np.ndarray(nb_rows, dtype=np.int32)
  5. else:
  6. dataset, labels = None, None
  7. return dataset, labels
  8.  
  9. def merge_datasets(pickle_files, train_size, valid_size=0):
  10. num_classes = len(pickle_files)
  11. valid_dataset, valid_labels = make_arrays(valid_size, image_size)
  12. train_dataset, train_labels = make_arrays(train_size, image_size)
  13. vsize_per_class = valid_size // num_classes
  14. tsize_per_class = train_size // num_classes
  15.  
  16. start_v, start_t = 0, 0
  17. end_v, end_t = vsize_per_class, tsize_per_class
  18. end_l = vsize_per_class+tsize_per_class
  19. for label, pickle_file in enumerate(pickle_files):#将分布在10pickle文件中的数据合并成一个张量
  20. try:
  21. with open(pickle_file, 'rb') as f:
  22. letter_set = pickle.load(f)
  23. # 将读取到的pickle文件中的数据打乱
  24. np.random.shuffle(letter_set)
  25. if valid_dataset is not None:
  26. valid_letter = letter_set[:vsize_per_class, :, :]
  27. valid_dataset[start_v:end_v, :, :] = valid_letter
  28. valid_labels[start_v:end_v] = label
  29. start_v += vsize_per_class
  30. end_v += vsize_per_class
  31.  
  32. train_letter = letter_set[vsize_per_class:end_l, :, :]
  33. train_dataset[start_t:end_t, :, :] = train_letter
  34. train_labels[start_t:end_t] = label
  35. start_t += tsize_per_class
  36. end_t += tsize_per_class
  37. except Exception as e:
  38. print('Unable to process data from', pickle_file, ':', e)
  39. raise
  40.  
  41. return valid_dataset, valid_labels, train_dataset, train_labels
  42.  
  43. train_size = 200000
  44. valid_size = 10000
  45. test_size = 10000
  46.  
  47. valid_dataset, valid_labels, train_dataset, train_labels = merge_datasets(
  48. train_datasets, train_size, valid_size)
  49. _, _, test_dataset, test_labels = merge_datasets(test_datasets, test_size)
  50.  
  51. print('Training:', train_dataset.shape, train_labels.shape)
  52. print('Validation:', valid_dataset.shape, valid_labels.shape)
  53. print('Testing:', test_dataset.shape, test_labels.shape)

最后将数据再次打乱保存后,就得到了最后的pickle文件。

  1. def randomize(dataset, labels):
  2. permutation = np.random.permutation(labels.shape[0])
  3. shuffled_dataset = dataset[permutation,:,:]
  4. shuffled_labels = labels[permutation]
  5. return shuffled_dataset, shuffled_labels
  6. train_dataset, train_labels = randomize(train_dataset, train_labels)
  7. test_dataset, test_labels = randomize(test_dataset, test_labels)
  8. valid_dataset, valid_labels = randomize(valid_dataset, valid_labels)
  9.  
  10. pickle_file = 'notMNIST.pickle'
  11. try:
  12. f = open(pickle_file, 'wb')
  13. save = {#存到一个dictionary中去
  14. 'train_dataset': train_dataset,#num*28*28
  15. 'train_labels': train_labels,#num*10
  16. 'valid_dataset': valid_dataset,#…
  17. 'valid_labels': valid_labels,
  18. 'test_dataset': test_dataset,
  19. 'test_labels': test_labels,
  20. }
  21. pickle.dump(save, f, pickle.HIGHEST_PROTOCOL)
  22. f.close()
  23. except Exception as e:
  24. print('Unable to save data to', pickle_file, ':', e)
  25. raise
  26. statinfo = os.stat(pickle_file)
  27. print('Compressed pickle size:', statinfo.st_size)

上面是一些预操作,然后我们读取这个pickle文件,得到卷积神经网络要使用的数据文件:

  1. pickle_file = 'notMNIST.pickle'
  2.  
  3. with open(pickle_file, 'rb') as f:
  4. save = pickle.load(f)
  5. train_dataset = save['train_dataset']
  6. train_labels = save['train_labels']
  7. valid_dataset = save['valid_dataset']
  8. valid_labels = save['valid_labels']
  9. test_dataset = save['test_dataset']
  10. test_labels = save['test_labels']
  11. del save # hint to help gc free up memory
  12. print('Training set', train_dataset.shape, train_labels.shape)
  13. print('Validation set', valid_dataset.shape, valid_labels.shape)
  14. print('Test set', test_dataset.shape, test_labels.shape)
  1. 运行后:
  1. Training set (200000, 28, 28) (200000,)
  1. Validation set (10000, 28, 28) (10000,)
  1. Test set (18724, 28, 28) (18724,)

可见训练集、验证集和测试集的原始格式。如果要将数据用到一个人工神经网络中,就要把每个图像数据都转换成一个长×宽维的向量,而在卷积神经网络中我们需要将图片数据转换成长×宽×深度的样子,同时将labels转换成one-hot encodings格式,于是:

  1. image_size = 28
  2. num_labels = 10
  3. num_channels = 1 # grayscale,如果要使用RGB格式数据就是3了
  4.  
  5. import numpy as np
  6.  
  7. def reformat(dataset, labels):
  8. dataset = dataset.reshape(
  9. (-1, image_size, image_size, num_channels)).astype(np.float32)
  10. #-1表示我懒得计算该填什么数字,由python通过a和其他的值3推测出来(这句话来自知乎,感觉好精辟啊)
  11. labels = (np.arange(num_labels) == labels[:,None]).astype(np.float32)
  12. #这句写的很迷,肿么解释。。。
  13. #labels[:,None]相当于把shape为(20w,)的labels转换成shape为(20w,1)的数组,从[1,2,3,4...]到[[1],[2],[3],…]
  14. #np.arange是生成了一个[0,1,2,3...]的(10,)的数组
  15. #判断一个(10,)是否等于一个(10,1)的数组,或者说判断一个列向量是否等于一个行向量,可理解为矩阵乘法了,定义乘法规则为一样就是true,不一样就是false,那么这个判断式的结果就是一个20w*10的数组。
  16. return dataset, labels
  17. train_dataset, train_labels = reformat(train_dataset, train_labels)
  18. valid_dataset, valid_labels = reformat(valid_dataset, valid_labels)
  19. test_dataset, test_labels = reformat(test_dataset, test_labels)
  20. print('Training set', train_dataset.shape, train_labels.shape)
  21. print('Validation set', valid_dataset.shape, valid_labels.shape)
  22. print('Test set', test_dataset.shape, test_labels.shape)

运行结果为:

Training set (200000, 28, 28, 1) (200000, 10)

Validation set (10000, 28, 28, 1) (10000, 10)

Test set (10000, 28, 28, 1) (10000, 10)

下一步我们先定义一个用来检测预测精度的方法:

  1. def accuracy(predictions, labels):
  2. return (100.0 * np.sum(np.argmax(predictions, 1) == np.argmax(labels, 1))
  3. / predictions.shape[0])#注意这里的argmax方法返回的是数组的索引值。

<2>:Draw a graph

前边说过了,tensorflow中进行运算,首先需要构建一个运算图,在这里将建立一个拥有两个卷积层和一个全连接层的卷积神经网络,算这个东西需要很土豪的显卡,所以限制了一下深度和全卷积层的节点。

  1. batch_size = 16 #SGD每次选取的图片个数
  2. patch_size = 5 #卷积窗口大小
  3. depth = 16 #卷积深度,就是特征图的个数
  4. num_hidden = 64 #全连接层隐层大小
  5.  
  6. graph = tf.Graph()
  7.  
  8. with graph.as_default():
  9.  
  10. # Input data.4
  11. tf_train_dataset = tf.placeholder(
  12. tf.float32, shape=(batch_size, image_size, image_size, num_channels))#每次选出batch_size个图片参与运算
  13. tf_train_labels = tf.placeholder(tf.float32, shape=(batch_size, num_labels))
  14. tf_valid_dataset = tf.constant(valid_dataset)
  15. tf_test_dataset = tf.constant(test_dataset)
  16.  
  17. # Variables.
  18. layer1_weights = tf.Variable(tf.truncated_normal(
  19. [patch_size, patch_size, num_channels, depth], stddev=0.1))#随机初始化第一卷积层权重参数,depth*num_channels张特征图,滑动窗口大小为5*5
  20. layer1_biases = tf.Variable(tf.zeros([depth]))#第一卷积层bias项初始化为0
  21. layer2_weights = tf.Variable(tf.truncated_normal(#随机初始化第二卷积层权重参数,depth*depth张特征图,滑动窗口5*5
  22. [patch_size, patch_size, depth, depth], stddev=0.1))
  23. layer2_biases = tf.Variable(tf.constant(1.0, shape=[depth]))#第二卷积层bias项初始化为0
  24. layer3_weights = tf.Variable(tf.truncated_normal(
  25. [image_size // 4 * image_size // 4 * depth, num_hidden], stddev=0.1))#全连接层第一层,//4是因为后边定义模型的时候定义stride为2,
  26. #所以两次卷积后的数据就是7*7*16*16了???????
  27. layer3_biases = tf.Variable(tf.constant(1.0, shape=[num_hidden]))
  28. layer4_weights = tf.Variable(tf.truncated_normal(#全连接层第二层
  29. [num_hidden, num_labels], stddev=0.1))
  30. layer4_biases = tf.Variable(tf.constant(1.0, shape=[num_labels]))
  31.  
  32. # Model.
  33. def model(data):
  34. conv = tf.nn.conv2d(data, layer1_weights, [1, 2, 2, 1], padding='SAME')#这里1,2,2,1stride,依次对应到data的格式中去
  35. #same padding是补0的那种padding模式,比较便于运算,所以基本上都用这种的。
  36. hidden = tf.nn.relu(conv + layer1_biases)
  37. conv = tf.nn.conv2d(hidden, layer2_weights, [1, 2, 2, 1], padding='SAME')
  38. hidden = tf.nn.relu(conv + layer2_biases)
  39. shape = hidden.get_shape().as_list()
  40. reshape = tf.reshape(hidden, [shape[0], shape[1] * shape[2] * shape[3]])
  41. hidden = tf.nn.relu(tf.matmul(reshape, layer3_weights) + layer3_biases)
  42. return tf.matmul(hidden, layer4_weights) + layer4_biases
  43.  
  44. # Training computation.
  45. logits = model(tf_train_dataset)
  46. loss = tf.reduce_mean(
  47. tf.nn.softmax_cross_entropy_with_logits(logits, tf_train_labels))
  48.  
  49. # Optimizer.
  50. optimizer = tf.train.GradientDescentOptimizer(0.05).minimize(loss)#梯度下降
  51.  
  52. # Predictions for the training, validation, and test data.
  53. train_prediction = tf.nn.softmax(logits)
  54. valid_prediction = tf.nn.softmax(model(tf_valid_dataset))
  55. test_prediction = tf.nn.softmax(model(tf_test_dataset))

这里看程序的话感觉好像是计算了,尤其是最后几句话,其实并没有计算的,下一步才是使用session来计算。

  1. num_steps = 1001
  2. #batch_size=16
  3. with tf.Session(graph=graph) as session:
  4. #tf.global_variables_initializer().run()#for old version of tf0
  5. session.run(tf.initialize_all_variables())
  6. print('Initialized')
  7. for step in range(num_steps):
  8. offset = (step * batch_size) % (train_labels.shape[0] - batch_size)#这句是防止迭代次数过多超出数据集范围,就通过取余数改变取batch的偏置
  9. batch_data = train_dataset[offset:(offset + batch_size), :, :, :]
  10. batch_labels = train_labels[offset:(offset + batch_size), :]
  11. feed_dict = {tf_train_dataset : batch_data, tf_train_labels : batch_labels}
  12.  
  13. _, l, predictions = session.run(
  14. [optimizer, loss, train_prediction], feed_dict=feed_dict)
  15. if (step % 50 == 0):
  16. print('Minibatch loss at step %d: %f' % (step, l))
  17. print('Minibatch accuracy: %.1f%%' % accuracy(predictions, batch_labels))
  18. print('Validation accuracy: %.1f%%' % accuracy(
  19. valid_prediction.eval(), valid_labels))
  20. print('Test accuracy: %.1f%%' % accuracy(test_prediction.eval(), test_labels))

以上就是实用卷积神经网络简单的区分not_MNIST数据的程序,池化层我还没加上,还有dropout防止过拟合也没有添加,待续。先看rfcn吧。

[DL学习笔记]从人工神经网络到卷积神经网络_3_使用tensorflow搭建CNN来分类not_MNIST数据(有一些问题)的更多相关文章

  1. [DL学习笔记]从人工神经网络到卷积神经网络_2_卷积神经网络

    先一层一层的说卷积神经网络是啥: 1:卷积层,特征提取 我们输入这样一幅图片(28*28): 如果用传统神经网络,下一层的每个神经元将连接到输入图片的每一个像素上去,但是在卷积神经网络中,我们只把输入 ...

  2. [DL学习笔记]从人工神经网络到卷积神经网络_1_神经网络和BP算法

    前言:这只是我的一个学习笔记,里边肯定有不少错误,还希望有大神能帮帮找找,由于是从小白的视角来看问题的,所以对于初学者或多或少会有点帮助吧. 1:人工全连接神经网络和BP算法 <1>:人工 ...

  3. tensorflow学习笔记五:mnist实例--卷积神经网络(CNN)

    mnist的卷积神经网络例子和上一篇博文中的神经网络例子大部分是相同的.但是CNN层数要多一些,网络模型需要自己来构建. 程序比较复杂,我就分成几个部分来叙述. 首先,下载并加载数据: import ...

  4. Deep Q-Network 学习笔记(二)—— Q-Learning与神经网络结合使用(有代码实现)

    参考资料: https://morvanzhou.github.io/ 非常感谢莫烦老师的教程 http://mnemstudio.org/path-finding-q-learning-tutori ...

  5. 深度学习:Keras入门(二)之卷积神经网络(CNN)

    说明:这篇文章需要有一些相关的基础知识,否则看起来可能比较吃力. 1.卷积与神经元 1.1 什么是卷积? 简单来说,卷积(或内积)就是一种先把对应位置相乘然后再把结果相加的运算.(具体含义或者数学公式 ...

  6. 深度学习:Keras入门(二)之卷积神经网络(CNN)【转】

    本文转载自:https://www.cnblogs.com/lc1217/p/7324935.html 说明:这篇文章需要有一些相关的基础知识,否则看起来可能比较吃力. 1.卷积与神经元 1.1 什么 ...

  7. 深度学习:Keras入门(二)之卷积神经网络(CNN)(转)

    转自http://www.cnblogs.com/lc1217/p/7324935.html 1.卷积与神经元 1.1 什么是卷积? 简单来说,卷积(或内积)就是一种先把对应位置相乘然后再把结果相加的 ...

  8. Spring MVC 学习笔记12 —— SpringMVC+Hibernate开发(1)依赖包搭建

    Spring MVC 学习笔记12 -- SpringMVC+Hibernate开发(1)依赖包搭建 用Hibernate帮助建立SpringMVC与数据库之间的联系,通过配置DAO层,Service ...

  9. 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec

    人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...

随机推荐

  1. IntelliJ IDEA 13 破解安装(JRebel 5.6.3a皴)

    首先安装IntelliJ 13,记住下载Ultimate Edition版本号,否则就必须打破..   安装到本地.然后一些配置(这一步不能.不过考虑到交换系统后,保存,建议做) 打开{install ...

  2. 命令行配置源和安装本地rpm包

    因为Firefox的在写博客时提交代码会丢失缩进,所以打算安装Chrome来写博,还不错,学到了两条命令- [shell] sudo yum-config-manager --add-repo=htt ...

  3. GDI+ 摘要: 保存图像文件

    要保存图像文件,必须先获得图像的编码格式信息.可是GDI+没有直接提供这个函数:GetEncoderClsid(const WCHAR* format, CLSID* pClsid) 因此须要我们自己 ...

  4. leetcode[67] Plus One

    题目:对一个用vector存的数字进行加1,然后返回加1后的值. 一次就在oj上通过了. 就是进位加上当前位如果大于9,那就当前位等于0: 随后进位还为1的话就是在数组前面插入一个1: class S ...

  5. PLSQL配置登录用户信息

    PLSQL配置登录用户信息 2012-08-30 08:47:02     我来说两句      作者:lsxy117 收藏    我要投稿 PLSQL配置登录用户信息   工作中经常使用PLSQL ...

  6. Tabs - 选项卡插件

        接上篇Tabs  - 选项卡插件  其中12)Yet (E)Another Tab Interface没有依赖任何javascript框架,以作补充          9)Flipping C ...

  7. javascript Function.prototype.bind

    语法: fn.bind(obj,arg1,arg2,arg3...) bind是es5新增的方法,顾名思义,它的作用是将函数绑定到某个对象上,就像是某个对象调用方法一样.其本质还是改变了该函数的上下文 ...

  8. ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork 制作一个添加新闻功能

    本文将交大伙怎么集成ASP.NET MVC + 百度富文本编辑器 + EasyUi + EntityFrameWork来制作一个新闻系统 先上截图: 添加页面如下: 下面来看代码部分 列表页如下: @ ...

  9. SpringMVCURL请求到Action的映射规则

    SpringMVC学习系列(3) 之 URL请求到Action的映射规则 在系列(2)中我们展示了一个简单的get请求,并返回了一个简单的helloworld页面.本篇我们来学习如何来配置一个acti ...

  10. 【值得收藏】数据分析和可视化软件IDL的学习资料汇编【可免费下载】

    IDL学习教程 IDL 是一种数据分析和图像化应用程序及编程语言,最初在七十年代后期用于帮助科学家分析火星探险卫星发回的数据.此后,IDL得到广泛运用,使用者日众.IDL能使用户可以迅速且方便地运用此 ...