2017-10-16 27 views
1

Pour le code ci-dessous, j'ai enregistrer les poids des modèles dans mnist_weights1234.h5. et que vous voulez créer même fichier comme mnist_weights1234.h5 avec la configuration même de la coucheErreur lors de la création du fichier h5 (fichier hdf)

import keras 
from __future__ import print_function 
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 

batch_size = 128 
num_classes = 3 
epochs = 1 

# input image dimensions 
img_rows, img_cols = 28, 28 

#Just for reducing data set 
(x_train, y_train), (x_test, y_test) = mnist.load_data() 
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] 
x3_train=x_train[y_train==2];y3_train=y_train[y_train==2] 
x3_test=x_test[y_test==2];y3_test=y_test[y_test==2] 

X=np.concatenate((x1_train,x2_train,x3_train,x1_test,x2_test,x3_test),axis=0) 
Y=np.concatenate((y1_train,y2_train,y3_train,y1_test,y2_test,y3_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 

# 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.save_weights('mnist_weights1234.h5') 

Maintenant, je veux créer un fichier comme mnist_weights.h5. Donc, j'utilise le code ci-dessous et obtenir une erreur.

hf = h5py.File('mnist_weights12356.h5', 'w') 
hf.create_dataset('conv2d_2/conv2d_2/bias', data=weights[0]) 
hf.create_dataset('conv2d_2/conv2d_2/kernel', data=weights[1]) 
hf.create_dataset('dense_2/dense_2/bias', data=weights[2]) 
hf.create_dataset('dense_2/dense_2/kernel', data=weights[3]) 
hf.create_dataset('flatten_2', data=None) 
hf.create_dataset('max_pooling_2d_2', data=None) 
hf.close() 

Mais obtenir l'erreur suivante: TypeError: Une des données, la forme ou DTYPE doit être spécifié. Comment résoudre le problème

+0

Pourquoi créer ce fichier quand vous pouvez faire 'model.save_weights()' ?? –

+0

Je veux importer des poids de l'extérieur qui sont stockés dans un tableau numpy – Hitesh

Répondre

0

Le message d'erreur a votre solution. Dans ces lignes:

hf.create_dataset('flatten_2', data=None) 
hf.create_dataset('max_pooling_2d_2', data=None) 

Vous donnez des données égal à Aucune. Pour créer un ensemble de données, la bibliothèque HDF5 nécessite un minimum d'informations et, comme l'indique l'erreur, vous devez donner un type dtype (le type de données des éléments de l'ensemble de données) ou un paramètre de données non-None (pour déduire la forme) ou un paramètre de forme. Vous n'en donnez aucun, donc l'erreur est correcte.

Donnez simplement suffisamment d'informations dans l'appel create_dataset pour qu'un jeu de données puisse être créé.

+0

Je connais les lignes d'erreur. En fait Flatten et Maxpool n'ont pas de poids, alors quelles informations je peux donner. – Hitesh

+1

@Hitesh Vous regardez ce que Keras fait déjà, regardez dans le fichier hdf5 avec quelque chose comme h5dump. Pour moi, je vois que les jeux de données ont une forme de (0, 0). –

1

Si vous voulez utiliser des poids qui sont dans des tableaux numpy, il suffit de définir les poids dans les couches:

model.get_layer('conv2d_2').set_weights([weights[1],weights[0]]) 
model.get_layer('dense_2').set_weights([weights[3],weights[2]]) 

Si vos tableaux sont stockés dans des fichiers:

array = numpy.load('arrayfile.npy') 

Vous pouvez enregistrer les Poids total du modèle sous la forme de tableaux numériques:

numpy.save('weights.npy', model.get_weights()) 
model.set_weights(numpy.load('weights.npy')) 
+0

Oui, je pensais la même chose. Je vais essayer et informer – Hitesh