[카테고리:] 미분류

  • Python 3.12에서의 Keras / TensorFlow 사용법


    🔧 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가지

    1. Python 3.12 환경 준비
      /usr/local/bin/python3.12
    2. 필수 설치
    pip install tensorflow keras
    
    1. 코드는 항상 이렇게 씁니다:
    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(으)로 완료된 프로세스