【问题标题】:Jupyter Notebook and MatPlotLib Not Plotting Keras ResultsJupyter Notebook 和 MatPlotLib 不绘制 Keras 结果
【发布时间】:2019-12-27 23:55:17
【问题描述】:

我正在使用 Anaconda 1.9.7 安装的 Jupyter Notebook 来运行使用 Tensorflow、Keras、Python 3.x 和 Matplotlib 的机器学习模型。当我从 Mac 上的终端运行代码时,一切运行良好,并且图表被绘制到外部窗口。当我在 Jupyter Notebook 中运行相同的代码时,内核会在代码第一次使用 Matplotlib 时死掉并重新启动。

最初,我没有使用“%matplotlib inline”,所以我将它添加到顶部,但图表仍然没有显示。我创建了一个简单的用例(不是此处提供的机器学习代码)并将图表内联到 Jupyter Notebook。当我从 Mac 上的终端运行当前代码时,它可以正常运行,并且图形显示到外部窗口。

get_ipython().run_line_magic('matplotlib', 'inline')


import tensorflow as tf

from keras.datasets import reuters

import numpy as np

np_load_old = np.load

np.load = lambda *a,**k: np_load_old(*a, allow_pickle=True, **k)


(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words=10000)

np.load = np_load_old

word_index = reuters.get_word_index()

reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])

decoded_newswire = ' '.join([reverse_word_index.get(i - 3, '?') for i in train_data[10]])

decoded_newswire

def vectorize_sequences(sequences, dimension=10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1
    return results

x_train = vectorize_sequences(train_data)

x_test = vectorize_sequences(test_data)

from keras.utils.np_utils import to_categorical

one_hot_train_labels = to_categorical(train_labels)

one_hot_test_labels = to_categorical(test_labels)

from keras import models

from keras import layers

model = models.Sequential()

model.add(layers.Dense(64, activation='relu', input_shape=(10000,)))

model.add(layers.Dense(64, activation='relu'))

model.add(layers.Dense(46, activation='softmax'))

model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])

x_val = x_train[:1000]

partial_x_train = x_train[1000:]

y_val = one_hot_train_labels[:1000]

partial_y_train = one_hot_train_labels[1000:]

history = model.fit(partial_x_train, partial_y_train, epochs=3, batch_size=512, validation_data=(x_val, y_val))

loss = history.history['loss']

val_loss = history.history['val_loss']

epochs = range(1, len(loss) + 1)

import matplotlib.pyplot as plt

plt.title('Training and validation loss')

plt.xlabel('Epochs')

plt.ylabel('Loss')

plt.legend()

plt.plot(epochs, loss, 'bo', label='Training loss')

plt.plot(epochs, val_loss, 'b', label='Validation loss')

plt.show()

我希望最后一行在 Jupyter Notebook 中内联绘制图形。相反,内核在“plt.title('Training and validation loss')”行中死亡,当我独立运行该行时,它会给出错误“NameError:name 'plt' is not defined。”

【问题讨论】:

  • 我唯一不同的是使用%matplotlib inline 而不是get_ipython().run_line_magic('matplotlib', 'inline')。但我在该行之后导入plt
  • 我实际上在 Jupyter Notebook 中使用了“%matplotlib inline”。为了将代码插入这篇文章,我将 Notebook 导出为 .py,并且“%matplotlib inline”被翻译为“get_ipython().run_line_magic('matplotlib', 'inline')。”

标签: python-3.x matplotlib keras jupyter-notebook anaconda


【解决方案1】:

我尝试了您的代码并稍作修改:

  • 注释掉了以下几行:
    • np_load_old = np.load
    • np.load = lambda *a, **l: np_load_old ...
    • np.load = np_load_old

它奏效了。我得到了以下情节:

我的版本是:

  • 张量流 1.13.1
  • matplotlib 3.1.1
  • jupyter 1.0.0
  • python 3.6.6

【讨论】:

  • 我使用的是 tensorflow 1.13.1、matplotlib 3.1.0、jupyter 6.0.0 和 3.7.3。当我评论这些行时,我在尝试下载路透社数据时得到“ValueError:当allow_pickle = False时无法加载对象数组”。我添加了这些 cmets 来解决这个问题。您的系统上的“allow_pickle”是如何配置的?
  • 什么是 numpy 版本?我的是 1.16.4。根据this,我认为默认是真的。
  • 也试试这个:np.load(path, allow_pickle) 其中allow_pickle 是一个布尔值。 source
  • 我找到的这个参考资料here 指出allow_pickle 默认设置为false。我在当前实现中通过布尔值成功地将 allow_pickle 设置为 true。 Jupyter Notebook 和 matplotlib 之间存在一些不兼容,我不确定 numpy 是如何发挥作用的。如果我通过 Mac 上的终端运行代码,则代码可以完美运行。
  • 我将我的 numpy 版本降级到 1.16.2,这让我可以注释掉 np.load 行,但问题仍然存在。
猜你喜欢
  • 2017-05-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多