Keras Layer 的 call(x) 和 input_shape

今天用Keras编程的时候发现一个问题,

···
input_layer = K.layers.Input(shape=(10,))

x = K.layers.Dense(20)(input_layer)
x = K.layers.Dense(20)(x)
···
以上写法是可行的,但是以下写法却不行

L = K.layers.Dense(20)
y = L(input_layer)
y = L(y)

前两个表达式正常,到了第3个表达式y=L(y)的时候就报input_shape错误。百思不得其解,按照Python编程的原则,一切皆对象

L = K.layers.Dense(20)
L(x)

K.layers.Dense(20)(x)

有何不同?

一番尝试,发现奥妙在于Keras Layers的设计。看一下官方的对于自定义Layer的说明,

call(x): this is where the layer‘s logic lives. Unless you want your layer to support masking, you only have to care about the first argument passed to call: the input tensor.

也就是说,当layer的callmethod被调用时,layer才实际存在,此时将传入input_shape。如果call没有被调用,此时layer中并没有input_shape的信息。

举例说明,

L = K.layers.Dense(20)
L.input_shape

此时编译器报错AttributeError: The layer has never been called and thus has no defined input shape. 再看以下代码, ``` L = K.layers.Dense(20) y = L(input_layer) L.input_shape ``` 此时编译器不报错,输出(None, 10)。照理说第二段代码并没有对L做任何操作,只是将L(input_layer)赋给了y,但是此时L确获得了input_shape`这个参数。

结合call(x)的定义,一开始遇到的问题也就明白了。表达式y = L(input_layer)调用了Lcallmethod,此时L这个layer才正式被初始化,其input_shape也根据传入的input_layer被赋值 。因此,此时的L其实已经跟表达式K.layers.Dense(20)不一样了,后者未被调用,input_shape不存在。

以下这段代码之所以报input_shape错误,就是因为y = L(input_layer)使得L的input_shape被初始化为(10,)。因次当第三个表达式y=L(y)y被传入L时,由于y的shape并不是(10,),而是(20,),与L中input_shape的值不一致,编译器报错。

L = K.layers.Dense(20)
y = L(input_layer)
y = L(y)

原文地址:https://www.cnblogs.com/yaos/p/12128153.html

时间: 2024-07-31 22:51:39

Keras Layer 的 call(x) 和 input_shape的相关文章

Keras.layer()

目录 Keras.layers Dense(全连接层) Activation(激活函数) Dropout(正则化层) Flatten(展平) Input(用于实例化 Keras 张量) Reshape(调整输入大小) Permute(置换输入的维度) RepeatVector(将输入重复 n 次) Lambda(将任意表达式封装为 Layer对象) ActivityRegularization(网络层) Masking(使用覆盖值覆盖序列) SpatialDropout1D(Dropout 的

自定义Keras Layer

Keras的Layer其实就是一个Class, 要具有以下几个方法: (1) build(input_shape): 定义权重的地方, 如果不需要定义权重, 也要有self.built = True; (2) call(x): 编写功能逻辑的地方, 实现Layer的功能逻辑; (3) compute_output_shape(input_shape): 根据input_shape, 计算形状变化的地方, 能够让Keras推断输出的Tensor的Shape. 原文地址:https://www.cn

练习:给Keras ResNet50源码加上正则化参数, 修改激活函数为Elu

最近学习了一下ResNet50模型,用其跑了个Kaggle比赛,并仔细阅读了其Keras实现.在比赛中,我修改了一下源码,加入了正则项,激活函数改为elu, 日后的应用中也可以直接copy 使用之. ResNet50 的结构图网上已经很多了,例如这篇博文:https://blog.csdn.net/nima1994/article/details/82686132. 可以看出,ResNet50是主要分为两个部分,一部分为Plain Network,也就是上图的左侧部分,就是一系列通常的卷积,批量

Keras之函数式(Functional)模型

函数式(Functional)模型 我们起初将Functional一词译作泛型,想要表达该类模型能够表达任意张量映射的含义,但表达的不是很精确,在Keras2里我们将这个词改移为"函数式",函数式模型称作Functional,但它的类名是Model,因此有时候也用Model来代表函数式模型. Keras函数式模型接口是用户定义多输出模型.非循环有向模型或具有共享层的模型等复杂模型的途径.一句话,只要你的模型不是类似VGG一样一条路走到黑的模型,或者你的模型需要多于一个的输出,那么你总应

通过DCGAN进行生成花朵

环境是你要安装Keras和Tensorflow 先来个network.py,里面定义了生成器网络和鉴别器网络: 1 # -*- coding: UTF-8 -*- 2 3 """ 4 DCGAN 深层卷积的生成对抗网络 5 """ 6 7 import tensorflow as tf 8 9 # Hyper parameter(超参数) 10 EPOCHS = 100 11 BATCH_SIZE = 128 12 LEARNING_RATE =

Xception

目录 1. 提出背景 2.论文核心 2.1 Depthwise Separable Convolution 深度分离卷积 2.1.1 常规卷积操作 2.1.2 DepthWise Convolution 2.1.3 PointWise Convolution 3. 网络结构 4. 核心代码 论文: Xception: Deep Learning with Depthwise Separable Convolutions 论文地址: https://arxiv.org/abs/1610.02357

TensorFlow从1到2(二)续讲从锅炉工到AI专家

图片样本可视化 原文第四篇中,我们介绍了官方的入门案例MNIST,功能是识别手写的数字0-9.这是一个非常基础的TensorFlow应用,地位相当于通常语言学习的"Hello World!". 我们先不进入TensorFlow 2.0中的MNIST代码讲解,因为TensorFlow 2.0在Keras的帮助下抽象度比较高,代码非常简单.但这也使得大量的工作被隐藏掉,反而让人难以真正理解来龙去脉.特别是其中所使用的样本数据也已经不同,而这对于学习者,是非常重要的部分.模型可以看论文.在网

神经网络之全连接层(线性层)

对于神经网络的全连接层,前面已经使用矩阵的运算方式实现过,本篇将引入tensorflow中层的概念, 正式使用deep learning相关的API搭建一个全连接神经网络.下面是全连接神经网络的结构图 其中,x1,x2,x3为输入,a1,a2,a3为输出,运算关系如下: x1,x2,x3所在的层叫神经网络的输入层,a1,a2,a3所在的层叫神经网络的输出层,如果两层中间还有若干层,那么中间的这些层叫做隐藏层. 那么,如何使用tensorflow去创建这样的层呢?其实非常简单,只需要调用tf.ke

Win10安装Tensorflow流水账

给电脑安装Tensorflow,由于安装过程太过繁琐,记个流水账便于日后再装时查询 资源下载表 Name URL version Python https://www.python.org/downloads/ 看这个 https://www.tensorflow.org/install/pip Tensorflow https://www.tensorflow.org/install/pip 看这个 https://www.tensorflow.org/install/pip CUDA htt