SHOW:
|
|
- or go back to the newest paste.
| 1 | - | # Сделайте предобработку данных: поделите значения яркости на 255. Для этого передайте специальный аргумент в загрузчик ImageDataGenerator (найдите в документации), в котором будет указано, что делить нужно на 255. |
| 1 | + | '''Постройте и обучите нейронную сеть на наборе данных с предметами одежды. Для этого создайте в коде три функции: |
| 2 | - | # Создавать и обучать модель не нужно. На экране напечатайте значения пикселей изображения из первого батча обучающей выборки. |
| 2 | + | загрузки обучающей выборки load_train(), |
| 3 | создания модели create_model(), | |
| 4 | - | from tensorflow.keras.preprocessing.image import ImageDataGenerator |
| 4 | + | запуска модели train_model(). |
| 5 | Добейтесь того, чтобы значение accuracy на тестовой выборке было не меньше 85%. | |
| 6 | - | datagen = ImageDataGenerator(validation_split=0.25, rescale=1/255) |
| 6 | + | Отправьте ваш код в файле с расширением .py . |
| 7 | ||
| 8 | - | train_datagen_flow = datagen.flow_from_directory( |
| 8 | + | Подсказка |
| 9 | - | '/datasets/fruits_small/', |
| 9 | + | |
| 10 | - | target_size=(150, 150), |
| 10 | + | Приведите значения пикселей к диапазону [0, 1]. |
| 11 | - | batch_size=16, |
| 11 | + | Попробуйте: |
| 12 | - | class_mode='sparse', |
| 12 | + | Построить полносвязную сеть с 2 или 3 слоями; |
| 13 | - | subset='training', |
| 13 | + | Применить активацию ReLU. |
| 14 | - | seed=12345) |
| 14 | + | ''' |
| 15 | ||
| 16 | - | val_datagen_flow = datagen.flow_from_directory( |
| 16 | + | |
| 17 | - | '/datasets/fruits_small/', |
| 17 | + | import numpy as np |
| 18 | - | target_size=(150, 150), |
| 18 | + | from tensorflow.keras import layers |
| 19 | - | batch_size=16, |
| 19 | + | from tensorflow.keras.layers import Conv2D, Flatten, Dense, AvgPool2D, MaxPooling2D |
| 20 | - | class_mode='sparse', |
| 20 | + | from tensorflow.keras.models import Sequential |
| 21 | - | subset='validation', |
| 21 | + | from tensorflow.keras.optimizers import Adam |
| 22 | - | seed=12345) |
| 22 | + | from tensorflow.keras.datasets import fashion_mnist |
| 23 | ||
| 24 | - | features, target = train_datagen_flow.next() |
| 24 | + | |
| 25 | - | print(features[0]) |
| 25 | + | def load_train(path): |
| 26 | features_train = np.load(path + 'train_features.npy') | |
| 27 | target_train = np.load(path + 'train_target.npy') | |
| 28 | features_train = features_train.reshape(features_train.shape[0], 28 * 28) / 255. | |
| 29 | return features_train, target_train | |
| 30 | ||
| 31 | ||
| 32 | def create_model(input_shape): | |
| 33 | model = Sequential() | |
| 34 | ||
| 35 | model.add(Dense(units=500, input_shape=input_shape, activation="relu")) | |
| 36 | model.add(Dense(units=300, activation="relu")) | |
| 37 | model.add(Dense(units=10, activation='softmax')) | |
| 38 | return model | |
| 39 | ||
| 40 | ||
| 41 | def train_model(model, train_data, test_data, batch_size=48, epochs=50, | |
| 42 | steps_per_epoch=None, validation_steps=None): | |
| 43 | optimizer = Adam(lr=0.01) | |
| 44 | model.compile(optimizer=optimizer, loss='sparse_categorical_crossentropy', | |
| 45 | metrics=['acc']) | |
| 46 | features_train, target_train = train_data | |
| 47 | features_test, target_test = test_data | |
| 48 | model.fit(features_train, target_train, | |
| 49 | validation_data=(features_test, target_test), | |
| 50 | batch_size=batch_size, epochs=epochs, | |
| 51 | steps_per_epoch=steps_per_epoch, | |
| 52 | validation_steps=validation_steps, | |
| 53 | verbose=2, shuffle=True) | |
| 54 | ||
| 55 | return model | |
| 56 | ||
| 57 | ||
| 58 | '''Epoch 50/50 | |
| 59 | 60000/60000 - 4s - loss: 0.3248 - acc: 0.8857 - val_loss: 0.4960 - val_acc: 0.8511 | |
| 60 | 10000/10000 - 1s - loss: 0.4960 - acc: 0.8511 | |
| 61 | ''' | |
| 62 |