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

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日

悬赏问题

  • ¥15 数值计算离散正交多项式
  • ¥30 数值计算均差系数编程
  • ¥15 redis-full-check比较 两个集群的数据出错
  • ¥15 Matlab编程问题
  • ¥15 训练的多模态特征融合模型准确度很低怎么办
  • ¥15 kylin启动报错log4j类冲突
  • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
  • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
  • ¥15 onvif+openssl,vs2022编译openssl64
  • ¥15 iOS 自定义输入法-第三方输入法