tensorflow.keras.layers 中是否有方法可以在 运行 模型之前获取特定层的输出形状?
Is there a method in tensorflow.keras.layers to get the output shape of a specific layer before running the model?
我正在使用具有以下结构的 TensorFlow 后端使用 Keras 构建 CNN:
# Create the Second Model in Ensemble
def createModel(self, model_input, n_outputs, first_session=True):
if first_session != True:
model = load_model('ideal_model.hdf5')
return model
# Define Input Layer
inputs = model_input
# Define Max Pooling Layer
conv = MaxPooling2D(pool_size=(3, 3), padding='same')(inputs)
# Define Layer Normalization Layer
conv = LayerNormalization()(inputs)
# Define Leaky ReLU Layer
conv = LeakyReLU(alpha=0.1)(conv)
# Define Dropout Layer
conv = Dropout(0.2)(conv)
# Define First Conv2D Layer
conv = Conv2D(filters=64,
kernel_size=(3, 3),
activation='relu',
padding='same',
strides=(3, 2))(conv)
conv = Dropout(0.3)(conv)
# Define Second Conv2D Layer
conv = Conv2D(filters=32,
kernel_size=(5, 5),
activation='relu',
padding='same',
strides=(3, 2))(conv)
conv = Dropout(0.3)(conv)
# Define Softmax Layer
conv = Softmax(axis=1)(conv)
# Define Reshape Layer
conv = Reshape((conv._keras_shape[1]*conv._keras_shape[2]*conv._keras_shape[3],))(conv)
# Define Sigmoid Dense Layer
conv = Dense(64, activation='sigmoid')(conv)
# Define Output Layer
outputs = Dense(n_outputs, activation='softmax')(conv)
# Create Model
model = Model(inputs, outputs)
model.summary()
return model
目前,我 运行 遇到了一些麻烦,因为我正在尝试使用 Reshape 层来展平张量,并且我正在尝试避免对输出的维度进行硬编码如果可能,将上一层放入 Reshape 层。 (注意:Flatten层不被程序最终运行所在的FPGA中的内核支持,所以我不能使用它们。)上面的代码产生了以下错误:
AttributeError: 'Tensor' object has no attribute '_keras_shape'
发生这种情况是因为由于模型架构开头的 LayerNormalization
层,我不得不使用 tensorflow.keras.layers
(而不是 keras.layers
)导入层。
所以,我想知道是否有一种方法可以在编译模型之前在tensorflow.keras.layers
中获取特定层的输出形状。
conv.shape
或者 tf.shape(conv)
我正在使用具有以下结构的 TensorFlow 后端使用 Keras 构建 CNN:
# Create the Second Model in Ensemble
def createModel(self, model_input, n_outputs, first_session=True):
if first_session != True:
model = load_model('ideal_model.hdf5')
return model
# Define Input Layer
inputs = model_input
# Define Max Pooling Layer
conv = MaxPooling2D(pool_size=(3, 3), padding='same')(inputs)
# Define Layer Normalization Layer
conv = LayerNormalization()(inputs)
# Define Leaky ReLU Layer
conv = LeakyReLU(alpha=0.1)(conv)
# Define Dropout Layer
conv = Dropout(0.2)(conv)
# Define First Conv2D Layer
conv = Conv2D(filters=64,
kernel_size=(3, 3),
activation='relu',
padding='same',
strides=(3, 2))(conv)
conv = Dropout(0.3)(conv)
# Define Second Conv2D Layer
conv = Conv2D(filters=32,
kernel_size=(5, 5),
activation='relu',
padding='same',
strides=(3, 2))(conv)
conv = Dropout(0.3)(conv)
# Define Softmax Layer
conv = Softmax(axis=1)(conv)
# Define Reshape Layer
conv = Reshape((conv._keras_shape[1]*conv._keras_shape[2]*conv._keras_shape[3],))(conv)
# Define Sigmoid Dense Layer
conv = Dense(64, activation='sigmoid')(conv)
# Define Output Layer
outputs = Dense(n_outputs, activation='softmax')(conv)
# Create Model
model = Model(inputs, outputs)
model.summary()
return model
目前,我 运行 遇到了一些麻烦,因为我正在尝试使用 Reshape 层来展平张量,并且我正在尝试避免对输出的维度进行硬编码如果可能,将上一层放入 Reshape 层。 (注意:Flatten层不被程序最终运行所在的FPGA中的内核支持,所以我不能使用它们。)上面的代码产生了以下错误:
AttributeError: 'Tensor' object has no attribute '_keras_shape'
发生这种情况是因为由于模型架构开头的 LayerNormalization
层,我不得不使用 tensorflow.keras.layers
(而不是 keras.layers
)导入层。
所以,我想知道是否有一种方法可以在编译模型之前在tensorflow.keras.layers
中获取特定层的输出形状。
conv.shape
或者 tf.shape(conv)