博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Tensorflow实现CNN
阅读量:6709 次
发布时间:2019-06-25

本文共 7451 字,大约阅读时间需要 24 分钟。

CNN:Convolutional Neural Networks

输入层→隐藏层(卷积层→池化层→全链接层)→输出层(Softmax层)

本文中,前两个卷积层由Convolution-ReLU-maxpool操作组成,后两层为全链接层。

1. 加载必要的编程库,开始计算图会话

import matplotlib.pyplot as pltimport numpy as npimport tensorflow as tffrom tensorflow.contrib.learn.python.learn.datasets.minist import read_data_setssess = tf.session()

2. 加载数据集,转化图像为28×28的数组

data_dir = 'temp'mnist = read_data_sets(data_dir)train_xdata = np.array([np.reshape(x, (28, 28)) for x in mnist.train.images])test_xdata = np.array([np.reshape(x, (28, 28)) for x in mnist.test.images])train_labels = mnist.train.labelstest_labels = mnist.test.labels

3. 设置模型参数

图像为灰度图,深度为1,颜色通道数为3

# Set model parametersbatch_size = 100learning_rate = 0.005evaluation_size = 500image_width = train_xdata[0].shape[0]image_height = train_xdata[0].shape[1]target_size = max(train_labels) + 1num_channels = 1 # greyscale = 1 channelgenerations = 500eval_every = 5conv1_features = 25conv2_features = 50max_pool_size1 = 2 # NxN window for 1st max pool layermax_pool_size2 = 2 # NxN window for 2nd max pool layerfully_connected_size1 = 100

4. 为数据集声明占位符

# Declare model placeholdersx_input_shape = (batch_size, image_width, image_height, num_channels)x_input = tf.placeholder(tf.float32, shape=x_input_shape)y_target = tf.placeholder(tf.int32, shape=(batch_size))eval_input_shape = (evaluation_size, image_width, image_height, num_channels)eval_input = tf.placeholder(tf.float32, shape=eval_input_shape)eval_target = tf.placeholder(tf.int32, shape=(evaluation_size))

5. 声明卷积层的权重和偏置

# Declare model parametersconv1_weight = tf.Variable(tf.truncated_normal([4, 4, num_channels, conv1_features],                                               stddev=0.1, dtype=tf.float32))conv1_bias = tf.Variable(tf.zeros([conv1_features], dtype=tf.float32))conv2_weight = tf.Variable(tf.truncated_normal([4, 4, conv1_features, conv2_features],                                               stddev=0.1, dtype=tf.float32))conv2_bias = tf.Variable(tf.zeros([conv2_features], dtype=tf.float32))

6. 声明全链接层的权重和偏置

# fully connected variablesresulting_width = image_width // (max_pool_size1 * max_pool_size2)resulting_height = image_height // (max_pool_size1 * max_pool_size2)full1_input_size = resulting_width * resulting_height * conv2_featuresfull1_weight = tf.Variable(tf.truncated_normal([full1_input_size, fully_connected_size1],                          stddev=0.1, dtype=tf.float32))full1_bias = tf.Variable(tf.truncated_normal([fully_connected_size1], stddev=0.1, dtype=tf.float32))full2_weight = tf.Variable(tf.truncated_normal([fully_connected_size1, target_size],                                               stddev=0.1, dtype=tf.float32))full2_bias = tf.Variable(tf.truncated_normal([target_size], stddev=0.1, dtype=tf.float32))

7. 声明算法模型

# Initialize Model Operationsdef my_conv_net(input_data):    # First Conv-ReLU-MaxPool Layer    conv1 = tf.nn.conv2d(input_data, conv1_weight, strides=[1, 1, 1, 1], padding='SAME')    relu1 = tf.nn.relu(tf.nn.bias_add(conv1, conv1_bias))    max_pool1 = tf.nn.max_pool(relu1, ksize=[1, max_pool_size1, max_pool_size1, 1],                               strides=[1, max_pool_size1, max_pool_size1, 1], padding='SAME')    # Second Conv-ReLU-MaxPool Layer    conv2 = tf.nn.conv2d(max_pool1, conv2_weight, strides=[1, 1, 1, 1], padding='SAME')    relu2 = tf.nn.relu(tf.nn.bias_add(conv2, conv2_bias))    max_pool2 = tf.nn.max_pool(relu2, ksize=[1, max_pool_size2, max_pool_size2, 1],                               strides=[1, max_pool_size2, max_pool_size2, 1], padding='SAME')    # Transform Output into a 1xN layer for next fully connected layer    final_conv_shape = max_pool2.get_shape().as_list()    final_shape = final_conv_shape[1] * final_conv_shape[2] * final_conv_shape[3]    flat_output = tf.reshape(max_pool2, [final_conv_shape[0], final_shape])    # First Fully Connected Layer    fully_connected1 = tf.nn.relu(tf.add(tf.matmul(flat_output, full1_weight), full1_bias))    # Second Fully Connected Layer    final_model_output = tf.add(tf.matmul(fully_connected1, full2_weight), full2_bias)        return(final_model_output)

8. 声明训练模型

model_output = my_conv_net(x_input)test_model_output = my_conv_net(eval_input)

9. Softmax函数

# Declare Loss Function (softmax cross entropy)loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(model_output, y_target))

10. 创建训练集和测试集的预测函数

# Create a prediction functionprediction = tf.nn.softmax(model_output)test_prediction = tf.nn.softmax(test_model_output)# Create accuracy functiondef get_accuracy(logits, targets):    batch_predictions = np.argmax(logits, axis=1)    num_correct = np.sum(np.equal(batch_predictions, targets))    return(100. * num_correct/batch_predictions.shape[0])

11. 创建优化器函数,声明训练步长,初始化所有的模型变量

# Create an optimizermy_optimizer = tf.train.MomentumOptimizer(learning_rate, 0.9)train_step = my_optimizer.minimize(loss)# Initialize Variablesinit = tf.initialize_all_variables()sess.run(init)

12. 开始训练模型

# Start training looptrain_loss = []train_acc = []test_acc = []for i in range(generations):    rand_index = np.random.choice(len(train_xdata), size=batch_size)    rand_x = train_xdata[rand_index]    rand_x = np.expand_dims(rand_x, 3)    rand_y = train_labels[rand_index]    train_dict = {x_input: rand_x, y_target: rand_y}        sess.run(train_step, feed_dict=train_dict)    temp_train_loss, temp_train_preds = sess.run([loss, prediction], feed_dict=train_dict)    temp_train_acc = get_accuracy(temp_train_preds, rand_y)        if (i+1) % eval_every == 0:        eval_index = np.random.choice(len(test_xdata), size=evaluation_size)        eval_x = test_xdata[eval_index]        eval_x = np.expand_dims(eval_x, 3)        eval_y = test_labels[eval_index]        test_dict = {eval_input: eval_x, eval_target: eval_y}        test_preds = sess.run(test_prediction, feed_dict=test_dict)        temp_test_acc = get_accuracy(test_preds, eval_y)                # Record and print results        train_loss.append(temp_train_loss)        train_acc.append(temp_train_acc)        test_acc.append(temp_test_acc)        acc_and_loss = [(i+1), temp_train_loss, temp_train_acc, temp_test_acc]        acc_and_loss = [np.round(x,2) for x in acc_and_loss]        print('Generation # {}. Train Loss: {:.2f}. Train Acc (Test Acc): {:.2f} ({:.2f})'.format(*acc_and_loss))

13. 使用Matplotlib模板绘制损失函数和准确度

# Matlotlib code to plot the loss and accuracieseval_indices = range(0, generations, eval_every)# Plot loss over timeplt.plot(eval_indices, train_loss, 'k-')plt.title('Softmax Loss per Generation')plt.xlabel('Generation')plt.ylabel('Softmax Loss')plt.show()# Plot train and test accuracyplt.plot(eval_indices, train_acc, 'k-', label='Train Set Accuracy')plt.plot(eval_indices, test_acc, 'r--', label='Test Set Accuracy')plt.title('Train and Test Accuracy')plt.xlabel('Generation')plt.ylabel('Accuracy')plt.legend(loc='lower right')plt.show()

14. 打印最新结果中的六幅抽样图

# Plot some samples# Plot the 6 of the last batch results:actuals = rand_y[0:6]predictions = np.argmax(temp_train_preds,axis=1)[0:6]images = np.squeeze(rand_x[0:6])Nrows = 2Ncols = 3for i in range(6):    plt.subplot(Nrows, Ncols, i+1)    plt.imshow(np.reshape(images[i], [28,28]), cmap='Greys_r')    plt.title('Actual: ' + str(actuals[i]) + ' Pred: ' + str(predictions[i]),                               fontsize=10)    frame = plt.gca()    frame.axes.get_xaxis().set_visible(False)    frame.axes.get_yaxis().set_visible(False)

 

转载于:https://www.cnblogs.com/KresnikShi/p/10741176.html

你可能感兴趣的文章
数据筛选和排序
查看>>
Promise 理解
查看>>
Ueditor在MVC中上传文件和远程图片下载的脚本
查看>>
关于索引
查看>>
让pandoc输出pdf时支持中文
查看>>
利用反射实现页面控件与实体之间的绑定
查看>>
Xamarin-Android_BaseAdapter 简单的复用
查看>>
快速傅里叶变换(FFT)
查看>>
在C#程序中使用ocx的方法
查看>>
C# 递归查找文件夹下所有文件和子文件夹的所有文件
查看>>
如何发布你的 Maya 应用到欧特克官方的 Exchange Store
查看>>
react之自定义react-redux的provider、connect
查看>>
JQuery中工厂函数$()初探
查看>>
网上发现的一个android UI包
查看>>
新闻源图片放到js里
查看>>
SpringBoot学习:整合Mybatis,使用HikariCP超高性能数据源
查看>>
Java--面向对象
查看>>
微信模板消息群发系统
查看>>
高内聚低耦合
查看>>
2012 chengdu现场赛 Browsing History HDU4464(简单字符串)
查看>>