簡體   English   中英

如果那些不在源代碼中,如何調用Sequential()類的函數?

[英]How to call functions of the class Sequential() if those are not in the source code?

我是機器學習的新手,我正在嘗試在keras中實現我的自定義層。 我找到了幾個教程,看起來比較直接。 但我不明白的是如何在Sequential()中實現我的新自定義圖層。 例如,我從tensorflow網站( https://www.tensorflow.org/tutorials/keras/basic_text_classification )上看到了這個分類問題,為方便起見,貼在這里:

from __future__ import absolute_import, division, print_function

import tensorflow as tf
from tensorflow import keras
import numpy as np


imdb = keras.datasets.imdb
(train_data, train_labels), (test_data, test_labels) = imdb.load_data(num_words=10000)

# A dictionary mapping words to an integer index
word_index = imdb.get_word_index()
# The first indices are reserved
word_index = {k:(v+3) for k,v in word_index.items()}
word_index["<PAD>"] = 0
word_index["<START>"] = 1
word_index["<UNK>"] = 2  # unknown
word_index["<UNUSED>"] = 3

reverse_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 = 10000

model = 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()的源代碼:

https://github.com/keras-team/keras/blob/a1397169ddf8595736c01fcea084c8e34e1a3884/keras/engine/sequential.py

Sequential是模型,而不是圖層。

您提到的函數( summarycompilefitevaluate )在此處鏈接Model類中實現,因為Sequential是Model的子類。

如果您正在編寫自定義圖層,則應該改為繼承Layer,而不是Model或Sequential。

您需要實現buildcallcompute_output_shape來創建自己的圖層。

Keras文檔中有幾個例子

from keras import backend as K
from keras.layers import Layer

class 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類,然后像默認的Keras圖層一樣添加它:

from custom.layers import MyLayer

model = keras.Sequential()
model.add(MyLayer())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM