手写字的识别,主要是预测这个子是几,每次的输出都是一个标签来标识是几。但是我想把例子改一下,改成预测某个数字是1的概率多大。而不是识别出他是几,仅仅预测某个手写数字的概率。这个和我想做的视频质量的概率预测是相同的,想先以这个为例,逐步完成最终我想完成的目标。

*****************第一步先获取100张为1的图片*****************

from tensorflow.examples.tutorials.mnist import input_data
import tensorflow as tf
mnist = input_data.read_data_sets("./data/",one_hot=True)
import numpy as np
import scipy.misc
import os
save_dir = '.raw/'
seq = 0
i = 0
if os.path.exists(save_dir) is False:
    os.makedirs(save_dir)
while(True):
    if(seq == 100):
        break
    i = i+1
    image = mnist.train.images[i,:]
    image = image.reshape(28,28)
    lable = mnist.train.labels[i,:]
    if(1 == np.argmax(lable)):
        seq  = seq +1
        file = save_dir+'mnist_train_%d.jpg' % seq
        scipy.misc.toimage(image,cmin=0.0,cmax=1.0).save(file)

 成功获取到100张为1的jpg图片:

tensorflow之预测手写字的概率_TensorFlow

*****************第二步构建卷积网络对为1的图片进行训练**********

写了一个卷积函数,调试了半天,loss一直不收敛,真是头大。。。。。。。。调参数我是完全外行选手。我准备换个模型了,换成lenet-5的模型进行参数的调试。

通过调试,终于大概可以使用了。主要是需要调试几个参数:

第一个是学习率:不要设置太大,我这里设置的是learning_rate = 0.001

第二个是batch的大小,开始我设置的大小是1,就是每一次执行都会执行梯度下降,导致一直波动很大,但是当我把batch的值调整为10之后,就比较稳定了,后来把batch调整为100,由于我只有1000个样本,所以只执行了10次梯度下降,完全不能实现预测,当改为10之后,可以执行100次梯度计算,这样计算结果准确很多。

第三个就是初始化参数,记得tf.Variable(tf.truncated_normal(shape = [5, 5, 1, 32],mean=0,stddev=0.01)),默认的随机值导致预测很不准确。

下面上一下代码:我有1000个为1的正确样本,1000个不是1的手写字,然后预测是否为1的概率

""" Convolutional Neural Network.

Build and train a convolutional neural network with TensorFlow.
This example is using the MNIST database of handwritten digits
(http://yann.lecun.com/exdb/mnist/)

Author: Aymeric Damien
Project: https:///aymericdamien/TensorFlow-Examples/
"""

from __future__ import division, print_function, absolute_import

import tensorflow as tf
import cv2 as cv
import numpy as np
# Import MNIST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("/tmp/data/", one_hot=True)

# Training Parameters
learning_rate = 0.001
num_steps =200 #200
batch_size = 128
display_step = 1

# Network Parameters
num_input = 784 # MNIST data input (img shape: 28*28)
num_classes = 2 # MNIST total classes (0-9 digits)
dropout = 0.75 # Dropout, probability to keep units

# tf Graph input
X = tf.placeholder(tf.float32, [None, num_input],name="pic")
Y = tf.placeholder(tf.float32, [None, num_classes],name='lable')
keep_prob = tf.placeholder(tf.float32,name='prob') # dropout (keep probability)


# Create some wrappers for simplicity
def conv2d(x, W, b, strides=1):
    # Conv2D wrapper, with bias and relu activation
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')
    x = tf.nn.bias_add(x, b)
    return tf.nn.relu(x)


def maxpool2d(x, k=2):
    # MaxPool2D wrapper
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1],
                          padding='SAME')


# Create model
def conv_net(x, weights, biases, dropout):
    # MNIST data input is a 1-D vector of 784 features (28*28 pixels)
    # Reshape to match picture format [Height x Width x Channel]
    # Tensor input become 4-D: [Batch Size, Height, Width, Channel]
    x = tf.reshape(x, shape=[-1, 28, 28, 1])

    # Convolution Layer
    conv1 = conv2d(x, weights['wc1'], biases['bc1'])
    # Max Pooling (down-sampling)
    conv1 = maxpool2d(conv1, k=2)

    # Convolution Layer
    conv2 = conv2d(conv1, weights['wc2'], biases['bc2'])
    # Max Pooling (down-sampling)
    conv2 = maxpool2d(conv2, k=2)

    # Fully connected layer
    # Reshape conv2 output to fit fully connected layer input
    fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]])
    fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])
    fc1 = tf.nn.relu(fc1)
    # Apply Dropout
    fc1 = tf.nn.dropout(fc1, dropout)

    # Output, class prediction
    out = tf.add(tf.matmul(fc1, weights['out']), biases['out'])
    return out

# Store layers weight & bias
weights = {
    # 5x5 conv, 1 input, 32 outputs
    'wc1': tf.Variable(tf.truncated_normal(shape = [5, 5, 1, 32],mean=0,stddev=0.01)),
    # 5x5 conv, 32 inputs, 64 outputs
    'wc2': tf.Variable(tf.truncated_normal(shape = [5, 5, 32, 64],mean=0,stddev =0.01)),
    # fully connected, 7*7*64 inputs, 1024 outputs
    'wd1': tf.Variable(tf.truncated_normal(shape = [7*7*64, 1024],mean=0,stddev =0.01)),
    # 1024 inputs, 10 outputs (class prediction)
    'out': tf.Variable(tf.truncated_normal(shape = [1024, num_classes],mean=0,stddev = 0.01))
}

biases = {
    'bc1': tf.Variable(tf.random_normal([32])),
    'bc2': tf.Variable(tf.random_normal([64])),
    'bd1': tf.Variable(tf.random_normal([1024])),
    'out': tf.Variable(tf.random_normal([num_classes]))
}

# Construct model
logits = conv_net(X, weights, biases, keep_prob)
prediction = tf.nn.softmax(logits,name="op_to_store")

# Define loss and optimizer
loss_op = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
    logits=logits, labels=Y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
train_op = optimizer.minimize(loss_op)


# Evaluate model
correct_pred = tf.equal(tf.argmax(prediction, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))

# Initialize the variables (i.e. assign their default value)
init = tf.global_variables_initializer()

# Start training
with tf.Session() as sess:

    # Run the initializer
    sess.run(init)
    for i in range(1,101):
        for j in range(1,11):
            file = './raw/'+'mnist_train_%d.jpg' % ((i-1)*10+j)
            image = cv.imread(file,0)
            data1 = np.asarray(image,dtype=np.float32)
            data2 = np.reshape(data1,newshape =(1,-1))
            data3 = np.where(data2>0,data2,0)
            data3 =data3/255
            if(j ==1):
                s = data3
                l = np.array([[0,1]])
            else:
                s = np.concatenate((s,data3))
                l = np.concatenate((l,np.array([[0,1]])))
            # Run optimization op (backprop)
        sess.run(train_op, feed_dict={X: s, Y: l, keep_prob: 0.8})
                # Calculate batch loss and accuracy
        loss, acc = sess.run([loss_op, accuracy], feed_dict={X: s,Y: l,keep_prob: 1.0})
        print("Step " + str(i) + ", Minibatch Loss= " + \
                        "{:.4f}".format(loss) + ", Training Accuracy= " + \
                        "{:.3f}".format(acc))

        for j in range(1,11):
            file = './rawnot/'+'mnist_train_%d.jpg' % ((i-1)*10+j)
            image = cv.imread(file,0)
            data1 = np.asarray(image,dtype=np.float32)
            data2 = np.reshape(data1,newshape =(1,-1))
            data3 = np.where(data2>0,data2,0)
            data3 =data3/255
            if(j ==1):
                s = data3
                l = np.array([[1,0]])
            else:
                s = np.concatenate((s,data3))
                l = np.concatenate((l,np.array([[1,0]])))
            # Run optimization op (backprop)
        sess.run(train_op, feed_dict={X: s, Y: l, keep_prob: 0.8})

        


    print("Optimization Finished!")

    #constant_graph = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, ['op_to_store'])
    #with tf.gfile.FastGFile('modellenet.pb', mode='wb') as f:
        #f.write(constant_graph.SerializeToString()) 
    #Calculate accuracy for 256 MNIST test images
    #print("Testing Accuracy:", sess.run(accuracy, feed_dict={X: mnist.test.images[:256],Y: mnist.test.labels[:256],keep_prob: 1.0}))
    #print(sess.run(prediction,feed_dict={X: mnist.test.images[:1],keep_prob: 1.0}))

    picpath = 'C:/Users/shenwei/Desktop/test/tt/3.jpg'
    image = cv.imread(picpath,0)
#cvimag = np.zeros(image.shape, dtype=np.float32)
    data1 = np.asarray(image,dtype=np.float32)
    data2 = np.reshape(data1,newshape =(1,-1))
    data3 = np.where(data2>0,data2,0)
    data3 =data3/255
    print(sess.run(prediction,feed_dict={X: data3,keep_prob: 1.0}))

 预测3为1的概率:

 

tensorflow之预测手写字的概率_TensorFlow_02

预测1为1的概率:

tensorflow之预测手写字的概率_TensorFlow_03

完全符合预期。

 

 

********************第三步测试其他不为1的图片和为1的图片的概率******