TFLearn Input_data 与 fully_connected

# Input_data

[input_data解释](http://tflearn.org/layers/core/#input-data)

[input_data源码] (https://github.com/tflearn/tflearn/blob/master/tflearn/layers/core.py)

def input_data(shape=None, placeholder=None, dtype=tf.float32,
               data_preprocessing=None, data_augmentation=None,
               name="InputData"):
    """ Input Data.
  
    Input:
        List of `int` (Shape), to create a new placeholder.
            Or
        `Tensor` (Placeholder), to use an existing placeholder.

    Output:
        Placeholder Tensor with given shape.
    """ 

## input_data.shape

input_data 函数用于定义输入层, 作为一个占位符,表示一个模型中输入数据的结构。一般主要涉及参数shape与name,其余参数默认即可。

例如 input_data 定义了一个  第一维不限制,第二维为1的矩阵

g = tflearn.input_data(shape=[None, 1])
g = tflearn.fully_connected(g, 128, activation='linear')
g = tflearn.fully_connected(g, 128, activation='linear')
g = tflearn.fully_connected(g, 1, activation='sigmoid')

 

又例如 input_data定义了  None * 32 * 32 *3 的一个四维矩阵,对输入参数做了一个限制。

# Build network
network = input_data(shape=[None, 32, 32, 3], dtype=tf.float32)
network = conv_2d(network, 32, 3, activation='relu')
network = max_pool_2d(network, 2)
network = conv_2d(network, 64, 3, activation='relu')
network = conv_2d(network, 64, 3, activation='relu')
network = max_pool_2d(network, 2)
network = fully_connected(network, 512, activation='relu')
network = dropout(network, 0.5)
network = fully_connected(network, 10, activation='softmax')
network = regression(network, optimizer='adam',
                     loss='categorical_crossentropy',
                     learning_rate=0.001)

## input_data.name

name参数表示输入层的名字

network = tflearn.input_data(shape=[None, 784], name="input")
network = self.make_core_network(network)
network = regression(network, optimizer='adam', learning_rate=0.01,
                     loss='categorical_crossentropy', name='target')

 

# fully_connected 全连接层

[fully_connected解释](http://tflearn.org/layers/core/#fully-connected)

[fully_connected源码] (https://github.com/tflearn/tflearn/blob/master/tflearn/layers/core.py)

def fully_connected(incoming, n_units, activation='linear', bias=True,
                    weights_init='truncated_normal', bias_init='zeros',
                    regularizer=None, weight_decay=0.001, trainable=True,
                    restore=True, reuse=False, scope=None,
                    name="FullyConnected"):

## 全连接层的解读

**全连接层**:每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。

**全连接层的作用**: 在卷积神经网络的最后,往往会出现一两层全连接层,全连接一般会把卷积输出的二维特征图转化成一维的一个向量。 因为传统的网络我们的输出都是分类,也就是几个类别的概率甚至就是一个数--类别号,那么全连接层就是高度提纯的特征了,方便交给最后的分类器或者回归。

**全连接层的特征**:

MLP是fully connected layer. 而CNN是local connected layer.
所以我们可以说fully connected layer的特点就是没有weights share.
连接方式是点对点的
初学者认为 1x1 的filter size就是fully connected

ä¸ç»´å¨è¿æ¥å±


## 如何判定是否全连接层
* 对于neuron的连接(点对点的连接)都是fully connected.(这里其实就是MLP)
* 对于有filter的network,不是看filter的size,而是看output的feature map的size。如果output feature map的size是1x1xN的话这个layer就是fully connected layer。

## 细化第二个判断方法:
1. 1x1的filter size不一定是fully connected。比如input size是10x10x100,filter size是1x1x100,重复50次,则该layer的总weights是:1x1x100x50。

2. 1x1的filter size如果要是fully connected,则input size必须是1x1。关于这一点我们在前面使用matconvnet的时候有介绍过,fc的input size如果不是1x1就会出错。

3. input size是10x10的时候却是fully connected的情况:这里我们的output size肯定是1x1,且我们的filter size肯定是10x10。

因此我们也可以将第二点总结为:
filter size等于input size则是fully connected。

## 为何说 1*1 不一定是 fully connected 
* Convolution中当filter size等于input size时,就是fully connected,此时的output size为1x1xN。
* 当1x1不等于input size的时候,1x1一样具备weights share的能力。

 

[fully connected 和 local connected参考文章](https://blog.csdn.net/qq_20259459/article/details/70598929)

[解释一下全连接层](https://blog.csdn.net/u011021773/article/details/78121359)

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个代码出现上面问题呢:data_load=xlsread('data_load'); % 划分训练集和测试集 train_ratio = 0.8; % 训练集所占比例 train_size = round(size(data_load,1)*train_ratio); train_data = data_load(1:train_size,:); test_data = data_load(train_size+1:end,:); % 数据归一化 [train_data,train_settings] = mapminmax(train_data'); train_data = train_data'; test_data = mapminmax('apply',test_data',train_settings)'; test_data = test_data'; % 构造训练集和测试集的输入和输出 input_train = train_data(1:end-1,:); output_train = train_data(2:end,:); input_test = test_data(1:end-1,:); output_test = test_data(2:end,:); input_train_cell = num2cell(input_train',1); % 将输入数据转换为元胞数组 output_train_cell = num2cell(output_train',1); % 将输出数据转换为元胞数组 input_test_cell = num2cell(input_test',1); % 将输入数据转换为元胞数组 output_test_cell = num2cell(output_test',1); % 将输出数据转换为元胞数组 % 配置 LSTM 网络 numFeatures = size(input_train,2); % 特征数 numResponses = size(output_train,2); % 输出数 numHiddenUnits = 100; % 隐藏层神经元数 layers = [ ... sequenceInputLayer(numFeatures) lstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numResponses) regressionLayer]; options = trainingOptions('adam', ... 'MaxEpochs',100, ... 'GradientThreshold',1, ... 'InitialLearnRate',0.01, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.1, ... 'LearnRateDropPeriod',20, ... 'MiniBatchSize',64, ... 'SequenceLength','longest', ... 'Shuffle','never', ... 'ValidationData',{input_test,output_test}, ... 'ValidationFrequency',10, ... 'Plots','training-progress'); % 训练 LSTM 网络 net = trainNetwork(input_train_cell,output_train_cell,layers,options); % 使用元胞数组格式的输入和输出数据进行训练
05-31

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值