

手書き数字の画像データセットはデフォルトでは1から10まであります。  
その中から1と2だけを取り出し、1と2の分類だけを行えるようにしたいです。

次のような手順で進めました。

・1と2の画像データ、画像ラベルを取り出す  
・取り出した画像データをリストに置き換え、画像データと画像ラベルをそれぞれ一つにまとめてからnumpy配列に戻す  
・適当な学習モデルを作り、出力を(2)にして学習を実行する

[code]

    from keras.models import Sequential
    from keras.layers import Activation, Dense
    from keras.layers import Conv2D, MaxPooling2D, Flatten
    import time
    
    import tensorflow as tf
    from tensorflow import keras
    from tensorflow.keras import layers
    import numpy as np
    
    from keras.datasets import mnist
    
    (x_train, t_train), (x_test, t_test) = mnist.load_data()
    
    #1と2の手書き数字の画像だけ取り出す
    x_train1,x_train2 = x_train[np.where(t_train==1)],x_train[np.where(t_train==2)]
    t_train1,t_train2 = t_train[np.where(t_train==1)],t_train[np.where(t_train==2)]
    
    #1と2の手書き数字の配列を、リストに変換する
    x_trainone = []
    x_traintwo = []
    
    for n1 in range(x_train1.shape[0]):
        x_trainone.append(x_train1[n1])
    
    for n2 in range(x_train2.shape[0]):
        x_traintwo.append(x_train2[n2])
        
    t_trainone = []
    t_traintwo = []
    
    for n3 in range(t_train1.shape[0]):
        t_trainone.append(t_train1[n3])
    
    for n4 in range(t_train2.shape[0]):
        t_traintwo.append(t_train2[n4])
        
    #1のリストと2のリストを足す
    x_trainall2 = x_trainone + x_traintwo
    t_trainall2 = t_trainone + t_traintwo
    
    #1と2が混ざった学習データのリストを配列に戻す
    
    x_trainall,t_trainall = np.array(x_trainall2),np.array(t_trainall2)
    
[/code]

[code]

    #テストデータも同様に行う
    x_test1,x_test2 = x_test[np.where(t_test==1)],x_test[np.where(t_test==2)]
    t_test1,t_test2 = t_test[np.where(t_test==1)],t_test[np.where(t_test==2)]
    
    #1と2の手書き数字の配列を、リストに変換する
    x_testone = []
    x_testtwo = []
    
    for n1 in range(x_test1.shape[0]):
        x_testone.append(x_test1[n1])
    
    for n2 in range(x_test2.shape[0]):
        x_testtwo.append(x_test2[n2])
        
    t_testone = []
    t_testtwo = []
    
    for n3 in range(t_test1.shape[0]):
        t_testone.append(t_test1[n3])
    
    for n4 in range(t_test2.shape[0]):
        t_testtwo.append(t_test2[n4])
        
    #1のリストと2のリストを足す
    x_testall2 = x_testone + x_testtwo
    t_testall2 = t_testone + t_testtwo
    
    #1と2が混ざった学習データのリストを配列に戻す
    
    x_testall,t_testall = np.array(x_testall2),np.array(t_testall2)
    
[/code]

[code]

    model = keras.Sequential()
    model.add(Conv2D(28,(3,3),strides=1,activation='sigmoid',input_shape=(28,28,1))) 
    model.add(Activation("relu"))
    model.add(Flatten())
    model.add(Dense(28)) 
    Activation("sigmoid")
    model.add(Dense(28)) 
    Activation("relu")
    model.add(Dense(2))
    Activation("softmax")
    model.compile(
        optimizer="adam",
        loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
        metrics=["accuracy"])
    model.summary()
    
[/code]

このようにコードを作った後、次のようにして学習を行いました

[code]

    model.fit(history = model.fit(x_trainall, t_trainall, epochs=10,batch_size=100))
    
[/code]

すると、

[code]

    Epoch 1/10
    2023-03-11 01:34:38: W tensorflow/core/framework/op_kernel] OP_REQUIRES failed at sparse_xent_op: INVALID_ARGUMENT: Received a label value of 2 which is outside the valid range of [0, 2).  Label values: 1 2 2 2 1 2 1 1 2 1 1 2 1 2 2 2 2 2 1 2 1 1 2 1 1 1 2 2 1 2 2 1
    ---------------------------------------------------------------------------
    InvalidArgumentError                      Traceback (most recent call last)
    Cell In[15], line 1
    ----> 1 model.fit(history = model.fit(x_trainall, t_trainall, epochs=10, 
          2                     validation_data=(x_testall, t_testall)))
    
    File ...<locals>.error_handler(*args, **kwargs)
         67     filtered_tb = _process_traceback_frames(e.__traceback__)
         68     # To get the full stack trace, call:
         69     # `tf.debugging.disable_traceback_filtering()`
    ---> 70     raise e.with_traceback(filtered_tb) from None
         71 finally:
         72     del filtered_tb
    
    File .... in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
         50 try:
         51   ctx.ensure_initialized()
    ---> 52   tensors = pywrap_tfe.TFE_Py_Execute(ctx._handle, device_name, op_name,
         53                                       inputs, attrs, num_outputs)
         54 except core._NotOkStatusException as e:
         55   if name is not None:
    
    InvalidArgumentError: Graph execution error:
    
[/code]

このようなエラーが出てしまいました。調べたところ、コンピュータの容量や処理能力の問題である可能性が高いと書かれていたのですが、sequentialの最後のDenseを2から10にして、もとの10種類の手書き数字を分類できるように戻したところ、エラーは起きませんでした。なのでコンピュータの性能の問題ではなく、コードのどこかが間違えているのが原因だと思うのですが、エラーの原因がわかりません。どこを直せばいいのでしょうか？


CC BY-SA 4.0
2023-03-10T17:19:33.807
94126
2023-03-12T06:17:04.090
43775
question
python 機械学習 tensorflow 深層学習 keras
手書き数字のMNISTデータから1と2のデータだけを学習させたい。


> Received a label value of 2 which is outside the valid range of [0, 2).

上記エラーメッセージよりラベルの値は「0」または「1」である必要があるかと思います。

* * *

【コメントを受けて追記】  
例えば下記のようにしてはどうでしょうか？

[code]

    #1と2の手書き数字の画像だけ取り出す
    x_train1,x_train2 = x_train[np.where(t_train==1)],x_train[np.where(t_train==2)]
    t_train1,t_train2 = t_train[np.where(t_train==1)],t_train[np.where(t_train==2)]
    t_train1 = t_train1 - 1
    t_train2 = t_train2 - 1
    
[/code]


CC BY-SA 4.0
2023-03-11T08:32:37.843
94130
2023-03-12T06:17:04.090
2023-03-12T06:17:04.090
39819
39819
94126
answer