我对机器学习还比较新手,正在尝试在Keras中实现我自己的自定义层。我找到了一些教程,看起来相对简单直观。然而,我不明白如何在Sequential()中实现我的新自定义层。例如,我从TensorFlow网站上拿了一个分类问题(https://www.tensorflow.org/tutorials/keras/basic_text_classification),在这里分享给大家方便参考:
from __future__ import absolute_import, division, print_functionimport tensorflow as tffrom tensorflow import kerasimport numpy as npimdb = keras.datasets.imdb(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)# A dictionary mapping words to an integer indexword_index = imdb.get_word_index()# The first indices are reservedword_index = {k:(v+3) for k,v in word_index.items()}word_index["<PAD>"] = 0word_index["<START>"] = 1word_index["<UNK>"] = 2 # unknownword_index["<UNUSED>"] = 3reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])def decode_review(text): return ' '.join([reverse_word_index.get(i, '?') for i in text])train_data = keras.preprocessing.sequence.pad_sequences(train_data, value=word_index["<PAD>"], padding='post', maxlen=256)test_data = keras.preprocessing.sequence.pad_sequences(test_data, value=word_index["<PAD>"], padding='post', maxlen=256)# input shape is the vocabulary count used for the movie reviews (10,000 words)vocab_size = 10000model = keras.Sequential()model.add(keras.layers.Embedding(vocab_size, 16))model.add(keras.layers.GlobalAveragePooling1D())model.add(keras.layers.Dense(16, activation=tf.nn.relu))model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))model.summary()model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])x_val = train_data[:10000]partial_x_train = train_data[10000:]y_val = train_labels[:10000]partial_y_train = train_labels[10000:]history = model.fit(partial_x_train, partial_y_train, epochs=40, batch_size=512, validation_data=(x_val, y_val), verbose=1)results = model.evaluate(test_data, test_labels)print(results)
我需要更改keras.Sequential()的源代码吗,还是有更简单的方法?
此外,查看Sequential()类的源代码让我感到疑惑:我无法理解像’summary()’、’compile()’、’fit()’和’evaluate()’这样的函数是如何被调用的,因为这些函数在该类源代码中根本没有提供。这里是Sequential()的源代码:
回答:
Sequential
是一个模型,而不是一个层。
您提到的函数(summary
、compile
、fit
、evaluate
)是在这里的Model类中实现的,因为Sequential是Model的子类。
如果您正在编写自定义层,您应该继承Layer类,而不是Model或Sequential。
您需要实现build
、call
和compute_output_shape
来创建您自己的层。
Keras文档中有一些示例供参考:
from keras import backend as Kfrom keras.layers import Layerclass MyLayer(Layer): def __init__(self, output_dim, **kwargs): self.output_dim = output_dim super(MyLayer, self).__init__(**kwargs) def build(self, input_shape): # Create a trainable weight variable for this layer. self.kernel = self.add_weight(name='kernel', shape=(input_shape[1], self.output_dim), initializer='uniform', trainable=True) super(MyLayer, self).build(input_shape) # Be sure to call this at the end def call(self, x): return K.dot(x, self.kernel) def compute_output_shape(self, input_shape): return (input_shape[0], self.output_dim)
要使用它,从您放置MyLayer类的文件中导入MyLayer类,然后像使用默认的Keras层一样添加它:
from custom.layers import MyLayermodel = keras.Sequential()model.add(MyLayer())