TF Cookbook 单层神经网络

import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
# 重置计算图会话
tf.reset_default_graph()
sess=tf.Session()
# 初始化输入数组为10X10的矩阵,然后初始化计算图的占位符
data_size=[10,10]
data_2d=np.random.normal(size=data_size)
x_input_2d=tf.placeholder(dtype=tf.float32,shape=data_size)
# 声明一个卷积层函数,因为数据集已经有高度和宽度了,这里只需要扩展
# 另外两维(批量大小为1,颜色通道为1)即可以使用卷积conv2d函数
# 这里使用一个随机的2X2的过滤层,两个方向上的步长和valid padding,由于
# 输入数据是10X10,卷积层输出的为5X5
def conv_layer_2d(input_2d,my_filter):
#     首先扩充到4维
    input_3d=tf.expand_dims(input_2d,0)
    input_4d=tf.expand_dims(input_3d,3)
#     执行卷积计算
    convolution_output=tf.nn.conv2d(input_4d,filter=my_filter,strides=[1,2,2,1],padding="VALID")
#     卷积完成删除多余的维度,实际上就是去掉外层没数据的一层层单个括号
    conv_output_2d=tf.squeeze(convolution_output)
    return(conv_output_2d)
# 生成2X2的随机过滤器
my_filter=tf.Variable(tf.random_normal(shape=[2,2,1,1]))
my_convolution_output=conv_layer_2d(x_input_2d,my_filter)
# 激励函数是针对逐个元素的,创建激励函数并初始化
def activation(input_2d):
    return(tf.nn.relu(input_2d))
my_activation_output=activation(my_convolution_output)
# 接受自激励函数后的为5X5的数据,因为是二维,此处需要声明池化层移动窗口的宽度和高度
# 这里首先将池化层扩展为二维
def max_pool(input_2d,width,height):
#     将2d转为4d
    input_3d=tf.expand_dims(input_2d,0)
    input_4d=tf.expand_dims(input_3d,3)
#     执行最大池化操作
    pool_output=tf.nn.max_pool(input_4d,ksize=[1,height,width,1],strides=[1,1,1,1],padding="VALID")
#     去除多余的括号,进行降维
    pool_output_2d=tf.squeeze(pool_output)
#     最大池化后输出的是4X4
    return(pool_output_2d)
my_maxpool_output=max_pool(my_activation_output,width=2,height=2)
# 全连接层与一维数据的输出类似,全连接层的二维输入看作是一个对象,为了使
# 实现每项连接到每个输出,我们需要打平二维矩阵,之后在做矩阵乘法时
# 再扩展维度
def fully_connected(input_layer,num_outputs):
#     这里接受的来自上层的4X4数据
#     首先利用reshape(input_layer,[-1])将多维数据摊平成一维向量形式
    flat_input=tf.reshape(input_layer,[-1])
#     然后生成权重与偏置矩阵
    weight_shape=tf.squeeze(tf.stack([tf.shape(flat_input),[num_outputs]]))
    weight=tf.random_normal(weight_shape,stddev=0.1)
    bias=tf.random_normal(shape=[num_outputs])
#     然后将摊平的数据转换成2d
    input_2d=tf.expand_dims(flat_input,0)
#     执行全连接操作,此处是1X16 矩阵 乘 16X5,最终得到1X5=5个最终输出
    full_output=tf.add(tf.matmul(input_2d,weight),bias)
#     去掉多余的维度(多余的括号)
    full_output_2d=tf.squeeze(full_output)
    return(full_output_2d)
my_full_output=fully_connected(my_maxpool_output,5)
# 最后初始化变量,创建赋值字典
init=tf.global_variables_initializer()
sess.run(init)
my_feed_dict={x_input_2d:data_2d}
# 最后打印输出
#Convolution Output
print('Input = [10 X 10] array')
print('2 X 2 Convolution,stride size=[2 X 2],results in the [5 X 5] array ')
print(sess.run(my_convolution_output,feed_dict=my_feed_dict))
# 激活层输出
print('\ninput = the above [5 X 5] array')
print('Relu element wise returns the [5 X 5] array')
print(sess.run(my_activation_output,feed_dict=my_feed_dict))
# 最大池化层输出
print('\bInput = the above [5 X 5] array')
print('MaxPool,stride size=[1X1],results in the [4 X 4] array')
print(sess.run(my_maxpool_output,feed_dict=my_feed_dict))
# 全连接层输出
print('\nInput = the above [4 X 4] array')
print('Fully connected layer on all four rows with 5 outputs:')
print(sess.run(my_full_output,feed_dict=my_feed_dict))

以下为输出
Input = [10 X 10] array
2 X 2 Convolution,stride size=[2 X 2],results in the [5 X 5] array
[[-0.3227601 -1.2774704 1.9170549 -0.36676604 -1.397803 ]
[ 0.20488393 -1.7201221 2.3688676 -0.17262915 0.15586656]
[ 0.37535402 -0.15364343 0.01728755 -0.35448194 1.6578678 ]
[ 0.7577926 -1.2824433 -0.540789 -0.3514455 -1.3419902 ]
[-0.7361624 -3.8886514 -2.2689772 0.3926846 -0.5453034 ]]

input = the above [5 X 5] array
Relu element wise returns the [5 X 5] array
[[0. 0. 1.9170549 0. 0. ]
[0.20488393 0. 2.3688676 0. 0.15586656]
[0.37535402 0. 0.01728755 0. 1.6578678 ]
[0.7577926 0. 0. 0. 0. ]
[0. 0. 0. 0.3926846 0. ]]
Input = the above [5 X 5] array
MaxPool,stride size=[1X1],results in the [4 X 4] array
[[0.20488393 2.3688676 2.3688676 0.15586656]
[0.37535402 2.3688676 2.3688676 1.6578678 ]
[0.7577926 0.01728755 0.01728755 1.6578678 ]
[0.7577926 0. 0.3926846 0.3926846 ]]

Input = the above [4 X 4] array
Fully connected layer on all four rows with 5 outputs:
[-2.3740423 1.2219853 -2.1063902 -1.3365058 1.1770998]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值