3.2 Convolutional layer application
import tensorflow as tf
import math
import numpy as np
sess = tf.InteractiveSession()
# Make some fake data, 1 data points
#生成一个对角线上具有较大值的模拟10*10图像
image = np.random.randint(10,size=[1,10,10]) + np.eye(10)*10
# TensorFlow placeholder
# None is for batch processing
# (-1 keeps same size)
# 10x10 is the shape
# 1 is the number of "channels"
# (like RGB colors or gray)
x = tf.placeholder("float", [None, 10, 10])
x_im = tf.reshape(x, [-1,10,10,1])
### Convolutional Layer
# Window size to use, 3x3 here
winx = 3
winy = 3
# How many features to compute on the window
num_filters = 2
# Weight shape should match window size
# The '1' represents the number of
# input "channels" (colors)
W1 = tf.Variable(tf.truncated_normal(
[winx, winy,1, num_filters],
stddev=1./math.sqrt(winx*winy)))
b1 = tf.Variable(tf.constant(
0.1,shape=[num_filters]))
# 3x3 convolution, Pad with zeros on edges
# Strides is how to step, here 1 pixel at a time
xw = tf.nn.conv2d(x_im, W1,
strides=[1, 1, 1, 1],
padding='SAME')
h1 = tf.nn.relu(xw + b1)
# Remember to initialize!
sess.run(tf.global_variables_initializer())
# Peek inside
H = h1.eval(feed_dict = {x: image})
# Let's take a look
import matplotlib.pyplot as plt
plt.ion()
# Original
plt.matshow(image[0])
plt.colorbar()
# Conv channel 1
plt.matshow(H[0,:,:,0])
plt.colorbar()
# Conv channel 2
plt.matshow(H[0,:,:,1])
plt.colorbar()
3.4 Pooling layer application
#接 3.1 Convolutional layer application
### Pooling Layer
# "Max" pooling keeps best of 2x2 square
# in h1 output
# ksize defines size of this block
# "VALID" padding means incomplete squares are
# not used
# Stride of 2x2 means no overlap of 2x2 blocks
p1 = tf.nn.max_pool(h1, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='VALID')
# We automatically determine the size
p1_size = np.product([s.value for s in p1.get_shape()[1:]])
# Need to flatten convolutional output for use
# in a dense layer
# -1 chooses appropriate shape to keep overall
# size the same
p1f = tf.reshape(p1, [-1, p1_size ])
# Pooling Layer before flattening
# Note how it's only 5x5, because we took the
# best of every 2x2 window
P = p1.eval(feed_dict = {x: image})
plt.matshow(P[0,:,:,0])
plt.colorbar()
3.5 Deep CNN
import tensorflow as tf
import numpy as np
import math
from tqdm import tqdm
# Set random seed
np.random.seed(0)
# Load data
data = np.load('D:/python_data/data_with_labels.npz')
train = data['arr_0']/255.
labels = data['arr_1']
# Look at some data
# print(train[0])
# print(labels[0])
# If you have matplotlib installed
import matplotlib.pyplot as plt
plt.ion()
def to_onehot(labels,nclasses = 5):
'''
Convert labels to "one-hot" format.
>>> a = [0,1,2,3]
>>> to_onehot(a,5)
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.]])
'''
outlabels = np.zeros((len(labels),nclasses))
for i,l in enumerate(labels):
outlabels[i,l] = 1
return outlabels
onehot = to_onehot(labels)
# Split data into training and validation
indices = np.random.permutation(train.shape[0])
valid_cnt = int(train.shape[0] * 0.1)
test_idx, training_idx = indices[:valid_cnt],\
indices[valid_cnt:]
test, train = train[test_idx,:],\
train[training_idx,:]
onehot_test, onehot_train = onehot[test_idx,:],\
onehot[training_idx,:]
sess = tf.InteractiveSession()
# These will be inputs
## Input pixels, image with one channel (gray)
x = tf.placeholder("float", [None, 36, 36])
# Note that -1 is for reshaping
x_im = tf.reshape(x, [-1,36,36,1])
## Known labels
# None works during variable creation to be
# unspecified size
y_ = tf.placeholder("float", [None,5])
# Conv layer 1
num_filters = 4
winx = 5
winy = 5
W1 = tf.Variable(tf.truncated_normal(
[winx, winy, 1 , num_filters],
stddev=1./math.sqrt(winx*winy)))
b1 = tf.Variable(tf.constant(0.1,
shape=[num_filters]))
# 5x5 convolution, pad with zeros on edges
xw = tf.nn.conv2d(x_im, W1,
strides=[1, 1, 1, 1],
padding='SAME')
h1 = tf.nn.relu(xw + b1)
# 2x2 Max pooling, no padding on edges
p1 = tf.nn.max_pool(h1, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='VALID')
# Need to flatten convolutional output for use in dense layer
p1_size = np.product(
[s.value for s in p1.get_shape()[1:]])
p1f = tf.reshape(p1, [-1, p1_size ])
# Dense layer
num_hidden = 32
W2 = tf.Variable(tf.truncated_normal(
[p1_size, num_hidden],
stddev=2./math.sqrt(p1_size)))
b2 = tf.Variable(tf.constant(0.2,
shape=[num_hidden]))
h2 = tf.nn.relu(tf.matmul(p1f,W2) + b2)
# Output Layer
W3 = tf.Variable(tf.truncated_normal(
[num_hidden, 5],
stddev=1./math.sqrt(num_hidden)))
b3 = tf.Variable(tf.constant(0.1,shape=[5]))
keep_prob = tf.placeholder("float")
h2_drop = tf.nn.dropout(h2, keep_prob)
# Just initialize
sess.run(tf.global_variables_initializer())
# Define model
y = tf.nn.softmax(tf.matmul(h2_drop,W3) + b3)
### End model specification, begin training code
# Climb on cross-entropy
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits_v2(
logits = y + 1e-50, labels = y_))
# How we train
train_step = tf.train.GradientDescentOptimizer(
0.01).minimize(cross_entropy)
# Define accuracy
correct_prediction = tf.equal(tf.argmax(y,1),
tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(
correct_prediction, "float"))
# Actually train
epochs = 5000
train_acc = np.zeros(epochs//10)
test_acc = np.zeros(epochs//10)
for i in tqdm(range(epochs), ascii=True):
# Record summary data, and the accuracy
if i % 10 == 0:
# Check accuracy on train set
A = accuracy.eval(feed_dict={x: train,
y_: onehot_train, keep_prob: 1.0})
train_acc[i//10] = A
# And now the validation set
A = accuracy.eval(feed_dict={x: test,
y_: onehot_test, keep_prob: 1.0})
test_acc[i//10] = A
train_step.run(feed_dict={x: train,
y_: onehot_train, keep_prob: 0.5})
# Plot the accuracy curves
plt.figure(figsize=(6, 6))
plt.plot(train_acc,'bo')
plt.plot(test_acc,'rx')
100%|##############################################################################| 5000/5000 [03:24<00:00, 25.99it/s]
# Look at the final testing confusion matrix
pred = np.argmax(y.eval(
feed_dict={x: test, keep_prob: 1.0,
y_: onehot_test}), axis = 1)
conf = np.zeros([5,5])
for p,t in zip(pred,np.argmax(onehot_test,
axis=1)):
conf[t,p] += 1
plt.matshow(conf)
plt.colorbar()
# Let's look at a subplot of some weights
f, plts = plt.subplots(4)
for i in range(4):
plts[i].matshow(
W1.eval()[:,:,0,i])
# Examine the output weights
plt.matshow(W3.eval())
plt.colorbar()
# Save the weights
saver = tf.train.Saver()
saver.save(sess, "conv1.ckpt")
# Restore
saver.restore(sess, "conv1.ckpt")
INFO:tensorflow:Restoring parameters from conv1.ckpt
# Or use Numpy manually
#利用numpy手动保存权重
def save_all(name = 'conv1'):
np.savez_compressed(name, W1.eval(),
b1.eval(), W2.eval(), b2.eval(),
W3.eval(), b3.eval())
save_all()
def load_all(name = 'conv1.npz'):
data = np.load(name)
sess.run(W1.assign(data['arr_0']))
sess.run(b1.assign(data['arr_1']))
sess.run(W2.assign(data['arr_2']))
sess.run(b2.assign(data['arr_3']))
sess.run(W3.assign(data['arr_4']))
sess.run(b3.assign(data['arr_5']))
load_all()
3.6 Deeper CNN
import tensorflow as tf
import numpy as np
import math
from tqdm import tqdm
# Set random seed
np.random.seed(0)
# Load data
data = np.load('D:/python_data/data_with_labels.npz')
train = data['arr_0']/255.
labels = data['arr_1']
# Look at some data
# print(train[0])
# print(labels[0])
# If you have matplotlib installed
import matplotlib.pyplot as plt
plt.ion()
def to_onehot(labels,nclasses = 5):
'''
Convert labels to "one-hot" format.
>>> a = [0,1,2,3]
>>> to_onehot(a,5)
array([[ 1., 0., 0., 0., 0.],
[ 0., 1., 0., 0., 0.],
[ 0., 0., 1., 0., 0.],
[ 0., 0., 0., 1., 0.]])
'''
outlabels = np.zeros((len(labels),nclasses))
for i,l in enumerate(labels):
outlabels[i,l] = 1
return outlabels
onehot = to_onehot(labels)
# Split data into training and validation
indices = np.random.permutation(train.shape[0])
valid_cnt = int(train.shape[0] * 0.1)
test_idx, training_idx = indices[:valid_cnt],\
indices[valid_cnt:]
test, train = train[test_idx,:],\
train[training_idx,:]
onehot_test, onehot_train = onehot[test_idx,:],\
onehot[training_idx,:]
sess = tf.InteractiveSession()
# These will be inputs
## Input pixels, image with one channel (gray)
x = tf.placeholder("float", [None, 36, 36])
# Note that -1 is for reshaping
x_im = tf.reshape(x, [-1,36,36,1])
## Known labels
# None works during variable creation to be
# unspecified size
y_ = tf.placeholder("float", [None,5])
# Conv layer 1
num_filters1 = 16
winx1 = 3
winy1 = 3
W1 = tf.Variable(tf.truncated_normal(
[winx1, winy1, 1 , num_filters1],
stddev=1./math.sqrt(winx1*winy1)))
b1 = tf.Variable(tf.constant(0.1,
shape=[num_filters1]))
# 5x5 convolution, pad with zeros on edges
xw = tf.nn.conv2d(x_im, W1,
strides=[1, 1, 1, 1],
padding='SAME')
h1 = tf.nn.relu(xw + b1)
# 2x2 Max pooling, no padding on edges
p1 = tf.nn.max_pool(h1, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='VALID')
#添加另一个卷积层
# Conv layer 2
num_filters2 = 4
winx2 = 3
winy2 = 3
W2 = tf.Variable(tf.truncated_normal(
[winx2, winy2, num_filters1, num_filters2],
stddev=1./math.sqrt(winx2*winy2)))
b2 = tf.Variable(tf.constant(0.1,
shape=[num_filters2]))
# 3x3 convolution, pad with zeros on edges
p1w2 = tf.nn.conv2d(p1, W2,
strides=[1, 1, 1, 1], padding='SAME')
h1 = tf.nn.relu(p1w2 + b2)
# 2x2 Max pooling, no padding on edges
p2 = tf.nn.max_pool(h1, ksize=[1, 2, 2, 1],
strides=[1, 2, 2, 1], padding='VALID')
# Need to flatten convolutional output
#扁平化
p2_size = np.product(
[s.value for s in p2.get_shape()[1:]])
p2f = tf.reshape(p2, [-1, p2_size ])
#插入一个密集连接层
# Dense layer
num_hidden = 32
W3 = tf.Variable(tf.truncated_normal(
[p2_size, num_hidden],
stddev=2./math.sqrt(p2_size)))
b3 = tf.Variable(tf.constant(0.2,
shape=[num_hidden]))
h3 = tf.nn.relu(tf.matmul(p2f,W3) + b3)
# Drop out training
keep_prob = tf.placeholder("float")
h3_drop = tf.nn.dropout(h3, keep_prob)
# Output Layer
W4 = tf.Variable(tf.truncated_normal(
[num_hidden, 5],
stddev=1./math.sqrt(num_hidden)))
b4 = tf.Variable(tf.constant(0.1,shape=[5]))
# Just initialize
sess.run(tf.initialize_all_variables())
# Define model
y = tf.nn.softmax(tf.matmul(h3_drop,W4) + b4)
### End model specification, begin training code
# Climb on cross-entropy
cross_entropy = tf.reduce_mean(
tf.nn.softmax_cross_entropy_with_logits_v2(
logits = y + 1e-50, labels = y_))
# How we train
train_step = tf.train.GradientDescentOptimizer(
0.01).minimize(cross_entropy)
# Define accuracy
correct_prediction = tf.equal(tf.argmax(y,1),
tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(
correct_prediction, "float"))
# Actually train
epochs = 6000
train_acc = np.zeros(epochs//10)
test_acc = np.zeros(epochs//10)
for i in tqdm(range(epochs), ascii=True):
# Record summary data, and the accuracy
if i % 10 == 0:
# Check accuracy on train set
A = accuracy.eval(feed_dict={x: train,
y_: onehot_train, keep_prob: 1.0})
train_acc[i//10] = A
# And now the validation set
A = accuracy.eval(feed_dict={x: test,
y_: onehot_test, keep_prob: 1.0})
test_acc[i//10] = A
train_step.run(feed_dict={x: train,\
y_: onehot_train, keep_prob: 0.5})
# Plot the accuracy curves
plt.figure(figsize=(6, 6))
plt.plot(train_acc,'bo')
plt.plot(test_acc,'rx')
# Look at the final testing confusion matrix
pred = np.argmax(y.eval(
feed_dict={x: test, keep_prob: 1.0,
y_: onehot_test}), axis = 1)
conf = np.zeros([5,5])
for p,t in zip(pred,np.argmax(onehot_test,
axis=1)):
conf[t,p] += 1
plt.matshow(conf)
plt.colorbar()
# Let's look at a subplot of some weights
f, plts = plt.subplots(4,4)
for i in range(16):
plts[i//4,i%4].matshow(W1.eval()[:,:,0,i],
cmap = plt.cm.gray_r)
# Examine the output weights
plt.matshow(W4.eval().T)
plt.colorbar()
# Save the weights
saver = tf.train.Saver()
saver.save(sess, "conv2a.ckpt")
# Restore
saver.restore(sess, "conv2a.ckpt")
INFO:tensorflow:Restoring parameters from conv2a.ckpt
# Or use Numpy manually
def save_all(name = 'conv2'):
np.savez_compressed(name, W1.eval(),
b1.eval(), W2.eval(), b2.eval(),
W3.eval(), b3.eval(), W4.eval(),
b4.eval())
save_all()
def load_all(name = 'conv2.npz'):
data = np.load(name)
sess.run(W1.assign(data['arr_0']))
sess.run(b1.assign(data['arr_1']))
sess.run(W2.assign(data['arr_2']))
sess.run(b2.assign(data['arr_3']))
sess.run(W3.assign(data['arr_4']))
sess.run(b3.assign(data['arr_5']))
sess.run(W4.assign(data['arr_6']))
sess.run(b4.assign(data['arr_7']))
load_all()