@kenji_shimosato

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

CNNでの2値分類の際にreshapeに関するエラーが出てしまう.

解決したいこと

CNNで2値分類する際に,エラーをはいてしまいます.
reshapeの問題だと思うのですが全く分からず...教えていただけると幸いです.

発生している問題・エラー

Input to reshape is a tensor with 800 values, but the requested shape has 32
	 [[{{node ArithmeticOptimizer/ReorderCastLikeAndValuePreserving_bool_Reshape}}]] [Op:__inference_train_function_6805]

該当するソースコード

import numpy as np
from sklearn import svm
from sklearn.metrics import confusion_matrix
from keras.models import Sequential
from keras.layers import Dense, Dropout
import matplotlib.pyplot as plt
from keras.layers.convolutional import Conv1D, UpSampling1D
from keras.layers.pooling import MaxPooling1D
from keras.callbacks import EarlyStopping

epochs = 100

samples = np.loadtxt('train.txt', delimiter=',')
samples_label = samples[:, 0].astype(int)
samples_data = samples[:, 1:101]

print(samples_label.shape)
print(samples_data.shape)

samples_label = np.reshape(samples_label, (-1, 1, 1))
samples_data = np.reshape(samples_data, (-1, 100, 1))
print(samples_label.shape)
print(samples_data.shape)
early_stopping = EarlyStopping(monitor='val_loss', min_delta=0.0, patience=5)

model = Sequential()
model.add(Conv1D(100, 8, padding='same', input_shape=(100, 1), activation='relu'))
model.add(MaxPooling1D(2, padding='same'))
model.add(Conv1D(100, 8, padding='same', activation='relu'))
model.add(MaxPooling1D(2, padding='same'))
model.add(Conv1D(50, 8, padding='same', activation='relu'))
model.add(Conv1D(1, 8, padding='same', activation='tanh'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
model.summary()

history = model.fit(samples_data, samples_label, validation_split=0.1, epochs=epochs)
plt.plot(range(epochs), history.history['loss'], label='loss')
plt.plot(range(epochs), history.history['val_loss'], label='val_loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend() 
plt.show()
0 likes

1Answer

次のように2行追加してください.

+  from keras.layers import Flatten
   model = Sequential()
   model.add(Conv1D(100, 8, padding='same', input_shape=(100, 1), activation='relu'))
   model.add(MaxPooling1D(2, padding='same'))
   model.add(Conv1D(100, 8, padding='same', activation='relu'))
   model.add(MaxPooling1D(2, padding='same'))
   model.add(Conv1D(50, 8, padding='same', activation='relu'))
   model.add(Conv1D(1, 8, padding='same', activation='tanh'))
+  model.add(Flatten())
   model.add(Dense(2, activation='softmax'))

最後のConv1Dの時点でoutput.shape = (None, 25, 1)となっており,その次のDenseoutput.shape = (None, 25, 2)となることは,model.summary()からも確認ができると思います.

sample_label.shapeの状態を見るからに,(None, 1, 1)であることから一致せず,Kerasが無理やりreshapeしようとしてエラーになります.

Denseがチャネル方向に全結合を行ったので,そうでないシーケンス長の方向には結合されず,(None, 25, 2)となっていることを回避するために,Flatten()を挿入して1次元に平滑化して解決します.

1Like

Comments

  1. 1次元に平滑化しなければいけなかったのですね...ありがとうございました.

Your answer might help someone💌