import tensorflow as tf from tensorflow.keras.optimizers import RMSprop from tensorflow.keras.preprocessing.image import ImageDataGenerator from sklearn.model_selection import train_test_split import os !wget --no-check-certificate \ https://dicodingacademy.blob.core.windows.net/picodiploma/ml_pemula_academy/rockpaperscissors.zip \ -O /tmp/rockpaperscissors.zip import zipfile local_zip = '/tmp/rockpaperscissors.zip' zip_ref = zipfile.ZipFile(local_zip,'r') zip_ref.extractall('/tmp') zip_ref.close() base_dir ='/tmp/rockpaperscissors/rps-cv-images' os.listdir(base_dir) base_dir='/tmp/rockpaperscissors' train_dir=os.path.join(base_dir,'train') validation_dir=os.path.join(base_dir,'validation') rock_dir=os.path.join(base_dir,'rock') paper_dir=os.path.join(base_dir,'paper') scissor_dir=os.path.join(base_dir,'scissors') os.mkdir(train_dir) os.mkdir(validation_dir) train_rock=os.path.join(train_dir,'rock') train_paper=os.path.join(train_dir,'paper') train_scissor=os.path.join(train_dir,'scissor') val_rock=os.path.join(validation_dir,'rock') val_paper=os.path.join(validation_dir,'paper') val_scissor=os.path.join(validation_dir,'scissor') os.mkdir(train_rock) os.mkdir(train_paper) os.mkdir(train_scissor) os.mkdir(val_rock) os.mkdir(val_paper) os.mkdir(val_scissor) #split data rock dengan proporsi 60 40 antara train dan validation train_rock_dir,val_rock_dir=train_test_split(os.listdir(rock_dir), test_size=0.4) #split data paper dengan proporsi 60 40 antara train dan validation train_paper_dir,val_paper_dir=train_test_split(os.listdir(paper_dir), test_size=0.4) #split data scissor dengan proporsi 60 40 antara train dan validation train_scissor_dir,val_scissors_dir=train_test_split(os.listdir(scissor_dir),test_size=0.4) import tensorflow as tf print(tf.__version__) base_dir='/tmp/rockpaperscissors' train_dir=os.path.join(base_dir,'train') val_dir=os.path.join(base_dir,'validation') os.listdir(train_dir) os.listdir(val_dir) #membuat directory rock pada direktori data training train_rock_dir=os.path.join(train_dir,'rock') #membuat directory paper pada directory data training train_paper_dir=os.path.join(train_dir,'paper') #membuat directory scissor pada directory data training train_scissor_dir=os.path.join(train_dir,'scissors') #membuat directory rock pada directory data validasi val_rock_dir=os.path.join(val_dir,'rock') #membuat directory paper pada directory data validasi val_paper_dir=os.path.join(val_dir,'paper') #membuat directory scissor pada directory data validasi val_scissors_dir=os.path.join(val_dir,'scissor') from tensorflow.keras.preprocessing.image import ImageDataGenerator train_datagen=ImageDataGenerator( rescale=1./255, rotation_range=20, horizontal_flip=True, shear_range=0.2, fill_mode='wrap', validation_split=0.4) test_datagen=ImageDataGenerator( rescale=1./255, rotation_range=20, horizontal_flip=True, shear_range=0.2, fill_mode='wrap', validation_split=0.4) train_generator=train_datagen.flow_from_directory( base_dir, target_size=(150,150), class_mode='categorical', shuffle=True, subset='training' ) validation_generator=test_datagen.flow_from_directory( base_dir, target_size=(150,150), class_mode='categorical', shuffle=True, subset='validation', ) model = tf.keras.models.Sequential([ tf.keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(150, 150, 3)), tf.keras.layers.MaxPooling2D(2, 2), tf.keras.layers.Conv2D(64, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Conv2D(128, (3,3), activation='relu'), tf.keras.layers.MaxPooling2D(2,2), tf.keras.layers.Flatten(), tf.keras.layers.Dense(512, activation='relu'), tf.keras.layers.Dense(3, activation='softmax') ]) # compile model dengan 'adam' optimizer loss function 'categorical_crossentropy' model.compile(loss='categorical_crossentropy', optimizer=tf.optimizers.Adam(), metrics=['accuracy']) # latih model dengan model.fit model.fit( train_generator, steps_per_epoch=25, # berapa batch yang akan dieksekusi pada setiap epoch epochs=20, # tambahkan eposchs jika akurasi model belum optimal validation_data=validation_generator, # menampilkan akurasi pengujian data validasi validation_steps=5, # berapa batch yang akan dieksekusi pada setiap epoch verbose=2)