2017-10-11 11 views
0

Quelle est la différence entre model_weights et optimizer_weights dans keras. après avoir exécuté le code suivant model.summary montre le total des 9 paramètres, ce qui montre dans le poids du modèle dans 1.h5 fichier. Mais optimizer_weight montre au total 18 paramètres. Je n'ai utilisé qu'une seule époque. Code suit:Différence entre model_weights et optimizer_weights dans keras

from __future__ import print_function 
import keras 
from keras.datasets import mnist 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Flatten 
from keras.layers import Conv2D, MaxPooling2D 
from keras import backend as K 
import numpy as np 
from sklearn.model_selection import train_test_split 
import tensorflow as tf 
batch_size = 128 
num_classes = 2 
epochs = 1 

# input image dimensions 
img_rows, img_cols = 28, 28 
(x_train, y_train), (x_test, y_test) = mnist.load_data() 

#Redistributing data for only two classes 
x1_train=x_train[y_train==0]; y1_train=y_train[y_train==0] 
x1_test=x_test[y_test==0];y1_test=y_test[y_test==0] 
x2_train=x_train[y_train==1];y2_train=y_train[y_train==1] 
x2_test=x_test[y_test==1];y2_test=y_test[y_test==1] 
X=np.concatenate((x1_train,x2_train,x1_test,x2_test),axis=0) 
Y=np.concatenate((y1_train,y2_train,y1_test,y2_test),axis=0) 
# the data, shuffled and split between train and test sets 
x_train, x_test, y_train, y_test = train_test_split(X,Y) 

if K.image_data_format() == 'channels_first': 
    x_train = x_train.reshape(x_train.shape[0], 1, img_rows, img_cols) 
    x_test = x_test.reshape(x_test.shape[0], 1, img_rows, img_cols) 
    input_shape = (1, img_rows, img_cols) 
else: 
    x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1) 
    x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1) 
    input_shape = (img_rows, img_cols, 1) 

x_train = x_train.astype('float32') 
x_test = x_test.astype('float32') 
x_train /= 255 
x_test /= 255 
print('x_train shape:', x_train.shape) 
print(x_train.shape[0], 'train samples') 
print(x_test.shape[0], 'test samples') 

# convert class vectors to binary class matrices 
y_train = keras.utils.to_categorical(y_train, num_classes) 
y_test = keras.utils.to_categorical(y_test, num_classes) 

model = Sequential() 
model.add(Conv2D(1, kernel_size=(2, 2), 
       activation='relu', 
       input_shape=input_shape)) 
model.add(MaxPooling2D(pool_size=(16,16))) 
model.add(Flatten()) 
model.add(Dense(num_classes, activation='softmax')) 
model.compile(loss=keras.losses.categorical_crossentropy, 
       optimizer=keras.optimizers.Adadelta(), 
       metrics=['accuracy']) 
model.fit(x_train, y_train, 
      batch_size=batch_size, 
      epochs=epochs, 
      verbose=1, 
      validation_data=(x_test, y_test)) 
model.summary() 
model.save('1.h5') 

Répondre

0

poids du modèle sont des poids qui agissent sur les données réelles. Ils affecteront la sortie. Un modèle seul (sans optimiseur) est suffisant pour prendre une entrée et produire (prédire) une sortie. Le mieux les poids du modèle, meilleure est la sortie.

L'objectif principal de l'entraînement d'un modèle est d'ajuster ses poids afin qu'il puisse faire de bonnes prédictions.

Un optimiseur, d'autre part, n'a aucune influence sur les données et les prédictions.
Le rôle de l'optimiseur est de décider comment modifier les poids du modèle pendant l'entraînement. Je suis purement à des fins d'entraînement. L'optimiseur obtient les gradients et décide comment appliquer ces dégradés au modèle. (En tenant compte des taux d'apprentissage, de l'élan, etc.)

Les poids de l'optimiseur ne sont que des aides pour améliorer l'ajustement des poids du modèle. Une fois que vous considérez que votre modèle fait du bon travail, vous pouvez éliminer l'optimiseur.

+0

Mais pourquoi model_weights sont 9 et optimizer_weights sont au nombre de 18 dans l'exemple ci-dessus. (J'utilise epoch = 1). Et supposons que je n'utilise pas d'optimiseurs basés sur des dégradés (en utilisant un essaim basé) alors quel poids dois-je mettre à jour, model_weights ou optimizer_weights? – Hitesh

+0

Je ne sais pas comment fonctionnent les optimiseurs d'essaims ... Mais je pense qu'il faut prendre soin de ses propres poids ... Vous pouvez essayer d'augmenter votre modèle et de voir ce qu'il advient des poids de l'optimiseur. –

+0

Je comprends. La seule confusion est, pourquoi pas de paramètres pour models_weights et optimizer_weight sont différents (pour l'exemple ci-dessus 9 et 18, j'ai obtenu de model.save) – Hitesh