【发布时间】:2019-11-26 23:45:34
【问题描述】:
我对以下 CNN 有疑问。我习惯了 keras 代码,通常当我看到模型时,它们是按照以下思路构建的:
def foo_model():
# create model
model = Sequential()
model.add(Convolution2D(30, (5,5), kernel_initializer='normal', padding='valid', input_shape=(1, 28, 28), activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Convolution2D(15, (3,3), kernel_initializer='normal', padding='valid', input_shape=(1,28,28)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
return model
所以,基本上,初始化模型的类型,然后继续添加层(逐层),编译模型然后返回它。我正在做一个情绪分析,我偶然发现了以下 CNN:
def ConvNet(embeddings, max_sequence_length, num_words, embedding_dim, labels_index):
embedding_layer = Embedding(num_words,
embedding_dim,
weights=[embeddings],
input_length=max_sequence_length,
trainable=False)
sequence_input = Input(shape=(max_sequence_length,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)
convs = []
filter_sizes = [2,3,4,5,6]
for filter_size in filter_sizes:
l_conv = Conv1D(filters=200, kernel_size=filter_size, activation='relu')(embedded_sequences)
l_pool = GlobalMaxPooling1D()(l_conv)
convs.append(l_pool)
l_merge = concatenate(convs, axis=1)
x = Dropout(0.1)(l_merge)
x = Dense(128, activation='relu')(x)
x = Dropout(0.2)(x)
preds = Dense(labels_index, activation='sigmoid')(x)
model = Model(sequence_input, preds)
model.compile(loss='binary_crossentropy',
optimizer='adam',
metrics=['acc'])
model.summary()
return model
我无法理解这个 CNN 中的层是如何构建的。当我用我的数据初始化模型时,模型摘要如下所示;
我很难理解这个模型的结构,以及它是如何构建的。例如,sequence_input 和变量有什么作用?为什么有一个似乎创建 Conv1D 层和 GlobalMaxPooling1D 层的 for 循环,但它们似乎没有添加到任何地方?为什么有一个变量 x 被重新声明了 3 次(对于 dropout、dense 和 dropout 层),以及所有层都添加到哪里?
【问题讨论】:
标签: python keras conv-neural-network