라이브러리를 가져다 쓰면서 함수 내부는 보통 에러가 발생했을 때, 함수의 어느 부분에서 에러가 발생했다는 메시지를 통해 함수 내부 코드를 확인하면서 종종 들여다보게 됩니다.
어떻게 동작하는 건지 에러 코드가 가져다 주기 전에 먼저 공부해보고 싶다면 inspect 모듈로 확인이 가능합니다.
import tensorflow as tf
import inspect
print(inspect.getsource(tf.keras.preprocessing.image.img_to_array))
지금 작성하던 코드에서 아무 함수나 긁어왔습니다. 불러온 img 파일을 편집할 수 있게 array로 바꿔주는 케라스 함수네요.
실행하면 상태창에 바로 출력이 됩니다.
@keras_export(
"keras.utils.img_to_array", "keras.preprocessing.image.img_to_array"
)
def img_to_array(img, data_format=None, dtype=None):
"""Converts a PIL Image instance to a Numpy array.
Usage:
```python
from PIL import Image
img_data = np.random.random(size=(100, 100, 3))
img = tf.keras.utils.array_to_img(img_data)
array = tf.keras.utils.image.img_to_array(img)
```
Args:
img: Input PIL Image instance.
data_format: Image data format, can be either `"channels_first"` or
`"channels_last"`. Defaults to `None`, in which case the global
setting `tf.keras.backend.image_data_format()` is used (unless you
changed it, it defaults to `"channels_last"`).
dtype: Dtype to use. Default to `None`, in which case the global setting
`tf.keras.backend.floatx()` is used (unless you changed it, it
defaults to `"float32"`).
Returns:
A 3D Numpy array.
Raises:
ValueError: if invalid `img` or `data_format` is passed.
"""
if data_format is None:
data_format = backend.image_data_format()
if dtype is None:
dtype = backend.floatx()
if data_format not in {"channels_first", "channels_last"}:
raise ValueError(f"Unknown data_format: {data_format}")
# Numpy array x has format (height, width, channel)
# or (channel, height, width)
# but original PIL image has format (width, height, channel)
x = np.asarray(img, dtype=dtype)
if len(x.shape) == 3:
if data_format == "channels_first":
x = x.transpose(2, 0, 1)
elif len(x.shape) == 2:
if data_format == "channels_first":
x = x.reshape((1, x.shape[0], x.shape[1]))
else:
x = x.reshape((x.shape[0], x.shape[1], 1))
else:
raise ValueError(f"Unsupported image shape: {x.shape}")
return x
Process finished with exit code 0
활용예시, 인자, 반환값, 에러 케이스등을 설명하고 있습니다.
결과물을 빠르게 만들려 함수들을 바쁘게 가져다 쓰다 보면 내부는 들여다볼 생각을 못하게 되는데, 틈틈이 보면서 원리를 이해하며 넘어가면 좋을 것 같습니다.
도움이 됐으면 좋겠습니다.
감사합니다.
'Language > Python' 카테고리의 다른 글
TabError: inconsistent use of tabs and spaces in indentation 에러 (0) | 2023.08.28 |
---|