I want to pickle the history object after running a keras fit on tensorflow. But I am getting an error.
JavaScript
x
44
44
1
import gzip
2
import numpy as np
3
import os
4
import pickle
5
import tensorflow as tf
6
from tensorflow import keras
7
8
9
with gzip.open('mnist.pkl.gz', 'rb') as f:
10
train_set, test_set = pickle.load(f, encoding='latin1')
11
12
X_train = np.asarray(train_set[0])
13
y_train = np.asarray(train_set[1])
14
15
X_test = np.asarray(test_set[0])
16
y_test = np.asarray(test_set[1])
17
18
X_valid, X_train = X_train[:5000]/255.0, X_train[5000:]/255.0
19
y_valid, y_train = y_train[:5000], y_train[5000:]
20
21
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
22
'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle Boot']
23
24
model = keras.models.Sequential()
25
model.add(keras.layers.Flatten(input_shape=[28,28]))
26
model.add(keras.layers.Dense(300, activation = 'relu'))
27
model.add(keras.layers.Dense(100, activation = 'relu'))
28
model.add(keras.layers.Dense(10, activation = 'softmax'))
29
model.summary()
30
31
model.compile(loss='sparse_categorical_crossentropy',
32
optimizer='sgd',
33
metrics=['accuracy'])
34
35
history = model.fit(X_train, y_train, epochs=1,
36
validation_data =(X_valid, y_valid))
37
38
if not os.path.isdir('models'):
39
os.mkdir('models')
40
41
model.save('models/basic.h5')
42
with open('models/basic_history.pickle', 'wb') as f:
43
pickle.dump(history, f)
44
It gives me the following error:
JavaScript
1
5
1
Traceback (most recent call last):
2
File "main.py", line 69, in <module>
3
pickle.dump(history, f)
4
TypeError: can't pickle _thread._local objects
5
PS: To get the code to run, download the fashion_mnist data: https://s3.amazonaws.com/img-datasets/mnist.pkl.g
Advertisement
Answer
As Karl suggested, the history object cannot be pickled. But it’s dictionary can:
JavaScript
1
3
1
with open('models/basic_history.pickle', 'wb') as f:
2
pickle.dump(history.history, f)
3