首页 > 解决方案 > 反复保存Conv2D(tensorflow)的结果,覆盖同一个变量

问题描述

我一直在关注一些 tensorflow 教程来完善一些 CNN 技能。为了向 CNN 添加层,我一直这样做:

model = Sequential()
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

但是我看到了一些对我来说使用了一些非常违反直觉的语法的例子,例如:

#Encoder
encoder_input = Input(shape=(256, 256, 1,))
encoder_output = Conv2D(64, (3,3), activation='relu', padding='same', strides=2)(encoder_input)
encoder_output = Conv2D(128, (3,3), activation='relu', padding='same')(encoder_output)
encoder_output = Conv2D(128, (3,3), activation='relu', padding='same', strides=2)(encoder_output)
encoder_output = Conv2D(256, (3,3), activation='relu', padding='same')(encoder_output)
encoder_output = Conv2D(256, (3,3), activation='relu', padding='same', strides=2)(encoder_output)
encoder_output = Conv2D(512, (3,3), activation='relu', padding='same')(encoder_output)
encoder_output = Conv2D(512, (3,3), activation='relu', padding='same')(encoder_output)
encoder_output = Conv2D(256, (3,3), activation='relu', padding='same')(encoder_output)

我刚刚假设您必须定义一个模型,然后使用model.add适当的图层功能添加图层。

在第二个代码块中,他们甚至没有定义模型。然后他们只是一遍又一遍地重新定义同一个变量。如果Con2D函数直接影响到 tensorflow 模型,为什么要保存到变量中呢?

我注意到(encoder_input)每行末尾的(这是一个元组吗?)或类似的。这是我以前从未见过的一些特殊语法吗?它是通用的 python 语法还是特定于 tensorflow?

标签: pythontensorflow

解决方案


到时候,Keras为您提供了两种定义网络模型的方法。可能你想看看这些文章:

因此,encoder_input在您的情况下,它不是元组,它必须是张量。您所做的就是Conv2D(64, (3,3), activation='relu', padding='same', strides=2)(encoder_input)将.encoder_inputConv2D()


推荐阅读