Estoy jugando con el conjunto de datos de ejemplo de Reuters y funciona bien (mi modelo está entrenado). Leí sobre cómo guardar un modelo, para poder cargarlo más tarde para usarlo nuevamente. Pero, ¿cómo utilizo este modelo guardado para predecir un nuevo texto? Lo uso models.predict()
?
¿Tengo que preparar este texto de forma especial?
Lo probé con
import keras.preprocessing.text
text = np.array(['this is just some random, stupid text'])
print(text.shape)
tk = keras.preprocessing.text.Tokenizer(
nb_words=2000,
filters=keras.preprocessing.text.base_filter(),
lower=True,
split=" ")
tk.fit_on_texts(text)
pred = tk.texts_to_sequences(text)
print(pred)
model.predict(pred)
Pero siempre consigo
(1L,)
[[2, 4, 1, 6, 5, 7, 3]]
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-83-42d744d811fb> in <module>()
7 print(pred)
8
----> 9 model.predict(pred)
C:\Users\bkey\Anaconda2\lib\site-packages\keras\models.pyc in predict(self, x, batch_size, verbose)
457 if self.model is None:
458 self.build()
--> 459 return self.model.predict(x, batch_size=batch_size, verbose=verbose)
460
461 def predict_on_batch(self, x):
C:\Users\bkey\Anaconda2\lib\site-packages\keras\engine\training.pyc in predict(self, x, batch_size, verbose)
1132 x = standardize_input_data(x, self.input_names,
1133 self.internal_input_shapes,
-> 1134 check_batch_dim=False)
1135 if self.stateful:
1136 if x[0].shape[0] > batch_size and x[0].shape[0] % batch_size != 0:
C:\Users\bkey\Anaconda2\lib\site-packages\keras\engine\training.pyc in standardize_input_data(data, names, shapes, check_batch_dim, exception_prefix)
79 for i in range(len(names)):
80 array = arrays[i]
---> 81 if len(array.shape) == 1:
82 array = np.expand_dims(array, 1)
83 arrays[i] = array
AttributeError: 'list' object has no attribute 'shape'
¿Tiene alguna recomendación sobre cómo hacer predicciones con un modelo entrenado?
fit()
.Muestra https://gist.github.com/alexcpn/0683bb940cae510cf84d5976c1652abd
fuente
¡Debes usar el mismo Tokenizer que usaste para construir tu modelo!
De lo contrario, esto le dará un vector diferente a cada palabra.
Entonces, estoy usando:
phrase = "not good" tokens = myTokenizer.texts_to_matrix([phrase]) model.predict(np.array(tokens))
fuente
Entrené una red neuronal en Keras para realizar una regresión no lineal en algunos datos. Esta es una parte de mi código para probar nuevos datos utilizando la configuración y los pesos del modelo guardados previamente.
fname = r"C:\Users\tauseef\Desktop\keras\tutorials\BestWeights.hdf5" modelConfig = joblib.load('modelConfig.pkl') recreatedModel = Sequential.from_config(modelConfig) recreatedModel.load_weights(fname) unseenTestData = np.genfromtxt(r"C:\Users\tauseef\Desktop\keras\arrayOf100Rows257Columns.txt",delimiter=" ") X_test = unseenTestData standard_scalerX = StandardScaler() standard_scalerX.fit(X_test) X_test_std = standard_scalerX.transform(X_test) X_test_std = X_test_std.astype('float32') unseenData_predictions = recreatedModel.predict(X_test_std)
fuente
Puede simplemente "llamar" a su modelo con una matriz de la forma correcta:
model(np.array([[6.7, 3.3, 5.7, 2.5]]))
Ejemplo completo:
from sklearn.datasets import load_iris from tensorflow.keras.layers import Dense from tensorflow.keras.models import Sequential import numpy as np X, y = load_iris(return_X_y=True) model = Sequential([ Dense(16, activation='relu'), Dense(32, activation='relu'), Dense(1)]) model.compile(loss='mean_absolute_error', optimizer='adam') history = model.fit(X, y, epochs=10, verbose=0) print(model(np.array([[6.7, 3.3, 5.7, 2.5]])))
<tf.Tensor: shape=(1, 1), dtype=float64, numpy=array([[1.92517677]])>
fuente