理解 keras 中的 "Layer" 和 "Tensor"

keras 中有两个基本的概念:LayerTensor

Layer :是模型的组成单位,用于构建神经网络框架 在 keras 中用 大写的 module 表示,用于搭建纯模型框架,涉及到计算时使用属性 input 或 output 调出其 Tensor 如以下代码,多用于简单的 Sequential 结构(导入模块部分省略,python=3.7, keras=2.2)

n_in = 512
n_out = 2
model_1 = Sequential([Dense(n_out, input_shape = (n_in,))])
model_2 = Sequential([Dense(n_out, input_dim = n_in)])
model = Sequential()
model.add(Concatenate([model_1, model_2]))
model.compile(loss='categorical_crossentropy', optimizer='SGD')

上述代码使用了大写的 Concatenate function 表示一个 Layer,这个 function 的参数是元素为 Layer 的 list;
输出的结果是可以构筑 model 的 Layer,这样一个完整的 神经网络 model 完成了
如果要使用小写的 concatenate function,这个 function 里面的参数是元素为 Tensor 的 list

  • Sequential function 返回模型的结构
model_1 = Sequential([Dense(n_out)])
model_1 #assert is <keras.engine.sequential.Sequential at 0x299b8163780>

返回值为 sequential 序列模型储存位置
若将它储存到模型中

model = Sequential()
model.add(Dense(32, input_dim=784))
model.add(Activation('relu'))
model.add(model_1)
model.summary()

最后一行是

  • sequential_1 (Sequential) (None, 2)

model_1 的 layers 属性返回一个包含其所用有的所有层的列表

type(model_1.layers)
  • list
model_2 = model_1.layers[0]
model_2 = Dense(2)
#two statements above are the same as each other
#the first code script using the core layers
model_1 = Dense(n_out, input_shape = (n_in,))
model_2 = Dense(n_out, input_dim = n_in)
model = Sequential()
model.add(Concatenate([model_1, model_2]))
model.compile(loss='categorical_crossentropy', optimizer='SGD')

model_2 还是 Layer,若要使用其产生的 Tensor
则使用

model_2.input
#or
model_2.output

input_shape = (n_in,)
main_input = Input(shape = input_shape)
x = main_input
x = model_2(x)
#is the same as
x = Dense(2)(x)

回到刚开始提出的问题,如果要使用小写的 concatenate function,则要使用 Tensor

model.add(concatenate([model_1.layers[0].output,model_2.layers[0].output]))
  • 不能像上面这样写,因为 concatenate function 返回的不是 Layer,而是 Tensor
  • 若要将 Tensor 转化为 Layer,则需要用到 Lambda function(同样需要首字母大写)
x = Lambda(lambda x: concatenate([model_1.layers[0].output,model_2.layers[0].output]))
model.add(x)

另一种组成神经网络模型的方法是用 Keras functional API
keras functional API 使用 Tensor 传递的方法构建神经网络框架

input_shape = (n_in,)
main_input = Input(shape = input_shape)
x = main_input
x_1 = Dense(256)(x)
x_2 = Dense(256)(x)
x = Concatenate()([x_1, x_2])
main_output = Dense(2, activation = 'softmax')(x)
model = Model(inputs = main_input, outputs = main_output)
model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])

这里用到了大写的 Concatenate function,将 Tensor 参数放在 function 后面调用,返回的同样是 Tensor

  • 如果使用小写的 concatenate function,这个 function 本身返回的就是 Tensor
input_shape = (n_in,)
main_input = Input(shape = input_shape)
x = main_input
x_1 = Dense(256)(x)
x_2 = Dense(256)(x)
x = concatenate([x_1, x_2]) #note: here is the lowercase function
main_output = Dense(2, activation = 'softmax')(x)
model = Model(inputs = main_input, outputs = main_output)
model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`tf.keras.layers.LayerNormalization` 是 TensorFlow 的一个层,用于实现层归一化(Layer Normalization)操作。 层归一化是一种归一化技术,旨在在深度神经网络减少内部协变量偏移(Internal Covariate Shift)。它可以将每个样本的特征进行归一化,而不是整个批次。 层归一化的计算方如下: 1. 对于一个输入张量 x,计算其均值 μ 和方差 σ。 2. 使用以下公对输入进行归一化:(x - μ) / sqrt(σ^2 + ε),其 ε 是一个小的常数,用于防止除以零。 3. 使用两个可训练参数(缩放因子和偏移量)对归一化后的值进行缩放和平移:gamma * 归一化值 + beta。 `tf.keras.layers.LayerNormalization` 可以作为神经网络模型的一层,在模型应用层归一化操作。它可以应用于任何维度的输入张量,并且可以在训练过程自动更新可训练参数。 以下是一个使用 `tf.keras.layers.LayerNormalization` 的简单示例: ```python import tensorflow as tf # 创建一个 LayerNormalization 层 layer_norm = tf.keras.layers.LayerNormalization() # 创建一个输入张量 input_tensor = tf.keras.Input(shape=(64,)) # 应用层归一化操作 normalized_tensor = layer_norm(input_tensor) # 创建一个模型 model = tf.keras.Model(inputs=input_tensor, outputs=normalized_tensor) ``` 在上述示例,`input_tensor` 是一个形状为 (batch_size, 64) 的输入张量。`normalized_tensor` 是应用层归一化操作后的输出张量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值