🔧 1. Python 3.12 + Keras 환경 세팅
필수 명령어:
pip install --upgrade pip
pip install tensorflow keras
✅ 이 조합이면 TensorFlow가 Keras의 백엔드로 자동 지정되어 작동함
🧩 2. Keras 구조 이해
항목 | 설명 |
---|---|
tensorflow.keras | ✅ 안정적인 공식 사용 방식 (TF 내장 Keras) |
import keras | 🔧 Keras Core 3.x (2023년 말부터 등장) |
keras.src.* | ❌ 내부 전용 경로. 직접 사용 금지 |
✅ 3. 코드 작성: 권장 방식 (TensorFlow 백엔드)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential([
Dense(10, activation='relu', input_shape=(4,)),
Dense(1, activation='sigmoid')
])
model.summary()
👍 이 방식은 Keras 버전 상관없이 항상 안전하고 유지보수도 잘 됩니다.
✅ 4. 코드 작성: Keras Core 방식 (원한다면)
import keras
model = keras.models.Sequential([
keras.layers.Dense(10, activation="relu"),
keras.layers.Dense(1, activation="sigmoid")
])
⚠️ 단, 이 방식은 백엔드를 명확히 설치하고 연결해야 함
⚠️ 5. 백엔드 관련 추가 설정 (선택)
Keras Core만 쓰고 TensorFlow/JAX/Torch 없이 실행하려 하면 에러 발생합니다. 백엔드가 없기 때문입니다.
- TensorFlow 백엔드:
pip install tensorflow
- PyTorch 백엔드:
pip install torch
- JAX 백엔드:
pip install jax jaxlib
설치된 백엔드 중 자동으로 하나가 선택되며, 특정 백엔드를 강제로 지정하려면
KERAS_BACKEND=tensorflow
환경 변수 설정 필요
📂 6. 커널 & PyCharm 설정 주의
PyCharm이나 Jupyter에서 실행 시에는 반드시 설치된 tensorflow
가 포함된 Python 환경이 선택되어야 합니다. 예:
which python
/usr/local/bin/python3.12
이 환경에 pip install tensorflow keras
가 되어 있어야 함
🛑 7. 피해야 할 것들
항목 | 이유 |
---|---|
pip install keras.layers | ❌ 존재하지 않음 |
from keras.src... | ❌ 내부 전용 |
Python 3.13 사용 | ❌ 아직 TF 미지원 |
TensorFlow 없이 keras 사용 | ❌ 백엔드 없음 에러 |
✅ 요약: 당신이 해야 할 단 3가지
- Python 3.12 환경 준비
→/usr/local/bin/python3.12
- 필수 설치
pip install tensorflow keras
- 코드는 항상 이렇게 씁니다:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
필요하시면 이걸 PDF나 .md
문서로도 정리해드릴 수 있어요. 어떤 형태로 정리해드릴까요? 아니… 틀린듯…
3.12 에서는 이런식으로 import 해서 써야 한다. 2025년 5월 기준으로 최신 버전 쓰시는 분들은 그냥 삽질 하면서 안정화를 기다린다고 생각하면 될 듯. 물고기가 아닌, 낚시하는 방법인 “생각의 방식”은 여기 남겨둠.
import keras
from keras.src.layers import Dense
from keras.src.utils import to_categorical
# from tensorflow.keras.models import Sequential
# from tensorflow.keras.layers import Dense
# 신경망 모델을 초기화
model = keras.Sequential()
# 6개의 노드가 있는 첫 번째 은닉 레이어를 추가합니다.
# Input_dim은 x_values 또는 입력 레이어의 수/특성 수를 나타냅니다.
# activation은 노드/뉴런이 활성화되는 방식을 나타냅니다. 우리는 relu를 사용할 것입니다. 다른 일반적인 활성화 방식은'sigmoid' 및 'tanh'입니다.
model.add(Dense(6, input_dim=4, activation='relu'))
# 6개의 노드가 있는 두 번째 은닉 레이어를 추가합니다.
model.add(Dense(6, activation='relu'))
# 3개의 노드가 있는 출력 레이어를 추가합니다.
# 사용된 activation은 'softmax'입니다. Softmax는 범주형 출력 또는 대상을 처리할 때 사용됩니다.
model.add(Dense(3,activation='softmax'))
# 모델을 컴파일합니다. optimizer는 모델 내에서 조정하는 방법을 의미합니다. loss은 예측된 출력과 실제 출력 간의 차이를 나타냅니다.
model.compile(optimizer='adam',loss='categorical_crossentropy',metrics=['accuracy'])
model.summary()
import pandas as pd
df = pd.read_csv("./datasets/iris_datasets.data",header=None)
names = ["sepal_length", "sepal_width","petal_length", "petal_width", "class"]
df.columns = names
print(df.head())
print(df.info())
print(df.describe())
# 각 클래스의 데이터 포인트 수 출력
print(df['class'].value_counts())
# 각기 다른 클래스에 대하여 다른 숫자를 지정한 딕셔너리
# 원-핫 인코딩으로 4개 열이 아닌 3개 열만 생성되도록 0부터 시작하는 값을 사용합니다.
label_encode = {"class": {"Iris-setosa":0, "Iris-versicolor":1, "Iris-virginica":2}}
# .replace를 사용하여 다른 클래스를 숫자로 변경
df.replace(label_encode,inplace=True)
# 각 클래스의 데이터 포인트 수를 출력하여 클래스가 숫자로 변경되었는지 확인
print(df['class'].value_counts())
# 클래스를 y_values로 추출
y_values = df['class']
# y_values 원-핫 인코딩
y_values = to_categorical(y_values)
print(y_values)
미니콘다 좋아요.
/Users/junhoha/miniconda3/bin/python /Users/junhoha/PycharmProjects/neural01.py
/Users/junhoha/miniconda3/lib/python3.12/site-packages/keras/src/layers/core/dense.py:87: UserWarning: Do not pass an input_shape
/input_dim
argument to a layer. When using Sequential models, prefer using an Input(shape)
object as the first layer in the model instead.
super().init(activity_regularizer=activity_regularizer, **kwargs)
Model: “sequential”
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┓
┃ Layer (type) ┃ Output Shape ┃ Param # ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━┩
│ dense (Dense) │ (None, 6) │ 30 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_1 (Dense) │ (None, 6) │ 42 │
├─────────────────────────────────┼────────────────────────┼───────────────┤
│ dense_2 (Dense) │ (None, 3) │ 21 │
└─────────────────────────────────┴────────────────────────┴───────────────┘
Total params: 93 (372.00 B)
Trainable params: 93 (372.00 B)
Non-trainable params: 0 (0.00 B)
sepal_length sepal_width petal_length petal_width class
0 5.1 3.5 1.4 0.2 Iris-setosa
1 4.9 3.0 1.4 0.2 Iris-setosa
2 4.7 3.2 1.3 0.2 Iris-setosa
3 4.6 3.1 1.5 0.2 Iris-setosa
4 5.0 3.6 1.4 0.2 Iris-setosa
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
# Column Non-Null Count Dtype
— —— ————– —–
0 sepal_length 150 non-null float64
1 sepal_width 150 non-null float64
2 petal_length 150 non-null float64
3 petal_width 150 non-null float64
4 class 150 non-null object
dtypes: float64(4), object(1)
memory usage: 6.0+ KB
None
sepal_length sepal_width petal_length petal_width
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.054000 3.758667 1.198667
std 0.828066 0.433594 1.764420 0.763161
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
class
Iris-setosa 50
Iris-versicolor 50
Iris-virginica 50
Name: count, dtype: int64
class
0 50
1 50
2 50
Name: count, dtype: int64
[[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[1. 0. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 1. 0.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]
[0. 0. 1.]]
sepal_length sepal_width petal_length petal_width
0 5.1 3.5 1.4 0.2
1 4.9 3.0 1.4 0.2
2 4.7 3.2 1.3 0.2
3 4.6 3.1 1.5 0.2
4 5.0 3.6 1.4 0.2
/Users/junhoha/PycharmProjects/SODOC/neural01.py:35: FutureWarning: Downcasting behavior in replace
is deprecated and will be removed in a future version. To retain the old behavior, explicitly call result.infer_objects(copy=False)
. To opt-in to the future behavior, set pd.set_option('future.no_silent_downcasting', True)
df.replace(label_encode,inplace=True)
Epoch 1/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step – accuracy: 0.3099 – loss: 1.1398
Epoch 2/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.2578 – loss: 1.1088
Epoch 3/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.3013 – loss: 1.0595
Epoch 4/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.3040 – loss: 1.0436
Epoch 5/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.3911 – loss: 0.9992
Epoch 6/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.4721 – loss: 0.9851
Epoch 7/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.4898 – loss: 0.9730
Epoch 8/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.5595 – loss: 0.9507
Epoch 9/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.5893 – loss: 0.9238
Epoch 10/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.6250 – loss: 0.8972
Epoch 11/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.6798 – loss: 0.8588
Epoch 12/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.6443 – loss: 0.8622
Epoch 13/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.6253 – loss: 0.8492
Epoch 14/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.6050 – loss: 0.8479
Epoch 15/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.6515 – loss: 0.8414
Epoch 16/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step – accuracy: 0.6329 – loss: 0.8297
Epoch 17/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.6676 – loss: 0.7994
Epoch 18/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 3ms/step – accuracy: 0.6694 – loss: 0.8008
Epoch 19/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.7367 – loss: 0.7361
Epoch 20/20
5/5 ━━━━━━━━━━━━━━━━━━━━ 0s 2ms/step – accuracy: 0.6756 – loss: 0.7583
종료 코드 0(으)로 완료된 프로세스
답글 남기기