《Python深度學習》看到第七章,由于時間跨度較大,前面內(nèi)容有點記不太清楚了,好在演示代碼都挨著運行成功了一遍,也參照教程使用CNN寫了個簡單的驗證碼識別模型出來。
在使用tensorboard做可視化的過程中,遇到一些坑,在這里記錄下解決問題的心路歷程,后面換電腦的話也有個參考:
問題一:No module named 'google.protobuf.pyext'
解決方式: 管理員模式打開cmd :
pip install protobuf -i https://pypi.tuna.tsinghua.edu.cn/simple
當然pip源可以選個自己喜歡的。這個問題完全沒有必要寫的啊 但事實上確實困擾了我一兩個小時,之前總覺得是google包出了問題,怎么裝都沒法解決。尷尬,先掛到這里起警示作用吧!
問題二:Allocation of 6400000000 exceeds 10% of system memory.
啰嗦:之前單獨使用一維卷積訓練imdb的時候運行還比較正常,怎么添加了callback后就內(nèi)存不足了呢。看來使用tensorboard回調(diào)是一件占用內(nèi)存挺高的操作。回去對比了一下,演示代碼的max_features也比之前的大了一倍,難怪我的小內(nèi)存筆記本有點吃不消了。
解決方式:max_features = 500, 減少特征數(shù)量,從而減少網(wǎng)絡(luò)的大小。
對,這里還是把書中代碼修改的地方標注一下吧:
import keras
from keras import layers
from keras.datasets import imdb
from keras.preprocessing import sequence
max_features = 500 # 原文為2000
max_len = 500
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
x_train = sequence.pad_sequences(x_train, maxlen=max_len)
x_test = sequence.pad_sequences(x_test, maxlen=max_len)
model = keras.models.Sequential()
model.add(layers.Embedding(max_features, 128, input_length=max_len, name='embed'))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.MaxPooling1D(5))
model.add(layers.Conv1D(32, 7, activation='relu'))
model.add(layers.GlobalMaxPooling1D())
model.add(layers.Dense(1))
model.summary()
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
callbacks = [keras.callbacks.TensorBoard(
log_dir='my_log_dir',
histogram_freq=1,
embeddings_freq=1,
embeddings_data = x_train[:100].astype("float32")
)]
history = model.fit(x_train, y_train, epochs=20, batch_size=128, validation_split=0.2, callbacks=callbacks)
問題三:ValueError: To visualize embeddings, embeddings_data must be provided.
啰唆:字面意思應(yīng)該是回掉的TensorBoard類中沒有指定
embeddings_data的值,按理說這么經(jīng)典的書應(yīng)該不會出這種問題,可能是版本的差異吧。
解決方式:添加embeddings_data=x_train試試... 仍然會報錯,但是這次的錯誤比較明顯,embeddings_data需要是float類型的,而我們的x_train還是int32。使用astype轉(zhuǎn)換成float類型再次填寫參數(shù)。
見證奇跡的時刻終于到了~瀏覽器可以正常訪問 tensorboard,使用PCA計算出Embedding 的結(jié)果,結(jié)果大概就是下面的樣子(還是有些酷炫的嘛)。
