erro Theano de keras

votos
0

Estou executando um script keras (sem chamada direta para Theano no meu script) e eu recebo o seguinte erro:

TypeError: ('An update must have the same type as the original shared                     
variable (shared_var=<TensorType(float32, matrix)>, 
shared_var.type=TensorType(float32, matrix),     
update_val=Elemwise{add,no_inplace}.0, 
update_val.type=TensorType(float64, matrix)).', 
'If the difference is related to the broadcast pattern, 
you can call the tensor.unbroadcast(var, axis_to_unbroadcast[, ...])
function to remove broadcastable dimensions.')

Eu vi o erro de pessoas corrida Theano diretamente, mas não através keras. Não sei o que devo fazer, já que eu não estou lidando com tensores diretamente.

Publicado 25/03/2016 em 16:12
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

o problema foi que há uma mudança na versão keras (Eu estou usando atualmente keras 0.3.2 com Theano 0.8.0) e que costumava ser muito bem não funciona bem com ele nova versão keras.

O seguinte foi o código original, e veja a correção abaixo.

from keras.models import Sequential
import keras.optimizers
from keras.layers.core import Dense, Dropout
from keras.layers.normalization import BatchNormalization
from keras.layers.advanced_activations import PReLU
from keras.layers.core import Activation
from keras.optimizers import SGD, Adam

from sklearn.preprocessing import StandardScaler
from sklearn.base import BaseEstimator, RegressorMixin

class NnRegression(BaseEstimator, RegressorMixin):
        def __init__(self, apply_standart_scaling=True,
             dropx=[0.2, 0.5, 0.5], nb_neuronx=[50, 30], nb_epoch=105, validation_split=0.,
             verbose=1):
        self.apply_standart_scaling = apply_standart_scaling
        self.dropx = dropx
        self.nb_neuronx = nb_neuronx
        self.nb_epoch = nb_epoch
        self.validation_split = validation_split
        self.verbose = verbose

    def fit(self, X, y):

        nb_features = X.shape[1]
        self.standart_scaling = StandardScaler() if self.apply_standart_scaling else None

        if self.standart_scaling:
            X = self.standart_scaling.fit_transform(X)

        model = Sequential()
        model.add(Dropout(input_shape = (nb_features,),p= self.dropx[0]))
        model.add(Dense(output_dim = self.nb_neuronx[0], init='glorot_uniform'))
        model.add(PReLU())
        model.add(BatchNormalization(self.nb_neuronx[0],)))
        model.add(Dropout(self.dropx[1]))

        model.add(Dense(self.nb_neuronx[1], init='glorot_uniform'))
        model.add(PReLU())
        model.add(BatchNormalization(self.nb_neuronx[0],)))
        model.add(Dropout(self.dropx[2]))

        model.add(Dense(1, init='glorot_uniform'))

        nn_verbose = 1 if self.verbose>0 else 0
        optz = keras.optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
        model.compile(optimizer=Adam(),loss='mse')
        model.fit(X, y, batch_size=16,
              nb_epoch=self.nb_epoch, validation_split=self.validation_split, verbose=nn_verbose)

        self.model = model

    def predict(self, X):
        if self.standart_scaling:
            X = self.standart_scaling.transform(X)
        return self.model.predict_proba(X, verbose=0)

assim, verifica-se que o problema é esta única linha de código:

model.add(BatchNormalization(self.nb_neuronx[0],)))

Ele realmente deve ser:

model.add(BatchNormalization())

porque o número de neurônios não tem nenhum negócio dentro da camada de normalização (no entanto isso não incômodo em uma versão keras anterior).

Isso aparentemente faz com que Theano para gerar novos pesos que não são float32 mas float64, e que desencadeia a mensagem acima.

Respondeu 26/03/2016 em 21:21
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more