精华内容
下载资源
问答
  • 怎么才能让自己字写好
    千次阅读
    2021-04-18 12:33:19

    很有意思!虽然不是码农,但是没想到字体也这么有讲究!学习了!

    --------------------------

    最合适写代码的字体

    每天盯着屏幕写代码,自然需要寻找一种看得舒服的字体,能让自己的代码赏心悦目,一般来说,我们选择用于显示代码的字体,有如下几个要求:

    字母的宽度一致

    或称为等宽字体,由于代码文件是普通文本,不带样式的,所以宽度一致易于排列和对齐,能迅速找到位置,提高可读性。

    印刷术中这种等宽字体称之为monospaced字体,他是字体中的一个大分类(family),如常见的Courier和Courier

    New。由于考虑到现在的多语言环境,在不同的系统中,要将这个字体在不同字符集下映射到不同的具体字体上去,比如,一般我们的系统都会把中文的映射到“宋体”上。

    轮廓清晰规则

    只有清晰和规则的外形才能迅速分辨不同的字符,并且在长时间的阅读下不容易感觉到疲劳

    在这里要说的是,西方人和东方人在对字体大小上的不同,我认识一些老外,写程序的时候喜欢使用10px的字体来显示代码,而且使用的屏幕分辨率还很高,这是因为他们的文字是字母文字,每个字母的细节少,使用小字体可以在一个屏幕上显示更多内容。所以使用具有清晰和规则的字体,在字体较小的情况下,依然能在屏幕上快速分辨。

    l,1,i易于分辨

    0,o,O易于分辨

    前三个是小写L,数字1和小写I,

    后三个是数字0,小写o和大写O,这几个字母在代码中常容易混淆。

    例如,C风格的代码中,长整型数字要在数字后加后缀L来表示,像“111111111111L”,一般我们推荐都是使用大写的“L”目的就是为了防止混淆,而如果字体中这3中字母可以很容易分辨,那么即使我们误打成了小写l,也不会混淆。

    清晰易分辨的标点

    标点在代码中也占了非常重要的部分,如果一个字体不能很好区分逗号“,”和句号“.

    ”,“:”和“;”,那么不能说是一个好字体,同样,“`”“’”也最好能是配对的形式,这在某些编程中常常用到。

    选择哪种字体?

    有了以上一些参考标准之后,我们来看一些常见的字体

    宋体

    所有的中文Windows系统都自带宋体,而且宋体同时又是一个中文字体,涵盖了几乎所有的字符,在某些特殊场合,需要同时出现中文和英文的代码时,会考虑直接使用宋体。宋体由于主要照顾中文字符,而中文字符是等宽的,所以在考虑英文字符的时候,也考虑为等宽的,宽度为中文字符的一半。但是宋体的点阵英文字体并不美观,由于有衬线,导致在屏幕上小字号时的可读性较低。“0”和“O”以及“l”和“1”的区分不是很完美。

    Courier New

    这个字体也是每个

    Windows都会带的,字体很好看,除了o O 0的区别,也是很多人在编程中使用的。

    Bitstream Vera Sans Mono

    最后我要向大家推荐Bitstream Vera Sans Mono,以及他的衍生字体DejaVu Sans

    Mono——DejaVu扩展了一些Unicode中的字符。

    这也是很多开发者推荐的字体,除了完全满足上面说的所有条件之外,又是TTF字体,基本字形是无衬线的,适合屏幕阅读,最重要的还是开源的字体!

    MONACO(本人最爱,强烈推荐—by

    wwang,示例如下)

    a4c26d1e5885305701be709a3d33442f.png

    源于Mac上的一款字体,(Apple不愧是truetype之父啊,老乔也是练过书法的,品质自然不同),目前非常流行,在许多视频教程中都能看到(例如FireBug的控制台默认字体就是他)。

    然而和Mac上的很多字体一样,在完全微调(Full

    hinting)下字体会有些变形,反而效果不佳,最好使用轻微微调或者是无微调,所以在Windows系统上,效果差强人意。

    Consolas

    微软新开发的字体,Vista、Office2007、Visual Studio

    2005中包含它。既然是MS出品,则肯定在ClearType下效果最佳。不过官方网站的安装包很累赘,还需要先安装.net

    framework 3.5。

    更多相关内容
  • 使用Tensorflow和MNIST识别自己手写的数字

    万次阅读 多人点赞 2017-03-27 06:17:32
    最近在学习神经网络相关的东西,发现有很多资料是Tensorflow...如何将官方程序变成自己可以利用的程序,网上似乎资料比较少,所以我就来介绍一下如何使用Tensorflow和MNIST搭建自己的手写识别算法,识别自己写的数字。

    使用Tensorflow和MNIST识别自己手写的数字

    最近在学习神经网络相关的东西,发现有很多资料是Tensorflow教程上的内容,但是教程很多只是一个验证官方程序的过程。如何将官方程序变成自己可以利用的程序,网上似乎资料比较少,所以我就来介绍一下如何使用Tensorflow和MNIST搭建自己的手写识别算法,识别自己写的数字(比如下面我写的这个苍劲有力的3~~)。本文也参考了国外大神博客的内容。纯新手,之前在博客上收益良多,也希望能帮助和我一样刚刚起步的童鞋,大家多多指教。
    就来识别这个我写的3吧
    内容如下:
    - Tensorflow和MNIST简介
    - CNN算法
    - 训练程序
    - 写数字,并用Opencv进行预处理
    - 将图片输入网络进行识别


    Tensorflow和MNIST简介

    TensorFlow™ 是一个采用数据流图,用于数值计算的开源软件库。它是一个不严格的“神经网络”库,可以利用它提供的模块搭建大多数类型的神经网络。它可以基于CPU或GPU运行,可以自动使用GPU,无需编写分配程序。主要支持Python编写,但是官方说也有C++使用界面。

    MNIST是一个巨大的手写数字数据集,被广泛应用于机器学习识别领域。MNIST有60000张训练集数据和10000张测试集数据,每一个训练元素都是28*28像素的手写数字图片。作为一个常见的数据集,MNIST经常被用来测试神经网络,也是比较基本的应用。

    CNN算法

    识别算法主要使用的是卷积神经网络算法(CNN)。
    图1.CNN算法结构
    主要结构为:输入-卷积层-池化层-卷积层-池化层-全连接层-输出

    卷积
    卷积其实可以看做是提取特征的过程。如果不使用卷积的话,整个网络的输入量就是整张图片,处理就很困难。
    这里写图片描述
    (这里使用了参考了别人博客中的内容,来源记不清了TAT)
    假设图中绿色5*5矩阵为原图片,黄色的3*3矩阵就是我们的过滤器,即卷积核。将黄色矩阵和绿色矩阵被覆盖的部分进行卷积计算,即每个元素相乘求和,便可得到这一部分的特征值,即图中的卷积特征。
    然后,向右滑动黄色的矩阵,便可继续求下一部分的卷积特征值。而滑动的距离就是步长。

    池化
    池化是用来把卷积结果进行压缩,进一步减少全连接时的连接数。
    这里写图片描述
    池化有两种:
    一种是最大池化,在选中区域中找最大的值作为抽样后的值;
    一种是平均值池化,把选中的区域中的平均值作为抽样后的值。

    实现过程

    1.训练程序

    这里我就先把程序贴出来,主体和tensorflow教程上大致相同。值得注意的是其中的saver部分,将训练的权重和偏置保存下来,在评价程序中可以再次使用。

    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets('MNIST_data', one_hot=True)
    
    
    import tensorflow as tf
    
    sess = tf.InteractiveSession()
    
    
    x = tf.placeholder(tf.float32, shape=[None, 784])
    y_ = tf.placeholder(tf.float32, shape=[None, 10])
    W = tf.Variable(tf.zeros([784,10]))
    b = tf.Variable(tf.zeros([10]))
    
    
    sess.run(tf.global_variables_initializer())
    
    y = tf.matmul(x,W) + b
    
    cross_entropy = tf.reduce_mean(
        tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y))
    
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
    
    for _ in range(1000):
      batch = mnist.train.next_batch(100)
      train_step.run(feed_dict={x: batch[0], y_: batch[1]})
    correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
    
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    
    print(accuracy.eval(feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
    
    def weight_variable(shape):
      initial = tf.truncated_normal(shape, stddev=0.1)
      return tf.Variable(initial)
    
    def bias_variable(shape):
      initial = tf.constant(0.1, shape=shape)
      return tf.Variable(initial)
    
    def conv2d(x, W):
      return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
    
    def max_pool_2x2(x):
      return tf.nn.max_pool(x, ksize=[1, 2, 2, 1],
                            strides=[1, 2, 2, 1], padding='SAME')
    
    W_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])
    x_image = tf.reshape(x, [-1,28,28,1])
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)
    
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    
    W_fc1 = weight_variable([7 * 7 * 64, 1024])
    b_fc1 = bias_variable([1024])
    
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
    keep_prob = tf.placeholder(tf.float32)
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    
    y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2
    cross_entropy = tf.reduce_mean(
        tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
    correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    
    saver = tf.train.Saver()  # defaults to saving all variables
    
    sess.run(tf.global_variables_initializer())
    for i in range(20000):
      batch = mnist.train.next_batch(50)
      if i%100 == 0:
        train_accuracy = accuracy.eval(feed_dict={
            x:batch[0], y_: batch[1], keep_prob: 1.0})
        print("step %d, training accuracy %g"%(i, train_accuracy))
    
      train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5})
    saver.save(sess, '/home/XXX/learning_tensorflow/form/model.ckpt')  #保存模型参数,注意把这里改为自己的路径
    
    print("test accuracy %g"%accuracy.eval(feed_dict={
        x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0}))

    2.写数字,并用Opencv进行预处理

    训练好了网络,下一步就要测试它了。自己写一个数字,然后用Opencv预处理一下再扔到评价程序里,看看能不能准确识别。
    我们先来识别这张我开头写的3吧:(可以写得再奇怪一些,检测一下识别能力)
    我写的3
    下面我们就要对它进行预处理,缩小它的大小为28*28像素,并转变为灰度图,进行二值化处理。我使用的是Opencv对图像进行处理,也可以使用MATLAB等进行预处理。
    图片预处理程序如下:(程序改编自http://blog.csdn.net/skeeee/article/details/16844937,可以使用鼠标拖动选取框,对选取框中的图像进行处理)

    #include <opencv2/core/core.hpp>
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    #include <stdio.h>
    
    using namespace cv;
    using namespace std;
    
    cv::Mat org,dst,img,tmp;
    void on_mouse(int event,int x,int y,int flags,void *ustc)//event鼠标事件代号,x,y鼠标坐标,flags拖拽和键盘操作的代号
    {
        static Point pre_pt = cv::Point(-1,-1);//初始坐标
        static Point cur_pt = cv::Point(-1,-1);//实时坐标
        char temp[16];
        if (event == CV_EVENT_LBUTTONDOWN)//左键按下,读取初始坐标,并在图像上该点处划圆
        {
            org.copyTo(img);//将原始图片复制到img中
            sprintf(temp,"(%d,%d)",x,y);
            pre_pt = Point(x,y);
            putText(img,temp,pre_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255),1,8);//在窗口上显示坐标
            circle(img,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0);//划圆
            imshow("img",img);
        }
        else if (event == CV_EVENT_MOUSEMOVE && !(flags & CV_EVENT_FLAG_LBUTTON))//左键没有按下的情况下鼠标移动的处理函数
        {
            img.copyTo(tmp);//将img复制到临时图像tmp上,用于显示实时坐标
            sprintf(temp,"(%d,%d)",x,y);
            cur_pt = Point(x,y);
            putText(tmp,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));//只是实时显示鼠标移动的坐标
            imshow("img",tmp);
        }
        else if (event == CV_EVENT_MOUSEMOVE && (flags & CV_EVENT_FLAG_LBUTTON))//左键按下时,鼠标移动,则在图像上划矩形
        {
            img.copyTo(tmp);
            sprintf(temp,"(%d,%d)",x,y);
            cur_pt = Point(x,y);
            putText(tmp,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));
            rectangle(tmp,pre_pt,cur_pt,Scalar(0,255,0,0),1,8,0);//在临时图像上实时显示鼠标拖动时形成的矩形
            imshow("img",tmp);
        }
        else if (event == CV_EVENT_LBUTTONUP)//左键松开,将在图像上划矩形
        {
            org.copyTo(img);
            sprintf(temp,"(%d,%d)",x,y);
            cur_pt = Point(x,y);
            putText(img,temp,cur_pt,FONT_HERSHEY_SIMPLEX,0.5,Scalar(0,0,0,255));
            circle(img,pre_pt,2,Scalar(255,0,0,0),CV_FILLED,CV_AA,0);
            rectangle(img,pre_pt,cur_pt,Scalar(0,255,0,0),1,8,0);//根据初始点和结束点,将矩形画到img上
            imshow("img",img);
            img.copyTo(tmp);
            //截取矩形包围的图像,并保存到dst中
            int width = abs(pre_pt.x - cur_pt.x);
            int height = abs(pre_pt.y - cur_pt.y);
            if (width == 0 || height == 0)
            {
                printf("width == 0 || height == 0");
                return;
            }
            dst = org(Rect(min(cur_pt.x,pre_pt.x),min(cur_pt.y,pre_pt.y),width,height));
            cv::resize(dst,dst,Size(28,28));
            cvtColor( dst, dst, CV_BGR2GRAY );
            threshold(dst, dst, 170, 255, CV_THRESH_BINARY);
            imwrite("/media/sda/Ubuntu 14.0/myMNIST/MNIST_recognize/temp3.png",dst);//注意将这里改为自己的处理结果存储地址
            namedWindow("dst");
            imshow("dst",dst);
            waitKey(0);
        }
    }
    int main()
    {
        org = imread("/media/sda/Ubuntu 14.0/myMNIST/MNIST_recognize/num3.jpg");//读取图片地址
        org.copyTo(img);
        org.copyTo(tmp);
        namedWindow("img");//定义一个img窗口
        setMouseCallback("img",on_mouse,0);//调用回调函数
        imshow("img",img);
        cv::waitKey(0);
    }

    完成预处理程序后,我们得到了这样的图片:
    处理后图片
    这就是28*28的二值化后的图片,这样的格式和我们MNIST数据集中的图片格式相同。只有这样,我们才能将图片输入到网络中进行识别。

    3.将图片输入网络进行识别

    这里我是编写了一个前向传播的程序,最后softmax层分类的结果就是最后的识别结果啦。
    程序如下:(这里参考了一个外网的博客,地址不记得了。。。)

    from PIL import Image, ImageFilter
    import tensorflow as tf
    import matplotlib.pyplot as plt
    import cv2
    
    def imageprepare():
        """
        This function returns the pixel values.
        The imput is a png file location.
        """
        file_name='/home/mzm/MNIST_recognize/p_num2.png'#导入自己的图片地址
        #in terminal 'mogrify -format png *.jpg' convert jpg to png
        im = Image.open(file_name).convert('L')
    
    
        im.save("/home/mzm/MNIST_recognize/sample.png")
        plt.imshow(im)
        plt.show()
        tv = list(im.getdata()) #get pixel values
    
        #normalize pixels to 0 and 1. 0 is pure white, 1 is pure black.
        tva = [ (255-x)*1.0/255.0 for x in tv] 
        #print(tva)
        return tva
    
    
    
        """
        This function returns the predicted integer.
        The imput is the pixel values from the imageprepare() function.
        """
    
        # Define the model (same as when creating the model file)
    result=imageprepare()
    x = tf.placeholder(tf.float32, [None, 784])
    W = tf.Variable(tf.zeros([784, 10]))
    b = tf.Variable(tf.zeros([10]))
    
    def weight_variable(shape):
      initial = tf.truncated_normal(shape, stddev=0.1)
      return tf.Variable(initial)
    
    def bias_variable(shape):
      initial = tf.constant(0.1, shape=shape)
      return tf.Variable(initial)
    
    def conv2d(x, W):
      return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
    
    def max_pool_2x2(x):
      return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')   
    
    W_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])
    
    x_image = tf.reshape(x, [-1,28,28,1])
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)
    
    W_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    
    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    
    W_fc1 = weight_variable([7 * 7 * 64, 1024])
    b_fc1 = bias_variable([1024])
    
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1)
    
    keep_prob = tf.placeholder(tf.float32)
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    
    W_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    
    y_conv=tf.nn.softmax(tf.matmul(h_fc1_drop, W_fc2) + b_fc2)
    
    init_op = tf.initialize_all_variables()
    
    
    
    """
    Load the model2.ckpt file
    file is stored in the same directory as this python script is started
    Use the model to predict the integer. Integer is returend as list.
    
    Based on the documentatoin at
    https://www.tensorflow.org/versions/master/how_tos/variables/index.html
    """
    saver = tf.train.Saver()
    with tf.Session() as sess:
        sess.run(init_op)
        saver.restore(sess, "/home/mzm/MNIST_recognize/form/model2.ckpt")#这里使用了之前保存的模型参数
        #print ("Model restored.")
    
        prediction=tf.argmax(y_conv,1)
        predint=prediction.eval(feed_dict={x: [result],keep_prob: 1.0}, session=sess)
        print(h_conv2)
    
        print('recognize result:')
        print(predint[0])

    通过这个程序,得到最后的识别结果截图如下:
    识别结果
    可以看到识别的结果为3。(花费时间包括了我关闭图像的时间,不是识别的时间。真正的识别时间和计算机的配置有关,使用GPU的话,会小于0.5秒。)
    大功告成!

    整个识别自己手写数字的过程就是这样,参考了很多大神编写的程序,在自己编写的过程中还是学到了不少。博客是过了一段时间写的,预处理程序重新写了一下,如有错误,还请多多指教啊。

    展开全文
  • 上一节我们自己写代码训练了只有一个神经元的反相器,它虽然只有一点点代码,但却我们加深了梯度下降算法和反向传播算法的理解。只要勇敢的迈出这一步后,我们就可以勇敢的尝试它:深度学习中的hello wold–识别...

    上一节我们自己写代码训练了只有一个神经元的反相器,它虽然只有一点点代码,但却让我们加深了梯度下降算法和反向传播算法的理解。只要勇敢的迈出这一步后,我们就可以勇敢的尝试它:深度学习中的hello wold–识别手写数字。

    只有自己写过的代码,才能完全的理解它的用意,不管它多烂,多糟糕,它确是完全属于你的东西。在训练处反相器以后,我开始大胆的尝试自己写一个全连接的神经网络,来训练手写数字。这并不难,也不需要多少代码,我大概花了半天的时间就写完了所有的代码,你也不妨来试试…
    你也可以到这里下载源码:
    mnist-java
    代码结构如下:
    这里写图片描述

    可以看到,我的思路是这样的:
    神经网络(NerualNetwork)由层(Layer)构成,层(Layer)由神经元构成(Nerve)。这种思路非常直观,但它似乎并不是很好的设计,因为代码显得比较繁琐。希望你能设计出更好的结构,或许取消Nerve对象,所有逻辑都放在Layer中更好,这样会大量用到二维数组…

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class DeepLearn3Test {
    	static List<DigitImage> trains = null ;
    	static List<DigitImage> tests = null;
    	public static void main(String[] args) {
    		//load mnist
    		ReadFile rf1=new ReadFile("train-labels.idx1-ubyte","train-images.idx3-ubyte");
    		ReadFile rf2=new ReadFile("t10k-labels.idx1-ubyte","t10k-images.idx3-ubyte");
    		try {
    			tests = rf2.loadDigitImages();
    			trains =rf1.loadDigitImages();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		
    
    		int size[]={784,40,20,10};
    		NeuralNetwork network = new NeuralNetwork(size);
    		network.radomInitWandB();
    		
    		double image[] = new double[784];
    		
    		for(int kk=0;kk<10;kk++){
    			//first: set input
    			for(int count=0;count<trains.size();count++){
    				for(int i=0;i<784;i++){
    					image[i] = (int)(trains.get(count).imageData[i]&0xff);
    				}
    				network.setInput(image);
    				//second: forward cal output
    				double[] output = network.forwardProc();
    				//third: backward cal delta
    				double[] y = new double[10];
    				for(int i=0;i<y.length;i++){
    					if(i==trains.get(count).label){
    						y[i] = 1;
    					}else{
    						y[i] = 0;
    					}
    				}
    				network.backwarkProc(y);
    				//fouth: update w and b
    				network.updateWAndB(0.5);
    			}
    			System.out.println("finished train count: "+kk);
    		}
    
    
    		
    		
    		boolean isTest = true;
    		//test
    		if(isTest){
    			int countCorrect=0;
    			for(int count=0;count<tests.size();count++){
    				for(int i=0;i<784;i++){
    					image[i] = (int)(tests.get(count).imageData[i]&0xff);
    				}
    				network.setInput(image);
    				//second: forward cal output
    				int number = network.testDigitalImage();
    				if(number==tests.get(count).label)countCorrect++;
    				//System.out.println("count is : "+count+"  number is: "+number+"  label is:  "+tests.get(count).label);
    			}	
    			System.out.println("countCorrect: "+countCorrect);
    		}
    
    	}
    }
    

    代码的思路非常简单:
    1、load mnist
    装在mnist的代码我是从网上找到的,我不知道怎么写,非常感谢牛人的分享。
    2、构建神经网络
    这里构建了一个四层的神经网络

    int size[]={784,40,20,10};
    

    第一层有784个神经元,对应784个像素,中间有两个隐藏层,输出层有10个神经元,对应0~9 共10个数字。

    2、训练
    2-1 设置输入

    network.setInput(image);
    

    2-1 计算输出

    double[] output = network.forwardProc();
    

    2-2 反向传播计算误差

    network.backwarkProc(y);
    

    2-3 跟新权重和偏置

    network.updateWAndB(0.5);
    

    反复重复2中的四步,实现对神经网络的训练。训练完成后,进行测试:
    测试只需要计算输出,然后比对输出是否正确即可。
    这里写图片描述

    经过训练以后,这个神经网络的能正确识别6945个数字,总共是10000个,因此准确率接近70%。对深度学习而言,这并不是值得兴奋的结果,但是,也有值得兴奋的地方。想想,如果不经过训练,我们的神经网络识别的准确率应该是随机的,应该在10%左右,这意味着,我们的神经网络会学习了,虽然它还不够聪明,考试的成绩还不够好,但他似乎已经找到了方向,他变得可以教育了,这让我对他的未来充满期待…


    我最近重写的卷积神经网络CupCnn,在mnist数据集上准确率已经能达到99%了,CupCnn也是用java写的,但是代码更规范,更加模块化,以下是CupCnn在github上的地址,欢迎大家下载:
    CupCnn
    更多详情请参考我的博文:
    java写卷积神经网络—CupCnn简介

    展开全文
  • 很多人都会因为自己不同的需求而想要知道有些字体到底是什么字体。学生会因为一些很有特色,为之所吸引,想要去查找。设计师会因为客户的需求,从而要想尽办法去找到字体。有字体爱好的人会因为看到的字体想要而...

    很多人都会因为自己不同的需求而想要知道有些字体到底是什么字体。学生会因为一些字很有特色,为之所吸引,想要去查找。设计师会因为客户的需求,从而要想尽办法去找到字体。有字体爱好的人会因为看到好的字体想要而去寻找收藏。还有很多是其他原因而想要得到这个字体的等。但是他们都有一个共同的难题,就是不知道是什么字体而无从查找。

    首先如果说仅仅只是单凭字的形状外表而能完全的的说出所有的字体是什么字体,那么在短时间内去学习,那是基本上不可能的,除非是个记忆天才,但前提条件你也得要看个遍所有的字体才能记住。但对于普通正常人而言,想要做到只凭自己就能对所有的字体能够说出其名字,那得要经过多年对字体方面的使用和积累从而能够记住并判断,但也有会记错,而且在遇到一些较陌生的字体如一些国外的英文,日文字体,也是很难能够说出来的。

    那么我们如何去识别判断呢?为了能够帮助大家解决这个问题,我会在下面告诉大家一个快速在线识别字体工具的使用,从而通过这个方法来解决字体不会识别判断的问题。除此之外,我也会告诉大家一些最基本最常见的字体有哪类,且有什么特点,从而也能够快速对这些基本的字体能够了解和对其认识。

    先讲最基本的字体有哪几类吧,并且这类字体的特点是怎么样的。

    黑体

    黑体这类字体它的特点是字形端庄,笔画横平竖直,笔迹全部一样粗细且没有衬线装饰。写出来的每一个字都是方方正正的所以又会称之为方体或者说是等线体。

    news_show_1296847.shtml

    宋体

    宋体,笔画有粗细变化,而且一般是横细竖粗,最明显的特点就是笔画的端点有明显形状,就是点、撇、捺、钩等尖端,算是我们见的最多最常见的一种字体,我们平时的书本,报纸等也基本都是宋体字。

    news_show_1296847.shtml

    隶书

    隶书是个人最喜欢的字体一种,感觉每一个字都能体现写字人写字的功力,字形多呈宽扁,横画长而竖画短,讲究"蚕头雁尾"、"一波三折",这里可能大家看到雁尾可能会觉得我成语字写错,觉得是燕子的燕,但是我们这里是来形容隶书的,因为他的尾部笔落正如同大雁这般下来。写隶书更多的是注重耐心,且写的速度也会比较缓慢,因为它的每一笔画都要很细心才行。

    news_show_1296847.shtml

    楷书

    楷书是由隶书的变化而来,可以说实在隶书的基础上更加的简便。楷书的点画有点、横、竖、撇、捺、提(挑)、折、钩八种。一般具体在书写时,横画、竖画、撇画的起笔以及横画的收笔多做顿笔;撇画收笔处逐渐提笔出锋;捺画收笔时先逐渐铺毫重顿,再渐渐提笔出锋;笔画转折之处往往为顿笔,钩画为一种特殊的转折,在停驻之后挑笔出锋,这一点也是楷书的独特点画表现。

    news_show_1296847.shtml

    草书

    草书是因为字写得很潦草,而导致很难看的清所以而叫草书,其特点是结构简省、笔画连绵,因为为了能够更加快速的写出来。但是辨识是什么字却成了很大的问题。

    news_show_1296847.shtml

    以上便是最基本的字体类型的特点,相信知道了它们的特点写法,辨认出来是什么类型的字体很容易的事情,还有一些行书字体或者其他的一些字体类型,也是由上面这5种字体的特色演变或者其中更改结合而来。

    知道了上面这5种字体类型,那么就代表着我们会对最基本的字体进行判断了。接下来我为大家讲解一个识别字体工具的识别方法,通过会使用这个识别字体工具而能够快速准确的判断是什么字体。

    首先我们先到在线识别字体工具网识字体网上,然后在点击图片上传需要识别的字体或者截图然后ctrl+v粘贴也行。

    news_show_1296847.shtml

    如果对于一些要识别的字体图片过于模糊,倾斜,不整齐等,可以通过使用下面的功能是字体图片变得更加清晰整齐如阈值调节清晰度,旋转调整一些歪的字体等。因为图片清晰整齐会使得识别出来的字体更加的准确无误。

    news_show_1296847.shtml

    之后便在相对应的字的下面小方格中打出相对应的字。但如果智能拼图没有拼成一个完整的字的话,就要利用下面的手动拼图(也就是拖动字体使之拼凑成完整的字),然后拼成后,在像刚才说的那样在相对应的字的小方格中打出相对应的字就好了。

    news_show_1296847.shtml

    最后点击开始识别下面便会出现识别出来的字体了。

    news_show_1296847.shtml

    还会因为好看的字体因为不知道是什么字体而找不到苦恼?不会了,学会了以上的知识,了解了基本字体的类型,掌握了识别判断字体的方法,我们想要知道的字体都可以解决了。

    展开全文
  • 一手好字:硬笔书法轻松自学指南(知乎周刊 Plus) 知乎编辑团队 楷书,认知好字的范本 2017-03-16 《黄自元间架结构九十二法》 选本字帖 2017-03-16 先谈书体。 前人对练习书法的程序,各有主张。有的认为...
  • 《IDA Pro代码破解揭秘》 《IDA Pro权威指南(第2版)》 在最后 如果你想进大厂,想升职加薪,或者对自己现有的工作比较迷茫,都可以私信我交流,希望我的一些经历能够帮助到大家~~ 推荐阅读: 《全网最全性能...
  • 给学弟学妹们了个 15W 的图解操作系统!

    万次阅读 多人点赞 2021-05-11 09:04:11
    不知不觉在 CSDN 里了 23 篇图解操作系统的系列文章,总字数高达 15W ,而且每篇都配了很多自己手绘的图,也算有个体系了。 然后图解操作系统文章也帮助到了很多读者,时不时都会有读者给小林发感谢信,说我的...
  • 作为一个在互联网公司面一次拿一次offer的面霸(请允许我使用一下夸张的修辞手法),打败了无数竞争对手,每次都只能看到无数落寞的身影失望的离开,略感愧疚,在一个寂寞难耐的夜晚,我痛定思痛,决定开始《吊...
  • 别人的代码看起来容易,自己写未必 古人云说起来容易,做起来难。就像我们看小说一样,我们看完小说都看得懂,里面的人物事件都搞得清清楚楚,可这不代表我们能得出来。对于我们这些码农来说,有些...
  • 文章,我在CSDN赚了1.27万!

    千次阅读 多人点赞 2021-09-06 09:36:23
    沉淀、分享、成长,让自己和他人都能有所收获!???? 一、嘿,赚了钱嘞 ????CSDN 5.1K下载量,可提现收入1.2W! 了两年博客,用了两年的4个服务器,终于能回点本了,一年前还得靠薅羊毛填补服务器成本。讲道理真难...
  • 有哪些程序员受益终生的建议

    万次阅读 多人点赞 2019-10-28 07:11:59
    读了这篇文章,你将知道如何才能进大厂,如何实现财务自由,如何在工作中游刃有余,这篇文章很长,但绝对是精品,记得帮我点赞哦!!!! 一腔肺腑之言,能看进去多少,就看你自己了!!! 目录: 在校生篇: ...
  • 【小白】如何写好自己的一篇CSDN博客(美化1)

    万次阅读 多人点赞 2018-11-30 19:34:42
    (下面是我个人完几篇blog的心得,你拥有炫酷博客~) 目录(一) 创建自己第一篇文章(二)个人主页美化 (一) 创建自己第一篇文章 登录CSDN,找到它,点击开始你的第一篇博客。 CSDN主要有两种...
  • 如何写好一份前端简历

    千次阅读 多人点赞 2019-02-17 23:52:26
    简历不是一份记流水账的东西,而是用人方了解你的亮点。 要应付并通过面试并不难,但是,千万不要应付你的人生,你学技术不是用来面试的,它至少来说是你谋生的技能,要尊重自己的谋生技能,说不定,哪天你还要用...
  • 博客的2年,我有12万+粉丝了,还上了百度百科!

    万次阅读 多人点赞 2021-06-21 10:10:48
    沉淀、分享、成长,让自己和他人都能有所收获!???? 一、粉丝还不少! 12万+的粉丝,在哪? 公众号:3万+、CSDN:5万+、思否: 2万+、Github: 1万+,其他平台:1万+,????合计 12万+ 粉丝。 如果仅公众号粉丝12万+...
  • 如何让自己发生质变
  • 杂谈_怎样写好英语

    千次阅读 2012-12-29 17:43:03
    但是就有人字写得奇烂,写完了连自己都不认识!不过你也别着急,英语书法是比较练的,要写一手漂亮的字,只需要十分钟即可,立竿见影。许多经我指点的学生,第二天交作业后,遭到老师的叱责,说他是找别人代写的...
  • wps中怎么样才能让文字竖着啊?WPS现在的应用比较多,其实WPS文字和Word相差不过,都是一个办公软件,我们有时候在编辑的时候需要把文字竖排,那么,wps文字怎么竖排呢?接下来脚本之家小编就给大家说说wps文字...
  • 目录 ...总体来说,对于程序员的简历,一切从简,不要弄的花里胡哨,简约的模板,简约的字体,颜色黑白就,要HR有看下去的欲望,内容要突出个人亮点,下面会细说,文末会分享我自己前段时间出去面
  • Team Leader 究竟要不要代码?

    千次阅读 热门讨论 2022-02-17 21:43:01
    当你成为 Team Leader,究竟还要不要代码?
  • 原标题:python如何打包一个完成的程序给别人分享使用看着别人在使用自己编写的软件,是如何一个心情呢?就像吃了一个美味,yum!yum!yum!比如我们用python做好了一个程序,然后我们想把他打包成exe文件,分享给别人...
  • policy) ,Redis淘汰一些数据,以腾出空间继续提供读写服务 : noeviction: 对可能导致增大内存的命令返回错误 (大多数命令,DEL除外) ; volatile-ttl: 在设置了过期时间的key中,选择剩余寿命 (TTL) 最短的key,...
  • 8000干货:那些很厉害的人是怎么构建知识体系的

    万次阅读 多人点赞 2019-09-29 11:18:27
    本文约8000,正常阅读需要15~20分钟。读完本文可以获得如下收益: 分辨知识和知识体系的差别 理解如何用八大问发现知识的连接点; 掌握致用类知识体系的构建方法; 能够应用甜蜜区模型找到特定领域来构建知识体系...
  • 再到后来,我开始做一些项目,接触了ORM的一些框架,比如hibernate和mybatis,这些框架甚至可以你完全不sql,只要调用一些增删改查的API即可,这我很长一段时间都忽略了SQL的重要性。 其实学习sql最复杂的...
  • 计算机专业学生,大三了找技术岗,怎么一份简历?内附269份简历模板 大家,我是好好学习,天天编程的博主,一个每天在互联网上种菜和砍柴的程序员。 因为疫情的影响,很多大一同学开学就是大二了,大三的同学...
  • 2.写好一封工作邮件,重要的不是“怎么写”,而是“什么该写,什么不该写”。 3.重要的备忘、通知和需要留底的话,最好通过工作邮件传递。 I、如何做到位极人臣?(奏章和来往批复的文件写得好) 回到古代,司马光跟...
  • 究竟怎样代码才算是代码

    万次阅读 多人点赞 2016-09-21 16:05:06
    今天我们来谈谈代码吧。代码重要吗?当然,代码就是设计(Jack W.Reeves, 1992);代码是最有价值的交付物。我们需要代码吗?在给“代码”下个定义之前,这个问题无法回答。那么,究竟什么是代码?看下面这...
  • 给Java 工程师们一封信

    千次阅读 多人点赞 2021-04-24 19:25:12
    我发现身边总有些小伙伴,刚学习Java的时候就去JavaWeb了,但是没打Java基础。有的小伙伴缺把Java基础学的很,然后再去学JavaWeb。这就造成了2中现象,第一种看似学的很快,但是后来会遇到很多措手不及的问题...
  • 今天这篇文章,讲通过对话的形式,你由浅入深着知道,为什么 Https 是安全的。 一、对称加密 一禅:在每次发送真实数据之前,服务器先生成一把密钥,然后先把密钥传输给客户端。之后服务器给客户端发送真实...
  • 坚持技术博客一年能有多少收获!

    万次阅读 多人点赞 2020-10-10 08:31:57
    沉淀、分享、成长,让自己和他人都能有所收获!???? 人怪不好意思的,小傅哥的粉丝破万了!???? 10.1 假期期间,公众号粉丝终于破万!是的,终于!因为与各大号主相比,我可能是涨粉最慢的号主了。但无论如何...
  • wps手机上怎么竖着

    千次阅读 2021-01-13 17:22:00
    1.手机版WPS怎么竖排WPS现在的应用比较多,其实WPS文字和Word相差不过,都是一个办公软件,我们有时候在编辑的时候需要把文字竖排,那么wps文字怎么竖排呢?wps文字怎么竖排首先我们把文字输入了之后,全部...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 466,733
精华内容 186,693
热门标签
关键字:

怎么才能让自己字写好