0

keras スクリプトを実行しています (スクリプトで theano を直接呼び出す必要はありません)。次のエラーが表示されます。

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.')

theano を直接実行している人々からのエラーを見てきましたが、keras を介してではありません。テンソルを直接扱っていないため、どうすればよいかわかりません。

4

1 に答える 1

0

問題は、keras のバージョンに変更があり (私は現在、theano 0.8.0 で keras 0.3.2 を使用しています)、以前は正常だったものが新しい keras バージョンではうまく機能しないことです。

以下は元のコードで、以下の修正を参照してください。

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)

さて、問題は次の 1 行のコードにあることがわかりました。

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

実際には次のようになります。

model.add(BatchNormalization())

ニューロンの数は、正規化レイヤー内では関係ないためです (ただし、これは以前の keras バージョンでは問題になりませんでした)。

これにより、float32 ではなく float64 である新しい重みが theano によって生成され、上記のメッセージがトリガーされるようです。

于 2016-03-26T23:21:05.083 に答える