12 Monate Crumbforest-Wachstum, sortiert nach Waldlogik. Struktur: - 454 Dokumente in 7 organischen Ebenen - Lichtung → Waldrand → Waldmitte → Wurzeln → Krone → Unterholz → Samen - INDEX.md für jede Ebene (eigene Stimme) - WALDKARTE.md (Master-Navigation) - crumbcodex.md (Das Versprechen zwischen Krümel & Bits) - lichtung/willkommen.md (Nullfeld-Einstieg für Kinder) Philosophie: - Waldlogik statt Ordnerlogik - Tiefe, Licht, Wurzeln - wie ein echter Wald - Schutz für Krümel, Tiefe für Gräber, Poesie für Atmende Repos verbunden: - OZM-Keks-Handbuch-v1 (Das Wissen) - Crumb-Core-v.1 (Das Herz) - 194.164.194.191 - crumbmissions (Das Spiel) Wuuuhuuuuu! 🦉✨
54 lines
1.4 KiB
Python
54 lines
1.4 KiB
Python
import tensorflow as tf
|
|
from tensorflow.keras.preprocessing.image import ImageDataGenerator
|
|
from tensorflow.keras.applications import MobileNetV2
|
|
from tensorflow.keras.layers import Dense, GlobalAveragePooling2D
|
|
from tensorflow.keras.models import Model
|
|
import os
|
|
|
|
# Datenpfad
|
|
data_dir = 'orchideen_data'
|
|
img_height, img_width = 224, 224
|
|
batch_size = 8
|
|
|
|
# Datengenerator
|
|
train_datagen = ImageDataGenerator(
|
|
rescale=1./255,
|
|
validation_split=0.2
|
|
)
|
|
|
|
train_generator = train_datagen.flow_from_directory(
|
|
data_dir,
|
|
target_size=(img_height, img_width),
|
|
batch_size=batch_size,
|
|
class_mode='categorical',
|
|
subset='training'
|
|
)
|
|
|
|
val_generator = train_datagen.flow_from_directory(
|
|
data_dir,
|
|
target_size=(img_height, img_width),
|
|
batch_size=batch_size,
|
|
class_mode='categorical',
|
|
subset='validation'
|
|
)
|
|
|
|
# Modell
|
|
base_model = MobileNetV2(weights='imagenet', include_top=False, input_shape=(img_height, img_width, 3))
|
|
x = base_model.output
|
|
x = GlobalAveragePooling2D()(x)
|
|
x = Dense(64, activation='relu')(x)
|
|
predictions = Dense(2, activation='softmax')(x)
|
|
|
|
model = Model(inputs=base_model.input, outputs=predictions)
|
|
|
|
# Basis-Modell einfrieren
|
|
for layer in base_model.layers:
|
|
layer.trainable = False
|
|
|
|
# Kompilieren und Trainieren
|
|
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
|
|
model.fit(train_generator, validation_data=val_generator, epochs=10)
|
|
|
|
# Speichern
|
|
model.save('orchideen_model.h5')
|