【问题标题】:Training model for image classifier on RockPaperScissors.zip file using Tensorflow and Keras使用 Tensorflow 和 Keras 在 RockPaperScissors.zip 文件上训练图像分类器
【发布时间】:2020-07-12 19:12:43
【问题描述】:

我尝试为 RockPaperScissors.zip 文件制作图像分类器,但在训练模型时遇到了麻烦。这是我的代码:

import tensorflow as tf
from tensorflow import keras
from keras import layers
from tensorflow.keras.optimizers import SGD
from tensorflow.keras.preprocessing.image import ImageDataGenerator

!wget --no-check-certificate \
  https://dicodingacademy.blob.core.windows.net/picodiploma/ml_pemula_academy/rockpaperscissors.zip \
  -O /tmp/rockpaperscissors.zip

import zipfile,os
local_zip = '/tmp/rockpaperscissors.zip'
zip_ref = zipfile.ZipFile(local_zip, 'r')
zip_ref.extractall('/tmp')
zip_ref.close()

base_dir = '/tmp/rockpaperscissors'
train_dir = os.path.join(base_dir, 'rps-cv-images')
validation_dir = os.path.join(base_dir, 'rps-cv-images')

os.listdir('/tmp/rockpaperscissors/rps-cv-images')

train_rock_dir = os.path.join(train_dir, 'rock')
train_paper_dir = os.path.join(train_dir, 'paper')
train_scissors_dir = os.path.join(train_dir, 'scissors')
validation_rock_dir = os.path.join(validation_dir, 'rock')
validation_paper_dir = os.path.join(validation_dir, 'paper')
validation_scissors_dir = os.path.join(validation_dir, 'scissors')

train_datagen = ImageDataGenerator(
        rescale=1./255,
        rotation_range=90,
        horizontal_flip=True,
        shear_range = 0.2,
        zoom_range = 0.2,
        validation_split = 0.2,
        fill_mode = 'nearest')

train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(100, 100),
        batch_size=9,
        color_mode = 'rgb',
        shuffle=True,
        subset = 'training',
        class_mode = 'categorical')

validation_generator = train_datagen.flow_from_directory(
        validation_dir,
        target_size=(100, 100),
        batch_size=9,        
        color_mode = 'rgb',
        shuffle=False,
        subset = 'validation',
        class_mode = 'categorical')

model = tf.keras.models.Sequential([
    tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(100, 100, 3)),
    tf.keras.layers.MaxPooling2D(2, 2),
    tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
    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(256, (3,3), activation='relu'),
    tf.keras.layers.MaxPooling2D(2,2),
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(1, activation='softmax')
])

model.compile(loss ='categorical_crossentropy',
              optimizer= tf.optimizers.Adam(),
              metrics= tf.metrics.Accuracy()
)

model.fit(
    train_generator,
    steps_per_epoch=25,
    epochs=15,
    validation_data=validation_generator,
    validation_steps=5,
    verbose=2)

当我尝试训练我的模型时,它显示 InvalidArgumentError: Matrix size-incompatible: In[0]: [9,3], In[1]: [512,1] [[node gradient_tape/sequential_2/dense_5/MatMul (定义于:5)]] [Op:__inference_train_function_8077]函数调用堆栈:train_function。请帮忙

【问题讨论】:

    标签: tensorflow image-processing keras keras-layer conv-neural-network


    【解决方案1】:

    您需要首先考虑您想要实现的目标。您手头的任务是将图像分类为三个不同的类别,即石头、纸或剪刀。

    所以,你的最后一层应该有三个神经元,每个类一个。所以最后一层会如下:

    tf.keras.layers.Dense(3, activation='softmax')
    

    我在我的盒子上运行了它,你的代码应该运行这个更改。

    【讨论】:

    • @Fairuz Amira 如果解决方案对您有所帮助,我建议将解决方案标记为已接受,以便其他人可以从答案中受益。
    猜你喜欢
    • 2021-01-20
    • 2017-06-08
    • 1970-01-01
    • 2020-10-05
    • 2019-02-02
    • 2019-09-21
    • 1970-01-01
    • 2020-09-16
    • 2017-11-28
    相关资源
    最近更新 更多