Up 「メモリのパンク」に対する考慮 作成: 2021-04-28
更新: 2021-04-28


    画像データセットの構築では,「メモリのパンク」に対する考慮が必要になる。
    今回は,微小な画像が3つだけなので,all_image の構築を経由するつぎのやり方でも,image_ds をつくることができる。
    しかし,画像サイズが標準的で枚数も多いときは,all_image の構築はメモリをパンクさせてしまう。

      >>> def load_and_preprocess_image(path): ... image_raw = tf.io.read_file(path) ... image_tensor = tf.image.decode_image(image_raw, channels=3) ... image_final = tf.image.resize(image_tensor, [3, 3]) ... image_final /= 255.0 ... return image_final ... >>> all_images = [] >>> for path in all_image_paths: ... image = def load_and_preprocess_image(path) ... all_images.append(image) ... >>> all_images [<tf.Tensor: shape=(3, 3, 3), dtype=float32, numpy= array([[[0.3098039 , 0.28235292, 0.25098038], [0.5424836 , 0.5555555 , 0.52941173], [0.4339869 , 0.45359474, 0.43006533]], [[0.29019606, 0.27843136, 0.2117647 ], [0.49281043, 0.4575163 , 0.2980392 ], [0.40653595, 0.32418302, 0.20261437]], [[0.2588235 , 0.23137254, 0.12156862], [0.496732 , 0.38692808, 0.20392156], [0.42614383, 0.33594772, 0.17124183]]], dtype=float32)>, <tf.Tensor: shape=(3, 3, 3), dtype=float32, numpy= array([[[0.7333333 , 0.772549 , 0.8705882 ], [0.69019604, 0.7098039 , 0.7843137 ], [0.6823529 , 0.7215686 , 0.7294117 ]], [[0.4954248 , 0.620915 , 0.77385616], [0.4954248 , 0.5464052 , 0.669281 ], [0.44183004, 0.448366 , 0.47843134]], [[0.5581699 , 0.66405225, 0.8405228 ], [0.5973856 , 0.67581695, 0.7816993 ], [0.5437909 , 0.53594774, 0.54771245]]], dtype=float32)>, <tf.Tensor: shape=(3, 3, 3), dtype=float32, numpy= array([[[0.4705882 , 0.36470586, 0.18039215], [0.496732 , 0.38039213, 0.21437907], [0.3215686 , 0.2732026 , 0.14640522]], [[0.41568625, 0.3490196 , 0.23137254], [0.4980392 , 0.45620912, 0.3215686 ], [0.34640518, 0.3307189 , 0.2457516 ]], [[0.45490193, 0.47450978, 0.45098037], [0.55032676, 0.55163395, 0.51241827], [0.40130717, 0.38169932, 0.34248364]]], dtype=float32)>] >>> image_ds = \ ... tf.data.Dataset.from_tensor_slices(all_images) >>> image_ds <DatasetV1Adapter shapes: (3, 3, 3), types: tf.float32>

    データセットの画像は,画素数 3x3 で,全部で3枚。
    ウィンドウのキャンバスを3行1列に等分し,画像3枚を上から下へ順に置いていく。
      >>> import matplotlib.pyplot as plt >>> for n,image in enumerate(image_ds): ... plt.subplot(3,1,n+1) ... plt.imshow(image) ... plt.grid(False) ... plt.xticks([]) ... plt.yticks([]) ... plt.show() ... <ul> <xmp>>>> for n,image in enumerate(image_ds.take(3)): ... plt.subplot(3,1,n+1) ... plt.imshow(image) ... plt.grid(False) ... plt.xticks([]) ... plt.yticks([]) ... plt.show() ... <AxesSubplot:> <matplotlib.image.AxesImage object at 0x51740310> ([], []) ([], []) (画像のウィンドウが開く)
      ウィンドウを閉じる <AxesSubplot:> <matplotlib.image.AxesImage object at 0x5cfd50d0> ([], []) ([], []) (画像のウィンドウが開く)
      ウィンドウを閉じる <AxesSubplot:> <matplotlib.image.AxesImage object at 0x692a0b70> ([], []) ([], []) (画像のウィンドウが開く)
      ウィンドウを閉じる >>>

      画像表示におけるウィンドウサイズ