手写字的识别,主要是预测这个子是几,每次的输出都是一个标签来标识是几。但是我想把例子改一下,改成预测某个数字是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图片:
*****************第二步构建卷积网络对为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的概率:
预测1为1的概率:
完全符合预期。
********************第三步测试其他不为1的图片和为1的图片的概率******