Вы не можете напрямую загрузить файл в Google Cloud Storage с помощью функции python open
(которая используется matplotlib.pyplot.savefig
за кулисами).
Вместо этого вам следует использовать клиентскую библиотеку облачного хранилища * 1003 для Python . Проверьте эту документацию для получения подробной информации об использовании этой библиотеки. Это, среди прочего, позволит вам манипулировать файлами и загружать / скачивать их в GCS.
Вам нужно будет импортировать эту библиотеку, чтобы использовать ее, вы можете установить ее, запустив pip install google-cloud-storage
и импортировать ее как from google.cloud import storage
.
Кроме того, поскольку plt.figure
является объектом, а не фактическим .png
изображением, которое вы хотите загрузить, вы также не можете напрямую загрузить его в Google Cloud Storage.
Однако вы можете выполнить одно из следующих действий:
Вариант 1 : сохранить изображение локально, а затем загрузить его в облачное хранилище Google:
Используя ваш код:
from google.cloud import storage
def saving_figure(path_logdir):
data = np.arange(0, 21, 2)
fig = plt.figure(figsize=(20, 10))
plt.plot(data)
fig.savefig("your_local_path/accuracy_loss_graph.png".format(path_logdir))
plt.close()
# init GCS client and upload file
client = storage.Client()
bucket = client.get_bucket('skin_cancer_mnist')
blob = bucket.blob('logs/20190116-195604/accuracy_loss_graph.png') # This defines the path where the file will be stored in the bucket
your_file_contents = blob.upload_from_filename(filename="your_local_path/accuracy_loss_graph.png")
Вариант 2 : сохранить результат изображения из рисунка в переменную, а затем загрузить его в GCS в виде строки (в байтах):
Я нашел следующий ответ StackOverflow, который, кажется, сохраняет изображение фигуры в байтовую строку .png
, однако я сам не пробовал.
Опять же, исходя из вашего кода:
from google.cloud import storage
import io
import urllib, base64
def saving_figure(path_logdir):
data = np.arange(0, 21, 2)
fig = plt.figure(figsize=(20, 10))
plt.plot(data)
fig_to_upload = plt.gcf()
# Save figure image to a bytes buffer
buf = io.BytesIO()
fig_to_upload.savefig(buf, format='png')
buf.seek(0)
image_as_a_string = base64.b64encode(buf.read())
# init GCS client and upload buffer contents
client = storage.Client()
bucket = client.get_bucket('skin_cancer_mnist')
blob = bucket.blob('logs/20190116-195604/accuracy_loss_graph.png') # This defines the path where the file will be stored in the bucket
your_file_contents = blob.upload_from_string(image_as_a_string, content_type='image/png')
Редактировать : в обоих вариантах предполагается, что в среде, в которой вы запускаете сценарий, установлен Cloud SDK и активирована аутентифицированная учетная запись Google Cloud (если вы этого не сделали, вы можете проверить эту документацию , которая объясняет, как это сделать).