質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.06%

Pythonのmodel.compileでTypeError:Nonetypeが起きました。

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 278

前提・実現したいこと

Pythonで画像認識を用いてじゃんけんの手の形を判別するシステムをあるサイトで見つけて
サイトの通りに実行したところエラーが発生しました
■■な機能を実装中に以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-24-6c44726a183e> in <module>()
----> 1 model.compile(loss='categorical_crossentropy',optimizer='adam',metrics=['acc'])

C:\Anaconda3\envs\Sotsuken\lib\site-packages\keras\engine\training.py in compile(self, optimizer, loss, metrics, loss_weights, sample_weight_mode, weighted_metrics, target_tensors, **kwargs)
    227         #                   loss_weight_2 * output_2_loss_fn(...) +
    228         #                   layer losses.
--> 229         self.total_loss = self._prepare_total_loss(masks)
    230 
    231         # Functions for train, test and predict will

C:\Anaconda3\envs\Sotsuken\lib\site-packages\keras\engine\training.py in _prepare_total_loss(self, masks)
    690 
    691                     output_loss = loss_fn(
--> 692                         y_true, y_pred, sample_weight=sample_weight)
    693 
    694                 if len(self.outputs) > 1:

C:\Anaconda3\envs\Sotsuken\lib\site-packages\keras\losses.py in __call__(self, y_true, y_pred, sample_weight)
     71             losses = self.call(y_true, y_pred)
     72             return losses_utils.compute_weighted_loss(
---> 73                 losses, sample_weight, reduction=self.reduction)
     74 
     75     @classmethod

C:\Anaconda3\envs\Sotsuken\lib\site-packages\keras\utils\losses_utils.py in compute_weighted_loss(losses, sample_weight, reduction, name)
    164         # Update dimensions of `sample_weight` to match with `losses` if possible.
    165         losses, _, sample_weight = squeeze_or_expand_dimensions(
--> 166             losses, None, sample_weight)
    167 
    168         # Broadcast weights if possible.

C:\Anaconda3\envs\Sotsuken\lib\site-packages\keras\utils\losses_utils.py in squeeze_or_expand_dimensions(y_pred, y_true, sample_weight)
     74         if y_pred_rank == 0 and weights_rank == 1:
     75             y_pred = K.expand_dims(y_pred, -1)
---> 76         elif weights_rank - y_pred_rank == 1:
     77             sample_weight = K.squeeze(sample_weight, -1)
     78         elif y_pred_rank - weights_rank == 1:

TypeError: unsupported operand type(s) for -: 'int' and 'NoneType'

該当のソースコード

import keras
from keras import layers
from keras import models
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
import tensorflowjs as tfjs

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu',
                        input_shape=(100, 100, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(128, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Flatten())
model.add(layers.Dropout(0.5))
model.add(layers.Dense(512, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='adam',metrics=['acc'])

classes = ['zero', 'one', 'two', 'three', 'four',
           'five', 'seven', 'eight', 'nine']

train_dir = 'hand_sign_digit_data/train'
validation_dir = 'hand_sign_digit_data/validation'

train_datagen = ImageDataGenerator(
    rescale=1./255,
    rotation_range=40,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,)

test_datagen = ImageDataGenerator(rescale=1./255)

train_generator = train_datagen.flow_from_directory(
        train_dir,
        target_size=(100, 100),
        batch_size=32,
        class_mode='categorical')

validation_generator = test_datagen.flow_from_directory(
        validation_dir,
        target_size=(100, 100),
        batch_size=32,
        class_mode='categorical')

history = model.fit_generator(
      train_generator,
      steps_per_epoch=100,
      epochs=100,
      validation_data=validation_generator,
      validation_steps=10)

model.save('sign_language_vgg16_1.h5')

#convert the vgg16 model into tf.js model
save_path = '../nodejs/static/sign_language_vgg16'
tfjs.converters.save_keras_model(model, save_path)
print("[INFO] saved tf.js vgg16 model to disk..")

acc = history.history['acc']
val_acc = history.history['val_acc']
loss = history.history['loss']
val_loss = history.history['val_loss']

epochs = range(len(acc))

plt.plot(epochs, acc, 'bo', label='Training acc')
plt.plot(epochs, val_acc, 'b', label='Validation acc')
plt.title('Training and validation accuracy')
plt.legend()

plt.figure()

plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and validation loss')
plt.legend()

plt.show()

試したこと

ネット検索で1時間ほど調べたりしましたが、該当するサイトは見つからず、そのステップの前の指の本数を判別するシステムを動かしてみたところ、実行できました。

補足情報(FW/ツールのバージョンなど)

こちらが参考にしたサイトですが、そのまま動かそうとしてもmodel.compileでエラーが発生します。
https://book.mynavi.jp/manatee/detail/id=99768

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る