世界没我不行 2020-04-26 15:07 采纳率: 66.7%
浏览 1131
已采纳

keras下用RNN中的lstm来进行图片分类,输入维数的错误

1.如题,我是在keras下用lstm来对本地文件夹中六类垃圾进行图片分类

这是我的部分代码:

(我本地的图片是512 ✖384的,进行resize为200✖160了)

nb_lstm_outputs = 128  #神经元个数
nb_time_steps = 200  #时间序列长度
nb_input_vector = 160 #输入序列

# 读取数据和标签
print("------开始读取数据------")
data = []
labels = []

# 拿到图像数据路径,方便后续读取
imagePaths = sorted(list(utils_paths.list_images('./dataset-resized')))
random.seed(42)
random.shuffle(imagePaths)

# 遍历读取数据
for imagePath in imagePaths:
    # 读取图像数据
    image = cv2.imread(imagePath)
    image = cv2.resize(image, (160,200))
    data.append(image)
    # 读取标签
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# 对图像数据做scale操作
data=np.array(data, dtype="float") / 255.0
labels = np.array(labels)

# 数据集切分
(trainX, testX, trainY, testY) = train_test_split(data,labels, test_size=0.25, random_state=42)

# 转换标签为one-hot encoding格式
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)
# 设置初始化超参数
EPOCHS = 5
BS = 71

以上就是我的数据预处理操作

下面是我构建的模型:


model = Sequential()
model.add(LSTM(units=nb_lstm_outputs, return_sequences=True,
              input_shape=(nb_time_steps, nb_input_vector)))  # returns a sequence of vectors of dimension 30
model.add(LSTM(units=nb_lstm_outputs, return_sequences=True))  # returns a sequence of vectors of dimension 30
model.add(LSTM(units=nb_lstm_outputs))  # return a single vector of dimension 30
model.add(Dense(1, activation='softmax'))
model.add(Dense(6, activation='softmax'))

adam=Adam(lr=1e-4)
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(trainX, trainY, 
          epochs = EPOCHS,
          batch_size = BS,
          verbose = 1, 
          validation_data = (testX,testY))

后续就是优化和生成loss等的代码了。

然而运行时遇到了以下维度错误:

图片说明

然后我我试着修改不同的尺寸,发现都有上述错误,感觉应该是维度错误,但是不太明白1895是怎么来的?

2.遇到上述维度问题后,不太清楚怎么解决,于是我将代码中读取图片cv2.imread,将图像进行了灰度化:

    image = cv2.imread(imagePath,CV2.IMREAD_GRAYSCALE)

调整后,代码可以运行,然而并未按照预先设定的Batchsize进行训练,而是直接以划分的整体比例进行训练,想请问下这是怎么回事?已经输入BS到batch_size的参数了

图片说明

所以想请问各位大神,怎么解决维度问题,还有就是为什么后面BS传进去不管用啊,有没有清楚怎么一回事的啊?

谢谢各位大神了!!是个小白QAQ谢谢!

  • 写回答

1条回答 默认 最新

  • threenewbee 2020-04-26 15:22
    关注

    lstm做图片分类?一般来说CNN才用来做图片分类。

    model.add(LSTM(units=nb_lstm_outputs, return_sequences=True,
    input_shape=(nb_time_steps, nb_input_vector))) # returns a sequence of vectors of dimension 30
    你的units是输出的维度,而且 input_shape 也不对。你图片哪里来的 timesteps

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月31日

悬赏问题

  • ¥30 类鸟群Boids——仿真鸟群避障的相关问题
  • ¥15 CFEDEM自带算例错误,如何解决?
  • ¥15 有没有会使用flac3d软件的家人
  • ¥20 360摄像头无法解绑使用,请教解绑当前账号绑定问题,
  • ¥15 docker实践项目
  • ¥15 数电几道习题,写出作答过程,ai一律不采用
  • ¥15 利用pthon计算薄膜结构的光导纳
  • ¥15 海康hlss视频流怎么播放
  • ¥15 Paddleocr:out of memory error on GPU
  • ¥30 51单片机C语言数码管驱动单片机为AT89C52