Как встроить мой настроенный тензорный слой в модель кераса - PullRequest
0 голосов
/ 06 декабря 2018

Ниже приведен код одного простого примера того, что я хочу реализовать:

Ошибка : увеличить TypeError («входы должны быть последовательностью»), TypeError: входы должны бытьпоследовательность

Как решить эту проблему, чтобы программа могла работать?Любая помощь будет оценена.

from keras.models import Sequential
from keras.layers import LSTM, Dense, Flatten
import numpy as np
from keras.engine.topology import Layer
import tensorflow as tf


class MyLayer(Layer):

    def __init__(self, **kwargs):
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        super(MyLayer, self).build(input_shape)  

    def call(self, x):
        "Some other tf function will be put at here"
        outputs, state = tf.contrib.rnn.static_rnn(tf.contrib.rnn.LSTMBlockCell(32), x, dtype=tf.float32)
        return outputs

    def compute_output_shape(self, input_shape):
        return input_shape


def get_model(timesteps, data_dim):
    model = Sequential()
    model.add(LSTM(32, return_sequences=True, input_shape=(timesteps, data_dim)))
    model.add(LSTM(32, return_sequences=True))
    model.add(MyLayer())  # this is my layer

    model.add(Flatten())
    model.add(Dense(10, activation='softmax'))
    return model


def run_demo():
    data_dim = 16
    timesteps = 8
    num_classes = 10

    model = get_model(timesteps, data_dim)
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
    """Generate the traning and validation data"""
    x_train = np.random.random((1000, timesteps, data_dim))
    y_train = np.random.random((1000, num_classes))
    x_val = np.random.random((100, timesteps, data_dim))
    y_val = np.random.random((100, num_classes))

    model.fit(x_train, y_train, batch_size=64, epochs=5, validation_data=(x_val, y_val))


if __name__ == "__main__":
    run_demo()

1 Ответ

0 голосов
/ 11 декабря 2018

Извините, я не слишком знаком с Рекуррентной моделью.

Но я думаю, что проблема заключается в размере ввода.

Размер в пользовательском слое (?, 8, 32), но tf.nn.static_rnn требует список типа

enter image description here

, поэтому вам нужно изменить размер ввода, тогда проблема будет решена.

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Flatten, Dense

class MyLayer(tf.keras.layers.Layer):

    def __init__(self, **kwargs):
        super(MyLayer, self).__init__(**kwargs)

    def build(self, input_shape):
        self.cell = tf.nn.rnn_cell.BasicRNNCell(32)
        super(MyLayer, self).build(input_shape)

    def call(self, x):
        "Some other tf function will be put at here"
        rnn_inputs = tf.unstack(x, axis=1)
        outputs, state = tf.nn.static_rnn(self.cell, rnn_inputs, dtype=tf.float32)
        for i in range(len(outputs)):
            outputs[i] = tf.expand_dims(outputs[i], axis=1)
        outputs = tf.concat(outputs, axis=1)
        return outputs

    def compute_output_shape(self, input_shape):
        return input_shape

def get_model(timesteps, data_dim):
    model = Sequential()
    model.add(LSTM(32, return_sequences=True, input_shape=(timesteps, data_dim)))
    model.add(LSTM(32, return_sequences=True))
    model.add(MyLayer())  # this is my layer

    model.add(Flatten())
    model.add(Dense(10, activation='softmax'))
    return model

def run_demo():
    data_dim = 16
    timesteps = 8
    num_classes = 10

    model = get_model(timesteps, data_dim)
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
    """Generate the traning and validation data"""
    x_train = np.random.random((1000, timesteps, data_dim))
    y_train = np.random.random((1000, num_classes))
    x_val = np.random.random((100, timesteps, data_dim))
    y_val = np.random.random((100, num_classes))

    model.fit(x_train, y_train, batch_size=64, epochs=5, validation_data=(x_val, y_val))

if __name__ == "__main__":
    run_demo()
...