搭建的是如下图所示的二层神经网络。

输入层的神经元个数由图片的维度决定,教程中使用的是32x32x3的彩色图片,然后灰度化,得到32x32的灰度图,故输入层神经元个数是1024个,隐藏层神经元个数可以自己指定,教程中指定为128个,由于是数字识别任务,故有10个数字,故输出层神经元个数为10。

为了考虑内存的限制,本教程分批量训练图片,每次100张,故每一次训练,输入层矩阵为100x1024,经过第一个全连接层(第一个全连接层的权重矩阵W1为1024x128),得到隐藏层矩阵为100x128,再经过第二个全连接层(第二个全连接层的权重矩阵W2为128x10),得到输出层矩阵为logits为100x10。

# -*- coding: utf-8 -*-
"""
Created on Wed Mar 27 19:38:44 2019@author: macheng
"""from __future__ import print_function, division
import tensorflow as tf
from sklearn.metrics import confusion_matrix
import numpy as np
import load#train_samples 是维度为[num_images, image_size, image_size, num_channels]大小的4维矩阵
#train_labels 是维度为[num_images, 10]大小的2维矩阵
train_samples, train_labels = load._train_samples, load._train_labels
test_samples, test_labels = load._test_samples,  load._test_labelsprint('Training set', train_samples.shape, train_labels.shape)
print('    Test set', test_samples.shape, test_labels.shape)image_size = load.image_size       #32
num_labels = load.num_labels       #10
num_channels = load.num_channels   #channel为1,灰度图def get_chunk(samples, labels, chunkSize):'''Iterator/Generator: get a batch of data这个函数是一个迭代器/生成器,用于每一次只得到 chunkSize 这么多的数据用于 for loop, just like range() function'''if len(samples) != len(labels):raise Exception('Length of samples and labels must equal')stepStart = 0   # initial stepi = 0while stepStart < len(samples):stepEnd = stepStart + chunkSizeif stepEnd < len(samples):yield i, samples[stepStart:stepEnd], labels[stepStart:stepEnd]i += 1stepStart = stepEndclass Network():def __init__(self, num_hidden, batch_size):'''@num_hidden: 隐藏层的节点数量@batch_size:因为我们要节省内存,所以分批处理数据。每一批的数据量。'''self.batch_size = batch_sizeself.test_batch_size = 500# Hyper Parametersself.num_hidden = num_hidden# Graph Relatedself.graph = tf.Graph()self.tf_train_samples = Noneself.tf_train_labels = Noneself.tf_test_samples = Noneself.tf_test_labels = Noneself.tf_test_prediction = Nonedef define_graph(self):'''定义我的计算图谱'''with self.graph.as_default():# 这里只是定义图谱中的各种变量self.tf_train_samples = tf.placeholder(tf.float32, shape=(self.batch_size, image_size, image_size, num_channels))self.tf_train_labels  = tf.placeholder(tf.float32, shape=(self.batch_size, num_labels))self.tf_test_samples  = tf.placeholder(tf.float32, shape=(self.test_batch_size, image_size, image_size, num_channels))""""fully connected layer 1:   input layer ---> hidden layerfc1_weights是维度为[image_size*imagez_size, num_hidden]大小的二维数组,代表的是输入层到隐藏层的连接上的权重,行表示输入层神经元的个数,也就是输入层有image_size*imagez_size大小个神经元(32*32=1024)列表示隐藏层神经元的个数,也就是隐藏层有num_hidden大小个神经元(128)"""fc1_weights = tf.Variable(tf.truncated_normal([image_size * image_size, self.num_hidden], stddev=0.1))fc1_biases = tf.Variable(tf.constant(0.1, shape=[self.num_hidden]))print("fc1_weights.shape: ", fc1_weights.shape)print("fc1_biases.shape: ", fc1_biases.shape)"""fully connected layer 2:  hidden layer --> output layerfc2_weights的维度为[num_hidden, num_labels]大小的二维数组,代表的是隐藏层到输出层的连接上的权重行表示隐藏层神经元的个数(128),列表示输出层神经元的个数(10)"""fc2_weights = tf.Variable(tf.truncated_normal([self.num_hidden, num_labels], stddev=0.1))fc2_biases = tf.Variable(tf.constant(0.1, shape=[num_labels]))print("fc2_weights.shape: ", fc2_weights.shape)print("fc2_biases.shape: ", fc2_biases.shape)print("\n")# 现在来定义图谱的运算def model(data):# fully connected layer 1shape = data.get_shape().as_list()  #将data的shape变为一个listprint(data.get_shape(), shape)# reshape为batch_size * (image_size*image_size*num_channels)大小的二维数组(100*1024)reshape = tf.reshape(data, [shape[0], shape[1] * shape[2] * shape[3]])print(reshape.get_shape(), fc1_weights.get_shape(), fc1_biases.get_shape())# hidden的维度是batch_size * num_hidden大小的二维数组(100*128)hidden = tf.nn.relu(tf.matmul(reshape, fc1_weights) + fc1_biases)print(hidden.get_shape())# fully connected layer 2#最后的得到的是100*10的二维矩阵return tf.matmul(hidden, fc2_weights) + fc2_biases# Training computation.logits = model(self.tf_train_samples)self.loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=self.tf_train_labels, logits=logits))# Optimizer.self.optimizer = tf.train.GradientDescentOptimizer(0.0001).minimize(self.loss)# Predictions for the training, validation, and test data.self.train_prediction = tf.nn.softmax(logits)self.test_prediction = tf.nn.softmax(model(self.tf_test_samples))def run(self):'''用到Session'''# private functiondef print_confusion_matrix(confusionMatrix):print('Confusion    Matrix:')for i, line in enumerate(confusionMatrix):print(line, line[i]/np.sum(line))a = 0for i, column in enumerate(np.transpose(confusionMatrix, (1, 0))):a += (column[i]/np.sum(column))*(np.sum(column)/26000)print(column[i]/np.sum(column),)print('\n',np.sum(confusionMatrix), a)self.session = tf.Session(graph=self.graph)with self.session as session:tf.initialize_all_variables().run()### 训练print('Start Training')# batch 100for i, samples, labels in get_chunk(train_samples, train_labels, chunkSize=self.batch_size):_, l, predictions = session.run([self.optimizer, self.loss, self.train_prediction],feed_dict={self.tf_train_samples: samples, self.tf_train_labels: labels})# labels is True Labelsaccuracy, _ = self.accuracy(predictions, labels)if i % 50 == 0:print('Minibatch loss at step %d: %f' % (i, l))print('Minibatch accuracy: %.1f%%' % accuracy)###### 测试accuracies = []confusionMatrices = []for i, samples, labels in get_chunk(test_samples, test_labels, chunkSize=self.test_batch_size):result = self.test_prediction.eval(feed_dict={self.tf_test_samples: samples})accuracy, cm = self.accuracy(result, labels, need_confusion_matrix=True)accuracies.append(accuracy)confusionMatrices.append(cm)print('Test Accuracy: %.1f%%' % accuracy)print(' Average  Accuracy:', np.average(accuracies))print('Standard Deviation:', np.std(accuracies))print_confusion_matrix(np.add.reduce(confusionMatrices))###def accuracy(self, predictions, labels, need_confusion_matrix=False):'''计算预测的正确率与召回率@return: accuracy and confusionMatrix as a tuple'''_predictions = np.argmax(predictions, 1)_labels = np.argmax(labels, 1)cm = confusion_matrix(_labels, _predictions) if need_confusion_matrix else None# == is overloaded for numpy arrayaccuracy = (100.0 * np.sum(_predictions == _labels) / predictions.shape[0])return accuracy, cmif __name__ == '__main__':net = Network(num_hidden=128, batch_size=100)net.define_graph()net.run()

搭建的二层神经网络的正确率只有12.9%,后面会慢慢对这个网络进行改进以提高正确率

TF girls系列(1)搭建二层全连接神经网络相关推荐

  1. PyTorch基础入门五:PyTorch搭建多层全连接神经网络实现MNIST手写数字识别分类

    )全连接神经网络(FC) 全连接神经网络是一种最基本的神经网络结构,英文为Full Connection,所以一般简称FC. FC的准则很简单:神经网络中除输入层之外的每个节点都和上一层的所有节点有连 ...

  2. Tensorflow【实战Google深度学习框架】全连接神经网络以及可视化

    文章目录 1 可视化 神经网络的二元分类效果 2 全连接神经网络 3 TensorFlow搭建一个全连接神经网络 3.1 读取MNIST数据 3.2 建立占位符 3.3 建立模型 3.4 正确率 3. ...

  3. 第六节:Pytorch实现全连接神经网络

    第六节:Pytorch实现全连接神经网络 前面的五节中,我们讲解了使用PyTorch搭建一个神经网络中需要的需要各种技巧,包括:网络的搭建.选择不同的实践技巧(优化器选择.学习率下降等等)以及可视化训 ...

  4. 深度学习框架 TensorFlow:张量、自动求导机制、tf.keras模块(Model、layers、losses、optimizer、metrics)、多层感知机(即多层全连接神经网络 MLP)

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 安装 TensorFlow2.CUDA10.cuDNN7.6. ...

  5. python——tensorflow使用和两层全连接神经网络搭建

    一.Tensorflow使用 1.Tensorflow简介 TensorFlow是一个软件库,封装了建构神经网络的API,类似于MatLab的神经网络工具箱,是Google于2015年推出的深度学习框 ...

  6. TF之DNN:TF利用简单7个神经元的三层全连接神经网络【2-3-2】实现降低损失到0.000以下

    TF之DNN:TF利用简单7个神经元的三层全连接神经网络实现降低损失到0.000以下(输入.隐藏.输出层分别为 2.3 . 2 个神经元) 目录 输出结果 实现代码 输出结果 实现代码 # -*- c ...

  7. 【TensorFlow】TensorFlow从浅入深系列之十 -- 教你认识卷积神经网络的基本网路结构及其与全连接神经网络的差异

    本文是<TensorFlow从浅入深>系列之第10篇 TensorFlow从浅入深系列之一 -- 教你如何设置学习率(指数衰减法) TensorFlow从浅入深系列之二 -- 教你通过思维 ...

  8. 深度学习系列:全连接神经网络和BP算法

    前言 注:以后我的文章会写在个人博客网站上,本站文章也已被搬运.本文地址: https://xiaodongfan.com/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E ...

  9. 【Python学习笔记】b站@同济子豪兄 用pytorch搭建全连接神经网络,对Fashion-MNIST数据集中的时尚物品进行分类

    [Python学习笔记]原作b站@同济子豪兄 用pytorch搭建全连接神经网络,对Fashion-MNIST数据集中的时尚物品进行分类 跟着b站@同济子豪兄的视频自学写的代码,内容是用pytorch ...

最新文章

  1. 【Python培训基础知识】Python生成器函数
  2. 张红忠:智慧化时代,如何通吃5G模组、AIoT?
  3. JVM源码分析之安全点safepoint
  4. AutoHotKey 的使用 —— 使用键盘调节 windows 声音
  5. C++ Primer 5th笔记(9)chapter9 顺序容器 string
  6. 2、Flutter Widget(IOS Style) - CupertinoActionSheet;
  7. 如何使用API的方式消费SAP Commerce Cloud的订单服务
  8. C语言 | 指向指针的指针排序
  9. Java-While循环
  10. 如何更改Live Writer发布照片到不同相册
  11. MindSpore:基于本地差分隐私的 Bandit 算法
  12. 不同网段Linux通过路由表,Linux服务器架设---《路由表配置,实现不同网段不同网卡之间的ping...
  13. D16 Group Decimort 2 Mac - 经典复古采样器
  14. MDataTable属性RecordsAffected新应用:WebService与Json交互的记录总数
  15. 计算机组成原理习题答案(蒋本珊)
  16. 尝试修改smali码破解App
  17. 在移动通信中如何测试5G网络?
  18. 学计算机能考南京哪个大学,这三所南京市高校,适合报考计算机类专业,适合的考生不要错过...
  19. 浅析数据仓库和建模理论
  20. #7:怀念儿时的春节——9

热门文章

  1. prism RegionContext(区域上下文)
  2. 由浅入深:Python 中如何实现自动导入缺失的库?
  3. java.lang.NoClassDefFoundError: Could not initialize class错误原因
  4. android 固定launcher,android 开机默认进入指定Launcher
  5. 北京内推 | 微软亚洲研究院机器学习组招聘研究型实习生
  6. arch linux 防火墙,Arch linux操作系统之Firewalld防火墙安装使用
  7. 微信小程序——微信小程序分包
  8. 【python入门到精通】python面向对象三大特点:封装,继承,多态
  9. (一)图像文字检测论文:CTPN方法
  10. 快速入门 Remix IDE