Как я могу поменять тусклые цвета в керас с размером партии? - PullRequest
0 голосов
/ 30 августа 2018

Я хотел бы привлечь внимание в CNN. внимание (N, 1), в то время как N - размер партии. и я хотел бы изменить его на (1, N), а затем использовать softmax. Pytorch может сделать это, используя «transpose». Но когда я использую «Permute» в keras, возникает ошибка:

Input 0 is incompatible with layer flatten_2: expected min_ndim=3, found ndim=2

мой код здесь:

class AttentionModel:
    def __init__(self):
        self.L = 500
        self.D = 128
        self.K = 1

        inputs = Input(shape=(28,28,1))
        result1 = self.feature_extractor_part1(inputs)
        result2 = self.feature_extractor_part2(result1)  # (N,500)

        attention=self.attention(result2) #(N,1)
        attention=Permute(dims=(2,1))(attention) #(1,N) !!PROBLEM!!
        attention=Flatten()(attention)
        attention=Activation('softmax')(attention) #(1,N)

        M=Dot()(attention,result2) #(K,L)

        final_result=self.classifer(M)

        self.model=Model(inputs=inputs,outputs=final_result)

        self.model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])

    def feature_extractor_part1(self, inputs):
        conv1 = Conv2D(20, kernel_size=5, activation='relu')(inputs)
        pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
        conv2 = Conv2D(50, kernel_size=5, activation='relu')(pool1)
        pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

        return pool2

    def feature_extractor_part2(self, inputs):
        flat = Flatten()(inputs)
        dense = Dense(self.L, activation='relu')(flat)

        return dense

    def attention(self, inputs):
        flat1 = Dense(self.D, activation='tanh')(inputs)
        flat2 = Dense(self.K)(flat1)

        return flat2

    def classifer(self,inputs):
        result=Dense(1,activation='sigmoid')(inputs)

        return result

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Проблема вашей линии attention=Permute(dims=(2,1))(attention) в том, что вы просто пренебрегаете пакетным затемнением. Таким образом, он выдаст что-то вроде (batch_size*, N), что, по-видимому, неправильно.

Если вы измените его на attention=Permute(dims=(0,2,1))(attention), оно будет работать. Форма вывода будет (batch_size, 1, N), как вы и просили.

0 голосов
/ 30 августа 2018

Использовать внутренний слой keras transpose, обернутый слоем Lambda. Что-то вроде:

from keras import backend as K
from keras.layers import Input, Lambda
from keras.models import Model

seq = Input(shape=(1,))
mypermute = lambda x: K.transpose(x)
b = Lambda(mypermute)(seq)
model = Model(inputs=seq, outputs=b)
print(model.summary())

выход:

> Layer (type)                 Output Shape              Param #
> ================================================================= 
> input_1 (InputLayer)         (None, 1)                 0
> _________________________________________________________________ 
> lambda_1 (Lambda)            (1, None)                 0
> ================================================================= 
> Total params: 
> 0 Trainable params: 
> 0 Non-trainable params: 0
> _________________________________________________________________
...