keras - форма ввода отличается от формы вывода предыдущего слоя - PullRequest
0 голосов
/ 07 мая 2020

Я преобразовал свою модель из Conv2D в простую DNN. Я мог как-то решить ошибку формы ввода / вывода. Но теперь моя модель дает безумные результаты - ужасные потери и нулевая точность. Может ли кто-нибудь помочь?

"""
trying hands on first ML program - 1D model
"""
import time
import numpy as np
# import matplotlib.pyplot as plt
import pandas as pd
import tensorflow as tf
import keras
from keras.models import Model
from keras.layers import Input, Dense, Activation
from keras.utils import to_categorical
from keras.optimizers import RMSprop
from numba import jit, cuda
start = time.time()

data = pd.read_csv(r"Pets_Data.csv", index_col='Date')
# data = data.reset_index(drop=False)
target = "Hippo"
filter = (data["Cats"] > 0) & (data[target] > 0)
total = data.where(filter).dropna().shape[0]
x_df = data.where(filter).dropna()
y_df = pd.DataFrame(data=x_df, columns=[target], copy=True)
x_df = x_df.drop(target, axis=1)
# input_shape = x_df.shape[1]

Train_ratio = 0.8
train_x = x_df[:int(total * Train_ratio)]
train_y = y_df[:int(total * Train_ratio)]

x = np.array(train_x, copy='True', order='K').flatten(order='C')
y = np.array(train_y, copy='True', order='K').flatten(order='C')

# tr_x = to_categorical(x,959)
# tr_y = to_categorical(y,959)

test_x = np.array(x_df[int(total * Train_ratio):], copy='True', order='K')#.flatten(order='C')
test_y = np.array(y_df[int(total * Train_ratio):], copy='True', order='K')#.flatten(order='C')

# x_test_new = to_categorical(test_x, 240)
# y_test_new = to_categorical(test_y,240)

inputs = Input(shape=(43,))
output_1 = Dense(256, activation='relu')(inputs)
output_2 = Dense(128, activation='relu')(output_1)
predictions = Dense(959, activation ='softmax')(output_2)

# Build the model
model = Model(inputs=inputs, outputs=predictions)
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) #loss='mean_squared_error'
model.summary()

jit(target='cuda')
# Fit the model
model.fit(train_x, train_y, epochs=100, batch_size=43, verbose=1)  # starts training
end = time.time()
print(f"time taken : {end-start:.4f} seconds.")

# Evaluate model
score = model.evaluate(test_x, test_y, batch_size=None)
print(f"loss on test: {score[0]*100:>6.2f}%, accuracy {score[1]*100:>6.2f}% ")
endtime = time.time()
print(f"time taken : {endtime-start:>6,.4f} seconds")

'' '


Layer (type) Output Shape Param #

input_1 (InputLayer) (None, 43) 0


плотный_1 (Плотный) (Нет, 256) 11264


Плотный_2 (Плотный) (Нет, 128) 32896


Плотный_3 (Плотный) (Нет, 959) 123711

Всего параметров: 167 871 Обучаемые параметры: 167 871 Необучаемые параметры: 0 ... 959/959 [================= =============] - 0 с 69 мкс / шаг - потеря: 5,9462 - точность: 0,0010 Эпоха 41/50 959/959 [=============== ===============] - 0 с 66 мкс / шаг - потеря: 5,9270 - точность: 0,0010 эпоха 42/50 959/959 [============= =================] - 0 с 68 мкс / шаг - потеря: 5,9081 - точность: 0,0010 Эпоха 43/50 959/959 [=========== ===================] - 0 с 68 мкс / шаг - потеря: 5,8894 - точность: 0,0010 эпоха 44/50 959/959 [========= =====================] - 0 с 68 мкс / шаг - потеря: 5,8709 - точность: 0,0010 эпоха 45/50 959/959 [======= =======================] - 0 с 68 мкс / шаг - потеря: 5,8526 - точность: 0,0010 эпоха 4 6/50 959/959 [==============================] - 0 с 67 мкс / шаг - потеря: 5,8346 - точность: 0,0010 эпохи 47/50 959/959 [==============================] - 0 с 64 мкс / шаг - потеря: 5,8168 - точность: 0,0010 Эпоха 48/50 959/959 [==============================] - 0 с 70 мкс / шаг - потеря: 5,7992 - точность: 0,0010 эпохи 49/50 959/959 [==============================] - 0 с 63 мкс / шаг - потеря: 5,7818 - точность: 0,0010 Эпоха 50/50 959/959 [==============================] - 0s 64us / шаг - потеря: 5,7646 - точность: 0,0010 затраченное время: 3,9185 секунды. 240/240 [==============================] - 0 с 154 мкс / потеря шага при тестировании: 595,13%, точность 0,00% затраченное время: 3,9664 секунды

1 Ответ

0 голосов
/ 07 мая 2020

вы говорите, что у вас есть только числовые c данные (1199 строк по 43 функции в каждой) и нет изображений. Но в своей модели вы используете 2D-свертки, которые обычно используются для изображений. Вы также указываете input_shape вашего первого слоя как 839x43. Я понимаю, потому что 839 - это 1199 * 0,7 этажа. Но это означает, что ваша модель будет видеть, что вы вводите как одно изображение, а не 839 разных экземпляров, каждый из которых имеет 43 функции. Вы можете использовать для своей задачи одномерные свертки или только плотные слои.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...